【YOLOv5改进系列(9)】高效涨点----使用CAM(上下文增强模块)替换掉yolov5中的SPPF模块

本文主要是介绍【YOLOv5改进系列(9)】高效涨点----使用CAM(上下文增强模块)替换掉yolov5中的SPPF模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


文章目录

  • 🚀🚀🚀前言
  • 一、1️⃣ CAM模块详细介绍
  • 二、2️⃣CAM模块的三种融合模式
  • 三、3️⃣如何添加CAM模块
    • 3.1 🎓 添加CAM模块代码
    • 3.2 ✨添加yolov5s_CAM.yaml文件
    • 3.3 ⭐️修改yolo.py文相关文件
  • 四、4️⃣实验结果
    • 4.1 🎓 yolov5基准模型
    • 4.2 ✨使用CAM的weight连接方式
    • 4.3 ⭐️用CAM的adaptive连接方式
    • 4.4 🎯用CAM的concat连接方式
    • 4.5 🚀实验总结


在这里插入图片描述

👀🎉📜系列文章目录

【YOLOv5改进系列(1)】高效涨点----使用EIoU、Alpha-IoU、SIoU、Focal-EIOU替换CIou
【YOLOv5改进系列(2)】高效涨点----Wise-IoU详细解读及使用Wise-IoU(WIOU)替换CIOU
【YOLOv5改进系列(3)】高效涨点----Optimal Transport Assignment:OTA最优传输方法
【YOLOv5改进系列(4)】高效涨点----添加可变形卷积DCNv2
【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法
【YOLOv5改进系列(6)】高效涨点----使用DAMO-YOLO中的Efficient RepGFPN模块替换yolov5中的Neck部分
【YOLOv5改进系列(7)】高效涨点----使用yolov8中的C2F模块替换yolov5中的C3模块
【YOLOv5改进系列(8)】高效涨点----添加yolov7中Aux head 辅助训练头

🚀🚀🚀前言

CAM(上下文增强模块) 这个模块是出至于CONTEXT AUGMENTATION AND FEATURE REFINE- MENT NETWORK FOR TINY OBJECT DETECTION这篇论文,这是一个针对小目标检测的文本,提出了一种名为“上下文增强和特征细化网络”的方法。将多尺度展开卷积的特征从上到下融合注入到特征金字塔网络中,补充上下文信息。引入通道和空间特征细化机制,抑制多尺度特征融合中的冲突形成,防止微小目标淹没在冲突信息中。此外,提出了一种数据增强方法copy-reduce-paste,该方法可以增加训练过程中微小对象对损失的贡献,保证训练更加均衡。

博主也是使用该论文中的CAM模块去替换掉yolov5中的SPPF模块,在经过CAM三个不同的特征融合连接实验之后(分别是:weight, adaptive,concat),在我自己的疵点数据集上面效果非常好,尤其是使用adaptive连接方法,模型涨点非常高,提升了10个百分点。

📜论文地址:基于上下文增强和特征细化网络的微小目标检测

由于该论文没有提供代码,没有办法像之前的改进一样,直接使用别人的代码修改参数,所以这边也是观看了很多博主的代码之后,自己总结复现了一下。


一、1️⃣ CAM模块详细介绍

微小目标检测需要上下文信息。所以提出使用不同空洞卷积速率的空洞卷积来获取不同感受野的上下文信息,以丰富FPN的上下文信息;下图就是CAM的结构图,在C5上以不同的空洞卷积速率进行空洞卷积,得到不同感受野的上下文信息,卷积核大小为3×3,空洞卷积速率为1、3和5。在这里插入图片描述
SPP模块:我第一次从论文中看到这个结构首先想到的就是和SPP模块比较类似,SPP的特征融合方式是:feature map首先经过一个卷积降维,然后分别进行kernel size为5, 9, 13的max polling层,最后将它们与降维之后的特征concat起来,然后再经过一个卷积将channel恢复成原来大小。
在这里插入图片描述

二、2️⃣CAM模块的三种融合模式

关于C5上面的三个特征融合方式有三种,(a)、(b)和(c)所示,
在这里插入图片描述
方法(a)和(c)分别为加权融合和拼接操作。即直接在空间维度和通道维度上添加特征映射。方法(b)是一种自适应融合方法。具体来说,假设输入的大小可以表示为(bs, C, H, W),我们可以通过卷积、拼接和Softmax操作获得(bs, 3, H, W)的空间自适应权值。三个通道一对一地对应三个输入,通过计算加权和可以将上下文信息聚合到输出。(b)的方法需要进行更多的特征处理,通过实验发现,在我自己的中小型目标疵点数据集上该方法是优于另外两种方法。

