当前位置: 首页 > news >正文

YOLOv5、v7改进之三十七:结合CVPR2022新作ConvNeXt网络

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

具体改进办法请关注后私信留言!关注免费领取深度学习算法学习资料!

解决问题:之前改进增加了很多注意力机制的方法,包括比较常规的SE、CBAM等,本文加入基于MLP的注意力机制,该注意力机制了保留通道和空间方面的信息以增强跨维度交互的重要性。因此,我们提出了一种全局调度机制,通过减少信息缩减和放大全局交互表示来提高深度神经网络的性能,提高检测效果。

基本原理:

       视觉识别的“咆哮的20年代”始于视觉变形金刚(ViTs)的引入,它迅速取代ConvNets成为最先进的图像分类模型。另一方面,普通的ViT在应用于诸如对象检测和语义分割等一般计算机视觉任务时面临困难。正是分层的变形金刚(例如Swin Transformers)重新引入了几个ConvNet先验,使变形金金刚作为通用视觉骨干切实可行,并在各种视觉任务中表现出色。然而,这种混合方法的有效性仍然很大程度上归功于变压器的固有优势,而不是卷积的固有电感偏差。在这项工作中,我们重新审视了设计空间,并测试了纯ConvNet所能达到的极限。我们逐渐将标准的ResNet“现代化”为视觉变换器的设计,并发现了一些关键组件,这些组件在设计过程中会产生性能差异。这一探索的结果是一系列被称为Con-vNeXt的纯ConvNet模型。ConvNeXts完全由标准ConvNet模块构建,在准确性和可扩展性方面与Transformers竞争激烈,实现了87.8%的ImageNet顶级精度,在COCO检测和ADE20K分割方面优于Swin Transformers,同时保持了标准ConvNet的简单性和效率。

       我们在表(下图)中展示了从ImageNet-22K预训练微调的模型的结果。这些实验很重要,因为人们普遍认为,视觉变形金刚具有较少的感应偏差,因此在更大规模的预训练时,其表现比ConvNets更好。我们的结果表明,当使用大数据集进行预训练时,设计得当的ConvNets并不比视觉变形金刚差-ConvNeXts的性能仍与同类尺寸的SwinTransformers相当或更好,吞吐量略高。此外,我们的ConvNeXt XL模型达到了87.8%的精度,比ConvNeXt-L的3842精度有了相当大的提高,表明ConvNeX是可扩展的架构。在ImageNet-1K、EfficientNetV2-L上,一个配备了高级模块(如挤压和激励[35])和渐进式训练程序的搜索架构实现了最佳性能。然而,通过ImageNet-22K预训练,ConvNeXt能够超越EfficientNetV2,进一步证明了大规模训练的重要性。在附录B中,我们讨论了ConvNeXt的鲁棒性和域外泛化结果。

​添加方法:

第一步:确定添加的位置,作为即插即用的注意力模块,可以添加到YOLOv7网络中的任何地方。

第二步:common.py构建模块。部分代码如下,关注文章末尾,私信后领取。

class CNeB(nn.Module):
    # CSP ConvNextBlock with 3 convolutions by iscyy/yoloair
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__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)
        self.m = nn.Sequential(*(ConvNextBlock(c_) for _ in range(n)))

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

第三步:yolo.py中注册CNeB模块

 elif m is CNeB:
            c1, c2 = ch[f], args[0]
            if c2 != no:
                c2 = make_divisible(c2 * gw, 8)

            args = [c1, c2, *args[1:]]
            if m is CNeB:
                args.insert(2, n)
                n = 1

第四步:修改yaml文件,本文以修改backbone为例,将原C3模块后加入该模块。

[-1, 1, Conv, [512, 1, 1]],
   [-3, 1, Conv, [512, 1, 1]],
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, -3], 1, Concat, [1]],
   [-1, 1, CNeB, [1024]],
   [-1, 1, Conv, [256, 3, 1]],
  ]

第五步:将train.py中改为本文的yaml文件即可,开始训练。

结 果:本人在遥感数据集上进行实验,有涨点效果。需要请关注留言。

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

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

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

相关文章:

  • [SpringBoot] AOP-AspectJ 切面技术
  • Prometheus + Grafana 监控SpringBoot项目
  • [C]编译和预处理详解
  • C++入门(正在更新)
  • 风控大佬的一天从这两张报表开始(搬砖)了
  • 【SpringBoot】72、SpringBoot中集成Graylog分布式日志框架
  • STM32CubeMX学习笔记(44)——USB接口使用(HID按键)
  • ElasticSearch 学习(一)-- 概念
  • 用户登录权限校验 JWT【详解】
  • php laravel开发的个人博客源码分享,支持适配移动端附截图
  • 基于模糊认知图谱和遗传算法的龋齿度检测(Matlab代码实现)
  • 【表面缺陷检测】基于yolov5的PCB表面缺陷检测(附代码)
  • 主动学习(Active Learning)简介综述汇总以及主流技术方案
  • 详解KMP
  • 基于QD求解法的二分类SVM仿真
  • $translatePartialLoader加载失败及解决方式
  • 2017届校招提前批面试回顾
  • HTTP--网络协议分层,http历史(二)
  • JavaScript设计模式与开发实践系列之策略模式
  • js算法-归并排序(merge_sort)
  • MD5加密原理解析及OC版原理实现
  • Next.js之基础概念(二)
  • socket.io+express实现聊天室的思考(三)
  • tweak 支持第三方库
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue-router的history模式发布配置
  • Vue--数据传输
  • 关于for循环的简单归纳
  • 基于组件的设计工作流与界面抽象
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何设计一个微型分布式架构?
  • 我的面试准备过程--容器(更新中)
  • 在Mac OS X上安装 Ruby运行环境
  • 智能合约Solidity教程-事件和日志(一)
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Android开发者必备:推荐一款助力开发的开源APP
  • #{}和${}的区别是什么 -- java面试
  • #14vue3生成表单并跳转到外部地址的方式
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (11)MATLAB PCA+SVM 人脸识别
  • (Note)C++中的继承方式
  • (poj1.2.1)1970(筛选法模拟)
  • (二)fiber的基本认识
  • (翻译)terry crowley: 写给程序员
  • (四)事件系统
  • .apk文件,IIS不支持下载解决
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net 代码性能 - (1)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net流程开发平台的一些难点(1)
  • .NET值类型变量“活”在哪?