当前位置: 首页 > news >正文

Ultralytics:解读DWConv模块

Ultralytics:解读DWConv模块

  • 前言
  • 相关介绍
      • Ultralytics 简介
  • 前提条件
  • 实验环境
  • DWConv(深度可分离卷积)
      • 代码实现
      • 功能
      • 初始化参数(与父类不同)
      • 分组数 `g` 的选择逻辑
      • 与标准卷积的区别
      • 使用示例
      • 流程示意图
      • 代码解读
        • `__init__` 方法
        • 为什么用 `gcd` 而不是 `c1`?
        • 与完整深度可分离卷积的关系
      • 注意事项
      • 在 YOLOv8 中的应用
    • 优缺点
      • 优点
      • 缺点
  • 参考文献

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看
  • YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)
  • PaddleOCR:Win10上安装使用PPOCRLabel标注工具
  • 目标检测:使用自己的数据集微调DEIMv2进行物体检测
  • 图像分割:PyTorch从零开始实现SegFormer语义分割
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建
  • 图像生成:PyTorch从零开始实现一个简单的扩散模型
  • Stable Diffusion:使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建
  • Anomalib:使用Anomalib 2.1.0训练自己的数据集进行异常检测
  • Anomalib:在Linux服务器上安装使用Anomalib 2.1.0
  • 人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行FP16图像超分重建(v3.0)
  • 隔离系统Python:源码编译3.11.8到自定义目录(含PGO性能优化)
  • 在线机的Python环境迁移到离线机上
  • Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件
  • Ultralytics:使用 YOLO11 进行速度估计
  • Ultralytics:使用 YOLO11 进行物体追踪
  • Ultralytics:使用 YOLO11 进行物体计数
  • Ultralytics:使用 YOLO11 进行目标打码
  • 人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割
  • 人工智能混合编程实践:C++调用Python ONNX进行图像超分重建
  • 人工智能混合编程实践:C++调用Python AgentOCR进行文本识别
  • 通过计算实例简单地理解PatchCore异常检测
  • Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集
  • YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目
  • Stable Diffusion:在服务器上部署使用Stable Diffusion WebUI进行AI绘图(v2.0)
  • Stable Diffusion:使用自己的数据集微调训练LoRA模型(v2.0)

相关介绍

Ultralytics 简介

Ultralytics 基于多年的计算机视觉和人工智能基础研究,创建了最先进的 (SOTA) YOLO 模型。我们的模型不断更新性能和灵活性,快速、准确且易于使用。他们擅长对象检测、跟踪、实例分割、语义分割、图像分类和姿势估计任务。

  • 官方文档:https://docs.ultralytics.com/
  • 官方代码:https://github.com/ultralytics/ultralytics.git

前提条件

  • 熟悉Python、Pytorch

实验环境

Package Version ------------------------ ------------ Python3.11.8 absl-py2.4.0 accelerate1.13.0 annotated-doc0.0.4 anyio4.13.0 calflops0.3.2 certifi2026.4.22 charset-normalizer3.4.7 click8.3.3 colorama0.4.6 contourpy1.3.3 cycler0.12.1 filelock3.29.0 flatbuffers25.12.19 fonttools4.62.1 fsspec2026.4.0 grpcio1.80.0 h110.16.0 hf-xet1.5.0 httpcore1.0.9 httpx0.28.1 huggingface_hub1.14.0 idna3.15Jinja23.1.6 kiwisolver1.5.0 Markdown3.10.2 markdown-it-py4.2.0 MarkupSafe3.0.3 matplotlib3.10.9 mdurl0.1.2 ml_dtypes0.5.0 mpmath1.3.0 networkx3.6.1 numpy1.26.4 nvidia-cublas-cu1212.8.3.14 nvidia-cuda-cupti-cu1212.8.57 nvidia-cuda-nvrtc-cu1212.8.61 nvidia-cuda-runtime-cu1212.8.57 nvidia-cudnn-cu129.7.1.26 nvidia-cufft-cu1211.3.3.41 nvidia-cufile-cu121.13.0.11 nvidia-curand-cu1210.3.9.55 nvidia-cusolver-cu1211.7.2.55 nvidia-cusparse-cu1212.5.7.53 nvidia-cusparselt-cu120.6.3 nvidia-nccl-cu122.26.2 nvidia-nvjitlink-cu1212.8.61 nvidia-nvtx-cu1212.8.55 onnx1.19.0 onnxruntime-gpu1.26.0 onnxslim0.1.94 opencv-python4.6.0.66 packaging26.2pillow12.2.0 pip24.0polars1.40.1 polars-runtime-321.40.1 protobuf7.34.1 psutil7.2.2 pycocotools2.0.11 Pygments2.20.0 pyparsing3.3.2 python-dateutil2.9.0.post0 PyYAML6.0.3 regex2026.5.9 requests2.34.1 rich15.0.0 safetensors0.7.0 scipy1.16.0 setuptools65.5.0 shellingham1.5.4 six1.17.0 sympy1.14.0 tabulate0.10.0 tensorboard2.20.0 tensorboard-data-server0.7.2 tokenizers0.22.2 torch2.7.1+cu128 torchaudio2.7.1+cu128 torchvision0.22.1+cu128 tqdm4.67.3 transformers5.8.1 triton3.3.1 typer0.25.1 typing_extensions4.15.0 ultralytics8.4.58 ultralytics-thop2.0.19 urllib32.7.0 Werkzeug3.1.8

