【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连接方式。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 82. 删除排序链表中的重复元素 II

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5] 提示&#xff1a; 链表中节点数目在范围 [0, 300] 内 -100 < Node.…

一些实用的功能函数

1. 【算法】求两个数中&#xff0c;bit位不同的个数&#xff08;在计网那道题中用过&#xff09; 解法&#xff1a;首先把两位数异或&#xff0c;得到的结果&#xff0c;通过自身跟自身-1相与&#xff0c;直到等于0为止 代码如下&#xff1a; int calculateNotSam(int a,int …

uniapp怎么使用接口返回的iconfont图标

uniapp怎么使用接口返回的iconfont图标 首先在你的项目中添加该图标&#xff0c;名称要对应 实际应用 item.ICONFONT_NAME“tools”; item.ICONFONT_COLOR“FA5151”; <view class"iconfont" :class"icon-item.ICONFONT_NAME" :color"item.ICON…

Kubernetes Pod深度解析:构建可靠微服务的秘密武器(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Kubernetes概述 2、Pod概述 二、Po…

输出单链表倒数第K个结点值

方法一&#xff1a; 两次遍历链表。第一次遍历&#xff0c;计算链表长度&#xff0c;然后计算链表倒数第m个结点的正数位置k&#xff0c;判断位置是否合法&#xff0c;如果不合法&#xff0c;输出NOT FOUND&#xff0c;否则&#xff0c;进行第二次遍历链表&#xff0c;查找链表…

手写SpringBoot(三)之自动配置

系列文章目录 手写SpringBoot&#xff08;一&#xff09;之简易版SpringBoot 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 手写SpringBoot&#xff08;三&#xff09;之自动配置 手写SpringBoot&#xff08;四&#xff09;之bean动态加载 手写SpringBoot…

企业培训系统功能介绍

在当今知识经济时代&#xff0c;企业的竞争力在很大程度上取决于员工的专业能力和综合素质。为了适应不断变化的市场需求和技术进步&#xff0c;企业需要对员工进行持续有效的培训。一个高效的企业培训系统对企业人才培训至关重要。以下介绍一下企业培训系统的主要功能&#xf…

电脑文件msvcp120.dll丢失的解决方法详细分析,找多种靠谱方法修复

遇到msvcp120.dll文件丢失的问题实际上不算罕见&#xff0c;这往往是由于我们频繁使用电脑而导致的意外删除&#xff0c;或者是电脑受到病毒感染。当这类情况发生时&#xff0c;msvcp120.dll文件可能会被错误地移除或损坏&#xff0c;这便需要我们去进行修复。接下来&#xff0…

【系统架构师】-第18章-安全架构设计

(1)信息泄露&#xff1a;信息被泄露或透露给某个非授权的实体。 (2)破坏信息的完整性&#xff1a;数据被非授权地进行增删、修改或破坏而受到损失。 (3)拒绝服务&#xff1a;对信息或其他资源的合法访问被无条件地阻止。 (4)非法使用(非授权访问):某一资源被某个非授权的人或…

FA模型切换Stage模型组件切换之ServiceAbility切换DataAbility切换

ServiceAbility切换 FA模型中的ServiceAbility对应Stage模型中的ServiceExtensionAbility。Stage模型下的ServiceExtensionAbility为系统API&#xff0c;只有系统应用才可以创建。因此&#xff0c;FA模型的ServiceAbility的切换&#xff0c;对于系统应用和三方应用策略有所不同…

实践笔记-harbor搭建(版本:2.9.0)

harbor搭建 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09;2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境&#xff1a;centos7 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09; 网盘资源&#xff1a;https://pan.baidu.com/s/1fcoJIa4x…

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录&#xff0c;并且进行解压3. 配置文件/etc/profile&#xff0c;配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…

发表SCI论文对文凭有什么要求吗?SCI学历要求

sci论文是学术水平很高的文章&#xff0c;往往要通过课题研究&#xff0c;才能撰写出论文内容来。可以说作者没有一定的文凭&#xff0c;完不成sci论文的撰写&#xff0c;就不能发表。但这不代表文凭是sci论文发表的限制条件&#xff0c;实际上sci期刊对作者文凭没有要求&#…

WEPE系统安装纯净版window11教程(包含pe内系统安装方法)

目录 一.安装u盘启动盘 1.1制作安装系统引导盘 1.2下载保存windows镜像 1.3根据自己电脑品牌查询进入BIOS设置的方法 1.4我们成功进入了PE 二.重装系统 2.1遇到问题 2.2重新来到这个界面 三.PE中基本软件的作用 四.学习声明 今天不敲代码&#xff0c;今天来讲讲We P…

ubuntu 安装 cloudcompare(两种方法)

方法一 &#xff1a;从 snap 安装 &#xff08;推荐&#xff09; 安装简单&#xff0c;基本上功能都有&#xff08;读写保存las&#xff0c;pcd&#xff0c;标注等&#xff09; 安装&#xff1a; sudo apt-get update sudo apt install snap sudo snap install cloudcompare…

Node | Node.js 版本升级

目录 Step1&#xff1a;下载 Step2&#xff1a;安装 Step3&#xff1a;换源 发现其他博客说的 n 模块不太行&#xff0c;所以老老实实地手动安装 Step1&#xff1a;下载 Node 中文官网&#xff1a;https://nodejs.cn/download 点击后&#xff0c;将会下载得到一个 .msi 文件…

WIFI驱动移植实验:配置 Linux 内核

一. 简介 前面文章删除了Linux内核源码&#xff08;NXP官方的kernel内核源码&#xff09;自带的 WIFI驱动。 WIFI驱动移植实验&#xff1a;删除Linux内核自带的 RTL8192CU 驱动-CSDN博客 将正点原子提供的 rtl8188EUS驱动源码添加到 kernel内核源码中。文章如下&#xff1a…

PID算法控制5840-31ZY编码器直流减速电机旋转特定角度(一)

模块分析 在本工程中&#xff0c;使用stm32做主控芯片输出PWM波&#xff0c;TB6112做电源驱动带动5840-31ZY编码器直流减速电机旋转特定角度 有如下模块 TB6112驱动模块 TB6112是性能优于常见L298N的一款电机驱动芯片&#xff0c;体积更小效率更高发热少 其接线如图&#x…

HarmonyOs开发:轮播图Banner组件封装与使用

前言 轮播图在每个项目中都很常见&#xff0c;鸿蒙中在容器组件中也提供了Swiper组件&#xff0c;用于子组件滑动轮播显示&#xff0c;和前端的使用起来也是异曲同工&#xff0c;我们先看下基本的用法。 Swiper() {ForEach(["1", "2", "3", &quo…

每日一题(反转链表)

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 思路一 运用迭代的算法&#xff0c;把头指针…