一、简介
DDWConv(空洞深度可分离卷积)主要解决替换卷积层带来的过多额外参数开销「参数量大、感受野固定」的问题,核心优势集中在零参数增长扩感受野、降参、多尺度全覆盖:
1.深度卷积降参
DDWConv 将标准卷积拆分为Depthwise 深度卷积 + Pointwise 1×1逐点卷积。Depthwise卷积设置groups=in_channels,实现单通道单核独立卷积,各通道特征互不干扰,仅提取空间纹理特征。相比标准卷积,参数量降低
2.空洞卷积零增参:无成本扩大感受野
DDWConv 仅在深度卷积层引入空洞率d=1/3/5,通过间隔采样的方式扩大感受野,整个过程不新增任何卷积参数、不增加计算量。区别于传统增大卷积核扩感受野的方式,实现零参数成本、多尺度感受野覆盖
3.1×1逐点卷积补全通道融合
针对深度卷积无法跨通道交互的缺陷,通过无空洞的1×1逐点卷积完成通道融合与维度变换,既保留轻量化优势,又弥补了深度卷积通道信息缺失的问题
公式:
架构图
代码
import torch import torch.nn as nn class DDWConv(nn.Module): """ DDWConv = Dilated空洞 + DepthwiseSeparable深度可分离(DW+PW) :param in_c: 输入通道 :param out_c: 输出通道 :param d: 空洞率 di ∈ [1,3,5] k固定=3(论文默认卷积核3×3) """ def __init__(self, in_c, out_c, d): super().__init__() # 1.Depthwise Conv:每个通道独立卷积 + Dilated空洞(仅DW加空洞) self.dw = nn.Conv2d( in_channels=in_c, out_channels=in_c, kernel_size=3, # k=3 stride=1, padding=d, # padding=d保证尺寸不变 dilation=d, # 空洞只加在DW层 groups=in_c, # 单通道单核:Depthwise核心 bias=False ) # 2.Separable拆分第二步:Pointwise 1×1,无空洞 self.pw = nn.Conv2d( in_channels=in_c, out_channels=out_c, kernel_size=1, stride=1, padding=0, dilation=1, # PW永远不加空洞 bias=False ) self.bn = nn.BatchNorm2d(out_c) self.act = nn.ReLU() def forward(self, X0): # X0是输入特征,输出Xi Xi = self.dw(X0) Xi = self.pw(Xi) Xi = self.bn(Xi) Xi = self.act(Xi) return Xi class MultiScale_DDW_Block(nn.Module): def __init__(self, in_c, total_out_c): super().__init__() # 通道均分3分支 c1 = total_out_c // 3 c2 = total_out_c // 3 c3 = total_out_c - c1 - c2 # 3个DDWConv,对应d=1小、d=3中、d=5大 self.branch_d1 = DDWConv(in_c, c1, d=1) self.branch_d3 = DDWConv(in_c, c2, d=3) self.branch_d5 = DDWConv(in_c, c3, d=5) def forward(self, X0): # 同输入X0分别送入3个不同d的DDWConv,得到X1,X2,X3 X1 = self.branch_d1(X0) X2 = self.branch_d3(X0) X3 = self.branch_d5(X0) # 通道拼接融合 out = torch.cat([X1, X2, X3], dim=1) return out二、yolov10主干网络P4层修改方案
对P4层的C2f中 Bottleneck 内部cv2层卷积进行替换
修改后网络:
修改后参数和计算量:
修改单层的参数和计算量变化:参数量下降1.5%,计算量下降1.6%