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

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