dwconv 

是由一个两部分卷积组成的一个网络

第一部分是depthwise conv 是分通道的一个卷积 就是每个卷积核对应input的每一个通道 有图好理解很多 如下

 图源https://blog.csdn.net/tintinetmilou/article/details/81607721

因为上面每个层的特征都分开 没有有效的利用相同空间位置上不同层的有效信息,所以有了第二部分

第二部分是pointwise conv

它将第一部分各自独立的featuremap进行组合生成了新的

它是一个kernelsize为1,通道数为input通道数的一个卷积,具体如图

这里写图片描述

  图源https://blog.csdn.net/tintinetmilou/article/details/81607721

这个dwconv主要是为了降低卷积运算参数量。

但具体参数量计算请看 https://yinguobing.com/separable-convolution/#fn2

yolo系列里的代码如下

class DWConv(nn.Module):
    """Depthwise Conv + Conv"""
    def __init__(self, in_channels, out_channels, ksize, stride=1, act="silu"):
        super().__init__()
        self.dconv = BaseConv(
            in_channels, in_channels, ksize=ksize,
            stride=stride, groups=in_channels, act=act
        )
        self.pconv = BaseConv(
            in_channels, out_channels, ksize=1,
            stride=1, groups=1, act=act
        )

    def forward(self, x):
        x = self.dconv(x)
        return self.pconv(x)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