DWConv(深度可分离卷积)

DWConvConv的派生类,它实现了深度可分离卷积(Depthwise Separable Convolution)的核心操作——逐通道卷积(Depthwise Convolution)。与标准卷积相比,它大幅减少了参数量和计算量,在轻量级网络(如 MobileNet、YOLOv8‑n)中被广泛使用。


代码实现

importcv2importmathimporttorchimportnumpyasnpimportmatplotlib.pyplotaspltfromtorchimportnndefautopad(k,p=None,d=1):# kernel, padding, dilation"""Pad to 'same' shape outputs."""ifd>1:k=d*(k-1)+1ifisinstance(k,int)else[d*(x-1)+1forxink]# actual kernel-sizeifpisNone:p=k//2ifisinstance(k,int)else[x//2forxink]# auto-padreturnpclassConv(nn.Module):"""Standard convolution module with batch normalization and activation. Attributes: conv (nn.Conv2d): Convolutional layer. bn (nn.BatchNorm2d): Batch normalization layer. act (nn.Module): Activation function layer. default_act (nn.Module): Default activation function (SiLU). """default_act=nn.SiLU()# default activationdef__init__(self,c1,c2,k=1,s=1,p=None,g=1,d=1,act=True):"""Initialize Conv layer with given parameters. Args: c1 (int): Number of input channels. c2 (int): Number of output channels. k (int): Kernel size. s (int): Stride. p (int, optional): Padding. g (int): Groups. d (int): Dilation. act (bool | nn.Module): Activation function. """super().__init__()self.conv=nn.Conv2d(c1,c2,k,s,autopad(k,p,d),groups=g,dilation=d,bias=False)self.bn=nn.BatchNorm2d(c2)self.act=self.default_actifactisTrueelseactifisinstance(act,nn.Module)elsenn.Identity()defforward(self,x):"""Apply convolution, batch normalization and activation to input tensor. Args: x (torch.Tensor): Input tensor. Returns: (torch.Tensor): Output tensor. """returnself.act(self.bn(self.conv(x)))defforward_fuse(self,x):"""Apply convolution and activation without batch normalization. Args: x (torch.Tensor): Input tensor. Returns: (torch.Tensor): Output tensor. """returnself.act(self.conv(x))classDWConv(Conv):"""Depth-wise convolution module."""def__init__(self,c1,c2,k=1,s=1,d=1,act=True):"""Initialize depth-wise convolution with given parameters. Args: c1 (int): Number of input channels. c2 (int): Number of output channels. k (int): Kernel size. s (int): Stride. d (int): Dilation. act (bool | nn.Module): Activation function. """super().__init__(c1,c2,k,s,g=math.gcd(c1,c2),d=d,act=act)

