Ultralytics:解读DWConv模块

Ultralytics:解读DWConv模块 Ultralytics解读DWConv模块前言相关介绍Ultralytics 简介前提条件实验环境DWConv深度可分离卷积代码实现功能初始化参数与父类不同分组数 g 的选择逻辑与标准卷积的区别使用示例流程示意图代码解读__init__ 方法为什么用 gcd 而不是 c1与完整深度可分离卷积的关系注意事项在 YOLOv8 中的应用优缺点优点缺点参考文献前言由于本人水平有限难免出现错漏敬请批评改正。更多精彩内容可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看YOLOs-CPP一个免费开源的YOLO全系列C推理库以YOLO26为例PaddleOCRWin10上安装使用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训练自己的数据集足球检测YOLOv5TensorRT加速YOLOv5模型推理YOLOv5IoU、GIoU、DIoU、CIoU、EIoU玩转Jetson Nano五TensorRT加速YOLOv5目标检测YOLOv5添加SE、CBAM、CoordAtt、ECA注意力机制YOLOv5yolov5s.yaml配置文件解读、增加小目标检测层Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集YOLOv5使用7.0版本训练自己的实例分割模型车辆、行人、路标、车道线等实例分割使用Kaggle GPU资源免费体验Stable Diffusion开源项目Stable Diffusion在服务器上部署使用Stable Diffusion WebUI进行AI绘图v2.0Stable 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.1cu128 torchaudio2.7.1cu128 torchvision0.22.1cu128 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.8DWConv深度可分离卷积DWConv是Conv的派生类它实现了深度可分离卷积Depthwise Separable Convolution的核心操作——逐通道卷积Depthwise Convolution。与标准卷积相比它大幅减少了参数量和计算量在轻量级网络如 MobileNet、YOLOv8‑n中被广泛使用。代码实现importcv2importmathimporttorchimportnumpyasnpimportmatplotlib.pyplotaspltfromtorchimportnndefautopad(k,pNone,d1):# kernel, padding, dilationPad to same shape outputs.ifd1:kd*(k-1)1ifisinstance(k,int)else[d*(x-1)1forxink]# actual kernel-sizeifpisNone:pk//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_actnn.SiLU()# default activationdef__init__(self,c1,c2,k1,s1,pNone,g1,d1,actTrue):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.convnn.Conv2d(c1,c2,k,s,autopad(k,p,d),groupsg,dilationd,biasFalse)self.bnnn.BatchNorm2d(c2)self.actself.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,k1,s1,d1,actTrue):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,gmath.gcd(c1,c2),dd,actact)功能深度可分离卷积此处仅实现 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卷积核大小默认 1s步长默认 1d膨胀率默认 1act激活函数与Conv一致DWConv固定了pNone由autopad自动计算、gmath.gcd(c1, c2)确保分组数能整除输入输出通道其余参数透传给父类。分组数g的选择逻辑深度卷积的理想分组数应为g c1即每个输入通道单独一组。但若c2不是c1的整数倍则无法用gc1直接输出c2个通道因为分组卷积要求c1 % g 0且c2 % g 0。使用最大公约数gcd(c1, c2)作为分组数能保证分组数最大同时满足整除条件。当c2是c1的整数倍时gcd c1即为标准深度卷积。与标准卷积的区别特性标准卷积Conv深度卷积DWConv分组数g默认 1gcd(c1, c2)通常c1参数量k²·c1·c2k²·c1若gc1计算量k²·c1·c2·H·Wk²·c1·H·W特征混合所有通道混合仅通道内空间混合使用示例if__name____main__:# 1. 读取图像img_pathcat_640x640.pngimg_bgrcv2.imread(img_path)ifimg_bgrisNone:raiseFileNotFoundError(f图片{img_path}不存在)# 2. 转为张量 (1,3,640,640)img_rgbcv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB)img_tensortorch.from_numpy(img_rgb).float().permute(2,0,1).unsqueeze(0)# 3. 创建 DWConv 层输入3通道输出16通道核3×3步长2dw_layerDWConv(c13,c216,k3,s2)# 查看分组数打印确认print(f分组数 g {dw_layer.conv.groups})# 应为 gcd(3,16)1# 4. 前向传播withtorch.no_grad():outdw_layer(img_tensor)print(输出形状:,out.shape)# torch.Size([1, 16, 320, 320])# 5. 可视化第一个通道的特征图feat_mapout[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,cmapgray)plt.title(DWConv Output (Ch0))plt.axis(off)plt.tight_layout()plt.savefig(dwconv_output.png,dpi150)# plt.show()print(可视化已保存为 dwconv_output.png)输出示例分组数 g1输出形状: torch.Size([1,16,320,320])可视化已保存为 dwconv_output.png由于c13, c216gcd1此时实际为普通分组卷积组数1并未实现真正的深度卷积。若要体现深度卷积可令c2为c1的倍数例如c26→gcd3此时每个输入通道独立卷积分组。流程示意图代码解读__init__方法直接调用父类Conv的构造函数传入gmath.gcd(c1, c2)。父类Conv会创建nn.Conv2d其中groupsg实现分组卷积。p参数未显式传入使用父类默认None由autopad自动计算填充。为什么用gcd而不是c1通用性支持任意c1, c2组合避免因c2不是c1的整数倍而报错。最大分组数gcd是满足整除条件的最大分组数使得每个分组内通道数尽可能少计算效率更高。特例当c2能被c1整除时gcdc1即为标准深度卷积。与完整深度可分离卷积的关系真正的深度可分离卷积通常包含两步Depthwisegc1 Pointwise1×1 卷积。DWConv仅完成 Depthwise 部分若需完整分离可组合DWConvConv(c2, c2, k1)。在 YOLOv8 中DWConv常用于骨干网络的某些层配合 1×1 卷积使用。注意事项分组数对输出的影响当g1时DWConv退化为标准卷积无分组此时并没有节省计算量。设计网络时应合理选择c1, c2使g尽量大最好等于c1以发挥深度卷积的优势。参数量对比当gc1时参数量为k²·c1不含 bias仅为标准卷积的1/c2。例如c132, c264, k3标准卷积参数 3²·32·6418432而深度卷积仅 3²·32288减少 98.4%。适用场景轻量级网络MobileNet、ShuffleNet、YOLOv8‑n/s以及移动端/嵌入式设备部署。与Conv2的关系Conv2是多分支融合DWConv是分组卷积两者不冲突可组合使用如 RepDWConv。训练与推理继承自Conv因此同样支持forward_fuse需先融合 BN和fuse_convs但DWConv本身无额外分支无需融合。在 YOLOv8 中的应用YOLOv8 的配置文件中当使用轻量级版本n/s时某些Conv会被替换为DWConv以降低计算量。例如在C2f模块的瓶颈中可将 3×3 卷积替换为DWConv通过修改 yaml 或代码。优缺点优点参数大幅减少当分组数g c1即深度卷积时参数量为k²·c1仅为标准卷积k²·c1·c2的1/c2显著降低模型体积。计算量显著降低浮点运算次数FLOPs从k²·c1·c2·H·W降至k²·c1·H·W当gc1尤其适合计算资源受限的设备如手机、嵌入式芯片。正则化效果分组操作限制了通道间的信息融合可视为一种隐式正则化有助于缓解过拟合在小数据集上表现更好。易于扩展与 1×1 点卷积组合可形成完整的深度可分离卷积Depthwise Separable Convolution已成为轻量级网络的基石MobileNet、EfficientNet 等。缺点表达能力受限深度卷积仅进行空间特征提取不融合通道信息必须额外添加 1×1 卷积才能实现跨通道混合否则输出特征图各通道信息孤立影响模型精度。硬件效率并非总是最优虽然参数量和理论计算量降低但在 GPU 等并行计算设备上分组卷积尤其是通道数较小时可能因内存访问模式不够连续导致实际加速效果不如理论值。设计灵活性受限DWConv要求分组数g能同时整除c1和c2。若c2不是c1的整数倍则无法达到真正的深度卷积gc1只能退化为普通分组卷积此时参数节省效果打折。性能-精度权衡过度使用深度卷积会显著降低模型容量对于复杂任务如高分辨率目标检测可能需要增加网络深度或宽度来补偿精度损失导致设计复杂度上升。在工程实践中应根据任务需求和硬件平台合理选择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为例PaddleOCRWin10上安装使用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训练自己的数据集足球检测YOLOv5TensorRT加速YOLOv5模型推理YOLOv5IoU、GIoU、DIoU、CIoU、EIoU玩转Jetson Nano五TensorRT加速YOLOv5目标检测YOLOv5添加SE、CBAM、CoordAtt、ECA注意力机制YOLOv5yolov5s.yaml配置文件解读、增加小目标检测层Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集YOLOv5使用7.0版本训练自己的实例分割模型车辆、行人、路标、车道线等实例分割使用Kaggle GPU资源免费体验Stable Diffusion开源项目Stable Diffusion在服务器上部署使用Stable Diffusion WebUI进行AI绘图v2.0Stable Diffusion使用自己的数据集微调训练LoRA模型v2.0