YOLOv7改进之二十二:涨点神器——引入递归门控卷积(gnConv)

 ​前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。

解决问题:YOLOv7主干特征提取网络为CNN网络,CNN具有平移不变性和局部性,缺乏全局建模长距离建模的能力,引入自然语言处理领域的框架Transformer来形成CNN+Transformer架构,充分两者的优点,提高目标检测效果,本人经过实验,对小目标以及密集预测任务会有一定的提升效果。视觉 Transformers 的最新进展在基于点积 self-attention 的新空间建模机制驱动的各种任务中取得了巨大成功。递归门控卷积(gnConv),它通过门控卷积和递归设计执行高阶空间交互。新操作具有高度的灵活性和可定制性,它兼容各种卷积变体,并将自注意力中的二阶交互扩​​展到任意阶,而不会引入大量额外的计算。gnConv 可以作为一个即插即用的模块来改进各种视觉 Transformer 和基于卷积的模型。Transformer方法融合参考YOLOv5改进往期。

YOLOv5改进之十七:CNN+Transformer——融合Bottleneck Transformers_人工智能算法研究院的博客-CSDN博客

原理:

论文:https://arxiv.org/pdf/2207.14284.pdf

代码:GitHub – raoyongming/HorNet: HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions

YOLOv7改进之二十二:涨点神器——引入递归门控卷积(gnConv)

视觉变形金刚的最新进展在各种任务中都取得了巨大的成功由基于点积自注意力的新空间建模机制驱动。在本文中,我们展示了愿景变形金刚背后的关键要素,即输入自适应、长程和高阶空间交互,也可以使用基于卷积的框架有效地实现。我们提出递归门控卷积(gnConv),它通过门控卷积和递归设计执行高阶空间交互。新的操作高度灵活可定制,兼容各种卷积变体并将 self-attention 中的二阶交互扩​​展到任意阶,而无需引入大量额外的计算。 GnConv 可以作为即插即用模块来改进各种视觉变压器和基于卷积的模型。基于该操作,我们构建了一个新的通用视觉骨干家族
命名为 HorNet。 ImageNet分类、COCO对象的大量实验检测和 ADE20K 语义分割显示 HorNet 优于 Swin Transformers 和 ConvNeXt 具有相似的整体架构和训练配置。 HorNet 还显示出良好的可扩展性更多的训练数据和更大的模型大小。除了视觉编码器的有效性之外,我们还展示了 gnConv 可以应用于特定任务的解码器和以更少的计算持续提高密集预测性能。我们的结果表明,gnConv 可以成为可视化建模的新基础模块它有效地结合了视觉 Transformer 和 CNN 的优点

 项目部分代码如下:

class gnconv(nn.Module):
    def __init__(self, dim, order=5, gflayer=None, h=14, w=8, s=1.0):
        super().__init__()
        self.order = order
        self.dims = [dim // 2 ** i for i in range(order)]
        self.dims.reverse()
        self.proj_in = nn.Conv2d(dim, 2*dim, 1)

        if gflayer is None:
            self.dwconv = get_dwconv(sum(self.dims), 7, True)
        else:
            self.dwconv = gflayer(sum(self.dims), h=h, w=w)
        
        self.proj_out = nn.Conv2d(dim, dim, 1)

        self.pws = nn.ModuleList(
            [nn.Conv2d(self.dims[i], self.dims[i+1], 1) for i in range(order-1)]
        )

        self.scale = s
        print('[gnconv]', order, 'order with dims=', self.dims, 'scale=%.4f'%self.scale)

结 果:本人在多个数据集上做了大量实验,针对不同的数据集效果不同,涨点明显。

预告一下:下一篇内容将继续分享深度学习算法相关改进方法。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦

PS:卷积的替换不仅仅是适用改进YOLOv5,也可以改进其他的YOLO网络以及目标检测网络,比如YOLOv7、v6、v4、v3,Faster rcnn ,ssd等。

最后,希望能互粉一下,做个朋友,一起学习交流。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年2月23日 下午12:53
下一篇 2023年2月23日 下午12:54

相关推荐