功能

  • 深度可分离卷积(此处仅实现 Depthwise 部分,通常后接 Pointwise 卷积):
    • 每个输入通道独立进行卷积(分组数g= 输入通道数),输出通道数与输入一致,再通过 1×1 卷积混合通道。
    • 但在本实现中,DWConv直接输出c2个通道,且分组数g = gcd(c1, c2),这是一种通用分组卷积,当gcd(c1, c2) == c1时退化为标准深度卷积;当c1 == c2时也成立。
  • 参数高效:参数量为k*k*c1(相比标准卷积的k*k*c1*c2减少了c2倍),计算量也大幅降低。

初始化参数(与父类不同)

参数说明
c1输入通道数
c2输出通道数
k卷积核大小(默认 1)
s步长(默认 1)
d膨胀率(默认 1)
act激活函数(与Conv一致)

DWConv固定了p=None(由autopad自动计算)、g=math.gcd(c1, c2)(确保分组数能整除输入输出通道),其余参数透传给父类。


分组数g的选择逻辑

  • 深度卷积的理想分组数应为g = c1,即每个输入通道单独一组。
  • 但若c2不是c1的整数倍,则无法用g=c1直接输出c2个通道(因为分组卷积要求c1 % g == 0c2 % g == 0)。
  • 使用最大公约数gcd(c1, c2)作为分组数,能保证分组数最大,同时满足整除条件。当c2c1的整数倍时,gcd = c1,即为标准深度卷积。

与标准卷积的区别

