【YOLOv8/YOLOv7/YOLOv5系列算法改进NO.56】引入Contextual Transformer模块(sci期刊创新点之一) 您所在的位置:网站首页 yolov5原理简述 【YOLOv8/YOLOv7/YOLOv5系列算法改进NO.56】引入Contextual Transformer模块(sci期刊创新点之一)

【YOLOv8/YOLOv7/YOLOv5系列算法改进NO.56】引入Contextual Transformer模块(sci期刊创新点之一)

2023-03-12 03:18| 来源: 网络整理| 查看: 265

前言

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

一、解决问题

YOLO检测网络的主干特征提取网络为CNN网络,CNN具有平移不变性和局部性,缺乏全局建模长距离建模的能力,引入自然语言处理领域的框架Transformer来形成CNN+Transformer架构,充分两者的优点,提高目标检测效果,本人经过实验,对小目标以及密集预测任务会有一定的提升效果。此前 ☁️18. 损失函数改进为Alpha-IoU损失函数 ☁️25. 引入Swin Transformer ☁️29. 引入Swin Transformer v2.0版本这个方法本人也在去年用过,作为sci期刊的核心创新点之一,朋友们可以用在自己的应用领域。关于原理等需要帮助讲解可以私信我,我对此有较深的理解

二、基本原理

具有自我关注的Transformer导致了自然语言处理领域的革命,最近,Transformer风格架构设计的出现在众多计算机视觉任务中产生了竞争性的结果。然而,大多数现有设计直接在2D特征图上部署自我关注,以获得基于每个空间位置处的孤立查询和键对的注意力矩阵,但未充分利用相邻键之间的丰富上下文。在这项工作中,我们设计了一个新颖的Transformer风格模块,即上下文变换器(CoT)块,用于视觉识别。这种设计充分利用了输入键之间的上下文信息来指导动态注意力矩阵的学习,从而增强了视觉表示的能力。技术上,CoT块首先通过3×3卷积对输入键进行上下文编码,导致输入的静态上下文表示。我们进一步将编码密钥与输入查询连接起来,通过两个连续的1×1卷积来学习动态多头注意力矩阵。学习的注意力矩阵乘以输入值,以实现输入的动态上下文表示。最终将静态和动态上下文表示的结果作为输出。我们的CoT块很有吸引力,因为它可以很容易地替换ResNet架构中的每个3×。通过对广泛应用(如图像识别、对象检测和实例分割)的广泛实验,我们验证了CoT-Net作为一个更强大的主干的优势。

三、​添加方法

将CoT模块引入到原有的原网络模型中,将ResNet结构进行了改进,利用CoTNet的思想完成了C3结构的构建,形成新的C3_CoT模块。因为网络末端的特征图分辨率较低,将新的C3_CoT模块应用于低分辨率特征图可以降低昂贵的计算和存储成本。部分代码如下:

class C3_cot(nn.Module): # CSP Bottleneck with 3 convolutions def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansion super(C3_cot, self).__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(2 * c_, c2, 1) # act=FReLU(c2) self.m = nn.Sequential(*[Bottleneck_cot(c_, c_, shortcut, g, e=1.0) for _ in range(n)]) # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)]) def forward(self, x): return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)) class C3TR(C3): # C3 module with TransformerBlock() def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super().__init__(c1, c2, n, shortcut, g, e) c_ = int(c2 * e) self.m = TransformerBlock(c_, c_, 4, n)

四、总结

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

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

最后,有需要的请关注私信我吧。关注免费领取深度学习算法学习资料!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有