在该论文中通过消融实验验证了每种融合方法的有效性,结果如下表所示。 AP ⁡ s \operatorname{AP}_{\mathrm{s}} APs AP ⁡ m \operatorname{AP}_{\mathrm{m}} APm AP ⁡ l \operatorname{AP}_{\mathrm{l}} APl分别定义为微小、中等和大型目标的精度。 AR ⁡ s \operatorname{AR}_{\mathrm{s}} ARs AR ⁡ m \operatorname{AR}_{\mathrm{m}} ARm AR ⁡ l \operatorname{AR}_{\mathrm{l}} ARl分别表示小、中、大目标的召回率。由表1可以看出,(c)对微小物体的优势最大。 AP ⁡ s \operatorname{AP}_{\mathrm{s}} APs AR ⁡ s \operatorname{AR}_{\mathrm{s}} ARs均增长1.8%。方法(b)对于大中型目标改善最大。方法(a)带来的改进基本上介于两者之间。

在这里插入图片描述

三、3️⃣如何添加CAM模块

3.1 🎓 添加CAM模块代码

首先找到models文件夹下面找到common.py文件,在该文件中的最后一行添加CAM模块代码,添加内容如下:

class CAM(nn.Module):def __init__(self, inc, fusion='weight'):super().__init__()assert fusion in ['weight', 'adaptive', 'concat'] #三种融合方式self.fusion = fusionself.conv1 = Conv(inc, inc, 3, 1, None, 1, 1)self.conv2 = Conv(inc, inc, 3, 1, None, 1, 3)self.conv3 = Conv(inc, inc, 3, 1, None, 1, 5)self.fusion_1 = Conv(inc, inc, 1)self.fusion_2 = Conv(inc, inc, 1)self.fusion_3 = Conv(inc, inc, 1)if self.fusion == 'adaptive':self.fusion_4 = Conv(inc * 3, 3, 1)def forward(self, x):x1 = self.conv1(x)x2 = self.conv2(x)x3 = self.conv3(x)if self.fusion == 'weight':return self.fusion_1(x1) + self.fusion_2(x2) + self.fusion_3(x3)elif self.fusion == 'adaptive':fusion = torch.softmax(self.fusion_4(torch.cat([self.fusion_1(x1), self.fusion_2(x2), self.fusion_3(x3)], dim=1)), dim=1)x1_weight, x2_weight, x3_weight = torch.split(fusion, [1, 1, 1], dim=1)return x1 * x1_weight + x2 * x2_weight + x3 * x3_weightelse:return torch.cat([self.fusion_1(x1), self.fusion_2(x2), self.fusion_3(x3)], dim=1)

3.2 ✨添加yolov5s_CAM.yaml文件

这个文件你可以直接复制yolov5s.yaml文件,然后重命名为yolov5s_CAM.yaml,这里只需要修改一处地方,就是将backbone特征提取部分的最后一层SPPF模块替换成CAM模块,并且指定特征的连接方式(weight、adaptive、concat),修改内容如下:

在这里插入图片描述

3.3 ⭐️修改yolo.py文相关文件

📌在models文件夹下面找到yolo.py文件,在342行添加一个CAM模块判断代码,添加如下:

elif m is CAM:c1, c2 = ch[f], (ch[f] * 3 if args[0] == 'concat' else ch[f])args = [c1, args[0]]

在这里插入图片描述

四、4️⃣实验结果

4.1 🎓 yolov5基准模型

训练结果:F1置信度分数为0.71、map@0.5=0.779;
在这里插入图片描述

4.2 ✨使用CAM的weight连接方式

训练结果:F1置信度分数为0.73、map@0.5=0.796;
在这里插入图片描述

4.3 ⭐️用CAM的adaptive连接方式

训练结果F1置信度分数为0.73、map@0.5=0.851
在这里插入图片描述

4.4 🎯用CAM的concat连接方式

训练结果:F1置信度分数为0.73、map@0.5=0.821;
在这里插入图片描述

4.5 🚀实验总结

我的疵点数据集是有大目标和小目标的,使用自适应的连接方式训练效果最好,map@0.5提升了将近6个百分点,其次就是concat连接方式提升效果排第二,因为我的疵点数据集小目标其实是多余大目标的,所以效果是要优于weight连接方式。


在这里插入图片描述

这篇关于【YOLOv5改进系列(9)】高效涨点----使用CAM(上下文增强模块)替换掉yolov5中的SPPF模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863715

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