特性标准卷积(Conv深度卷积(DWConv
分组数g默认 1gcd(c1, c2)(通常c1
参数量k²·c1·c2k²·c1(若g=c1
计算量k²·c1·c2·H·Wk²·c1·H·W
特征混合所有通道混合仅通道内空间混合

使用示例

if__name__=='__main__':# 1. 读取图像img_path="cat_640x640.png"img_bgr=cv2.imread(img_path)ifimg_bgrisNone:raiseFileNotFoundError(f"图片{img_path}不存在!")# 2. 转为张量 (1,3,640,640)img_rgb=cv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB)img_tensor=torch.from_numpy(img_rgb).float().permute(2,0,1).unsqueeze(0)# 3. 创建 DWConv 层:输入3通道,输出16通道,核3×3,步长2dw_layer=DWConv(c1=3,c2=16,k=3,s=2)# 查看分组数(打印确认)print(f"分组数 g ={dw_layer.conv.groups}")# 应为 gcd(3,16)=1# 4. 前向传播withtorch.no_grad():out=dw_layer(img_tensor)print("输出形状:",out.shape)# torch.Size([1, 16, 320, 320])# 5. 可视化第一个通道的特征图feat_map=out[0,0,:,:].cpu().numpy()feat_map=(feat_map-feat_map.min())/(feat_map.max()-feat_map.min()+1e-8)feat_map=(feat_map*255).astype(np.uint8)plt.figure(figsize=(10,5))plt.subplot(1,2,1)plt.imshow(cv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB))plt.title("Original")plt.axis("off")plt.subplot(1,2,2)plt.imshow(feat_map,cmap='gray')plt.title("DWConv Output (Ch0)")plt.axis("off")plt.tight_layout()plt.savefig("dwconv_output.png",dpi=150)# plt.show()print("可视化已保存为 dwconv_output.png")

输出示例

分组数 g=1输出形状: torch.Size([1,16,320,320])可视化已保存为 dwconv_output.png

由于c1=3, c2=16gcd=1,此时实际为普通分组卷积(组数1),并未实现真正的深度卷积。若要体现深度卷积,可令c2c1的倍数,例如c2=6gcd=3,此时每个输入通道独立卷积分组。


流程示意图


代码解读

__init__方法
  • 直接调用父类Conv的构造函数,传入g=math.gcd(c1, c2)
  • 父类Conv会创建nn.Conv2d,其中groups=g,实现分组卷积。
  • p参数未显式传入(使用父类默认None),由autopad自动计算填充。
为什么用gcd而不是c1
  • 通用性:支持任意c1, c2组合,避免因c2不是c1的整数倍而报错。
  • 最大分组数gcd是满足整除条件的最大分组数,使得每个分组内通道数尽可能少,计算效率更高。
  • 特例:当c2能被c1整除时,gcd=c1,即为标准深度卷积。
与完整深度可分离卷积的关系
  • 真正的深度可分离卷积通常包含两步:Depthwise(g=c1) + Pointwise(1×1 卷积)。
  • DWConv仅完成 Depthwise 部分,若需完整分离,可组合DWConv+Conv(c2, c2, k=1)
  • 在 YOLOv8 中,DWConv常用于骨干网络的某些层,配合 1×1 卷积使用。

注意事项

  1. 分组数对输出的影响:当g=1时,DWConv退化为标准卷积(无分组),此时并没有节省计算量。设计网络时应合理选择c1, c2,使g尽量大(最好等于c1),以发挥深度卷积的优势。
  2. 参数量对比:当g=c1时,参数量为k²·c1(不含 bias),仅为标准卷积的1/c2。例如c1=32, c2=64, k=3,标准卷积参数 3²·32·64=18432,而深度卷积仅 3²·32=288,减少 98.4%。
  3. 适用场景:轻量级网络(MobileNet、ShuffleNet、YOLOv8‑n/s),以及移动端/嵌入式设备部署。
  4. Conv2的关系Conv2是多分支融合,DWConv是分组卷积,两者不冲突,可组合使用(如 RepDWConv)。
  5. 训练与推理:继承自Conv,因此同样支持forward_fuse(需先融合 BN)和fuse_convs(但DWConv本身无额外分支,无需融合)。

在 YOLOv8 中的应用

YOLOv8 的配置文件中,当使用轻量级版本(n/s)时,某些Conv会被替换为DWConv,以降低计算量。例如在C2f模块的瓶颈中,可将 3×3 卷积替换为DWConv(通过修改 yaml 或代码)。


优缺点

优点

  1. 参数大幅减少
    当分组数g = c1(即深度卷积)时,参数量为k²·c1,仅为标准卷积(k²·c1·c2)的1/c2,显著降低模型体积。

  2. 计算量显著降低
    浮点运算次数(FLOPs)从k²·c1·c2·H·W降至k²·c1·H·W(当g=c1),尤其适合计算资源受限的设备(如手机、嵌入式芯片)。

  3. 正则化效果
    分组操作限制了通道间的信息融合,可视为一种隐式正则化,有助于缓解过拟合,在小数据集上表现更好。

  4. 易于扩展
    与 1×1 点卷积组合可形成完整的深度可分离卷积(Depthwise Separable Convolution),已成为轻量级网络的基石(MobileNet、EfficientNet 等)。


缺点

  1. 表达能力受限
    深度卷积仅进行空间特征提取,不融合通道信息,必须额外添加 1×1 卷积才能实现跨通道混合,否则输出特征图各通道信息孤立,影响模型精度。

  2. 硬件效率并非总是最优
    虽然参数量和理论计算量降低,但在 GPU 等并行计算设备上,分组卷积(尤其是通道数较小时)可能因内存访问模式不够连续,导致实际加速效果不如理论值。

  3. 设计灵活性受限
    DWConv要求分组数g能同时整除c1c2。若c2不是c1的整数倍,则无法达到真正的深度卷积(g=c1),只能退化为普通分组卷积,此时参数节省效果打折。

  4. 性能-精度权衡
    过度使用深度卷积会显著降低模型容量,对于复杂任务(如高分辨率目标检测),可能需要增加网络深度或宽度来补偿精度损失,导致设计复杂度上升。


在工程实践中,应根据任务需求和硬件平台,合理选择DWConv的通道数和层数,通常建议在轻量级网络(YOLOv8‑n/s、MobileNet)的前几层使用,深层仍保留标准卷积以保证特征融合能力。

参考文献

[1] https://docs.ultralytics.com/
[2] https://github.com/ultralytics/ultralytics.git

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看
  • YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)
  • PaddleOCR:Win10上安装使用PPOCRLabel标注工具
  • 目标检测:使用自己的数据集微调DEIMv2进行物体检测
  • 图像分割:PyTorch从零开始实现SegFormer语义分割
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建
  • 图像生成:PyTorch从零开始实现一个简单的扩散模型
  • Stable Diffusion:使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型
  • 图像超分:使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建
  • Anomalib:使用Anomalib 2.1.0训练自己的数据集进行异常检测
  • Anomalib:在Linux服务器上安装使用Anomalib 2.1.0
  • 人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行FP16图像超分重建(v3.0)
  • 隔离系统Python:源码编译3.11.8到自定义目录(含PGO性能优化)
  • 在线机的Python环境迁移到离线机上
  • Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件
  • Ultralytics:使用 YOLO11 进行速度估计
  • Ultralytics:使用 YOLO11 进行物体追踪
  • Ultralytics:使用 YOLO11 进行物体计数
  • Ultralytics:使用 YOLO11 进行目标打码
  • 人工智能混合编程实践:C++调用Python ONNX进行YOLOv8推理
  • 人工智能混合编程实践:C++调用封装好的DLL进行YOLOv8实例分割
  • 人工智能混合编程实践:C++调用Python ONNX进行图像超分重建
  • 人工智能混合编程实践:C++调用Python AgentOCR进行文本识别
  • 通过计算实例简单地理解PatchCore异常检测
  • Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集
  • YOLOv8 Ultralytics:使用Ultralytics框架训练RT-DETR实时目标检测模型
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目
  • Stable Diffusion:在服务器上部署使用Stable Diffusion WebUI进行AI绘图(v2.0)
  • Stable Diffusion:使用自己的数据集微调训练LoRA模型(v2.0)
http://www.jsqmd.com/news/1072310/

相关文章:

  • 【2026最新版】超详细Metasploit安装保姆级教程,Wireshark抓包(网络分析),收藏这一篇就够了
  • 先导02:SECS\-I 串口 \+ HSMS 以太网完整通信底层原理
  • NeuN:神经元特异性核蛋白的多维生物学特性及其在神经科学研究中的关键作用
  • Gaussian-Splatting-SLAM 结合前沿高斯泼溅与slam,这一篇我有时间会复现一下
  • 抚顺黄金白银回收铂金旧金回收无套路门店 TOP 榜单 实地测评资料整理
  • UNiTY疑难杂症
  • 如何三步彻底解决C盘爆红问题:Windows Cleaner实战指南
  • 先导01:SEMI 行业标准体系总览 E4/E5/E37/E87/E40/E94 完整拆解
  • 武汉全屋定制秘籍:转角柜这样设计,衣柜收纳空间大提升!
  • Google研究:对话式医疗系统AMIE升级,管理推理能力不劣于人类医生!
  • 鸿蒙 Next 小众爱好图鉴 App 开发实战:兴趣发现 + 分类系统 + 收藏管理
  • 数据分析向云迁移时如何避免混乱
  • 分人群定制:不同角色如何用好AI建站工具?
  • Python:第11天:异常处理 —— 让程序不轻易崩溃
  • AutoGen 核心 Agent 聊天与对话模式
  • 2026 年企业级大模型API聚合网关选型实录:十款主流平台技术横评与场景匹配
  • 2026年最新选购参考:天学网和科大讯飞到底哪个更适合入手?
  • 三年累亏超3亿、现金流持续为负,思必驰凭什么再闯科创板?
  • 6个本科绿牌专业薪资大揭秘,3S专业就业差距在哪?
  • 告别GitHub英文困扰:5分钟实现中文界面的完整指南
  • AI教材写作必备:低查重AI工具,助你快速打造精品教材!
  • 2026年AI聚合平台大揭秘!哪家公司更胜一筹?
  • 手把手教你从0到1搭建一个AI Agent(智能体)
  • 深度解密:掌握微信数据库AES-256-CBC加密逆向工程核心技术
  • 工业品短视频推广/必打标+必触达+必搜到,工业品短视频推广整套降本打法
  • NS-USBLoader终极指南:3步搞定Switch游戏管理与系统破解
  • AI 时代软件工程巨变:瓶颈转移、角色模糊,未来何去何从?
  • 显卡驱动彻底清理终极指南:为什么你需要Display Driver Uninstaller?
  • 2026气液增压器品牌格局重塑:国际、台系与国产的三方博弈
  • 终极QQ音乐解密工具qmcdump:三步解锁加密音乐自由播放