改进YOLOv5,YOLOv5+CBAM注意力机制

目录

1. 目标检测模型

2. YOLOv5s

3. YOLOv5s融合注意力机制

4. 修改yolov5.yaml文件

5.  ChannelAttentionModule.py

6. 修改yolo.py


1. 目标检测模型

        目标检测算法现在已经在实际中广泛应用,其目的是找出图像中感兴趣的对象,并确定对象的类别和位置。本文将目标检测算法分为传统的技术和基于卷积神经网络的技术。传统的技术主要有基于颜色、基于纹理、基于形状和一些中高级语义特征的技术,检测的最终目标是准确地对检测对象进行识别和分类。检测步骤主要包括以下三个:区域选择、特征提取和分类器分类。首先将输入图像作为候选区域,使用不同大小、比例的滑动窗口以一定步长滑动;然后对每个候选区域的局部信息进行特征提取;最后使用分类器对检测的对象进行识别分类。在判断出检测对象预测框之后,可能会有一系列的预测框,并且这些预测框可能会有一些重叠遮挡问题。因此,需要使用非极大值抑制NMS(Non-MaximumSuppression)的方法来对这些预测框进行筛选和合并。虽然传统的检测技术可以在特定的情况下取得较好的效果,但其主要存在两个方面的问题:一是滑窗选择策略没有针对性,时间复杂度高,窗口冗余,无法满足实时监控的要求;二是手工设计的特征鲁棒性较差,在天气变化、物体分布不均匀等条件下,其准确度难以保证,泛化能力较差。此外,传统的手工设计特性还需要大量的先验知识。基于卷积神经网络的对象检测算法主要分为两类:

        (1)由R-CNN(Region based Convolutional Neural Network)表示的两阶段算法;

        (2)由YOLO(You Only Look Once)表示的基于回归的目标检测算法。

        由YOLO表示的基于回归的目标检测算法真正实现了端到端训练,一次完成目标类别的确定和定位。整个网络结构只由卷积层和输入图像组成。卷积操作后,直接返回目标类别和位置。因此,单阶段目标检测算法快于两阶段目标检测算法,特别是YOLOv5,已达到先进的速度和精度水平。在DBT算法中,检测器效果的好坏严重影响目标跟踪的结果,并且检测器速率的快慢和模型的大小也是完成实时目标跟踪的关键。由于监控现场大多是算力较低的嵌入式设备,无法部署规模较大的检测模型。为了降低运算成本,加强实用性,本文选择YOLOv5系列中的最小模型YOLOv5s作为车辆检测的基础模型。

2. YOLOv5s

        YOLOv5s的结构主要分为四个部分,Input输入端、Backbone主干网络、Neck网络、Head输出端,如图1所示。Input输入端主要包含对数据的预处理,包括Mosaic数据增强[11]、自适应图像填充,并且为了适用不同的数据集,YOLOv5s在Input输入端集成了自适应锚框计算,以便在更换数据集时,自动设定初始锚框大小。Backbone主干网络通过深度卷积操作从图像中提取不同层次的特征,主要利用了瓶颈跨阶段局部结构BottleneckCSP和空间金字塔池化SPP[21],前者的目的是为了减少计算量、提高推理速度,后者实现了对同一个特征图进行不同尺度的特征提取,有助于检测精度的提高。Neck网络层包含特征金字塔FPN、路径聚合结构PAN[22],FPN在网络中自上而下传递语义信息,PAN则自下而上传递定位信息,对Backbone中不同网络层的信息进行融合,进一步提升检测能力。Head输出端作为最后的检测部分,主要是在大小不同的特征图上预测不同尺寸的目标。

                                                              YOLOv5s网络结构

3. YOLOv5s融合注意力机制

        在计算机视觉领域,注意力机制的有效性已经得到证明,并且已经广泛用于分类、检测、分割任务。在CNN网络中,注意力机制作用于特征图上,用于获取特征图中可用的注意力信息[23],主要包括空间注意力和通道注意力信息。卷积注意力模块(convolutional block attention module,CBAM)[24]同时关注了空间和通道信息,通过两个子模块CAM(channel attention module)和SAM(spatial attention module)对网络中间的特征图进行重构,强调重要特征,抑制一般特征,达到提升目标检测效果的目的,其结构如图所示。对于CNN网络中某一层的三维特征图F∈ℝC×H×W,CBAM顺序地从F推理出一维通道注意力特征图Mc和二维空间注意力特征图Ms,并分别进行逐元素相乘,最终得出与F同等维度的输出特征图,如公式(1)所示。其中F表示网络中某网络层特征图,Mc(F)表示CAM对F进行通道注意力重构,Ms(F′)表示SAM对通道注意力重构的结果F′进行空间注意力重构,⊗表示逐元素乘法。

                                                       F′=Mc(F)⊗FF″=Ms(F′)⊗F′                               (1)

        CAM和SAM的结构如图3所示。图(a)展示了CAM的计算过程,输入特征图F的每个通道同时经过最大池化和平均池化,得出的中间向量经过一个多层感知机(multi-layer perceptron,MLP),为了减少计算量,MLP只设计一个隐层,最后对MLP输出的特征向量进行逐元素加法并进行Sigmoid激活操作,得到通道注意力Mc。图(b)展示了SAM的计算过程,经过Mc激活的特征图F′沿通道方向上分别进行最大池化和平均池化,对得到的中间向量进行卷积操作,卷积结果经过Sigmoid激活之后得到空间注意力Ms。

                                                                    CBAM结构 

                                                             CAM和SAM模块结构   

                 ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​Neck融合CBAM

        注意力机制最重要的功能是对特征图进行注意力重构,突出特征图中的重要信息,抑制一般信息,YOLOv5s网络中提取特征最关键的部分在Backbone,因此,本文将CBAM融合在Backbone之后,Neck网络的特征融合之前,这么做的原因是YOLOv5s在Backbone中完成了特征提取,经过Neck特征融合之后在不同的特征图上预测输出,CBAM在此处进行注意力重构,可以起到承上启下的作用,具体结构如上图所示。

4. 修改yolov5.yaml文件

# YOLOv5 🚀 by YOLOAir, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
   [-1, 1, CBAM, [1024]],

   [[17, 20, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

5.  ChannelAttentionModule.py

        新增一个ChannelAttentionModule.py文件,新增以下代码:

class ChannelAttentionModule(nn.Module):
    def __init__(self, c1, reduction=16):
        super(ChannelAttentionModule, self).__init__()
        mid_channel = c1 // reduction
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.shared_MLP = nn.Sequential(
            nn.Linear(in_features=c1, out_features=mid_channel),
            nn.LeakyReLU(0.1, inplace=True),
            nn.Linear(in_features=mid_channel, out_features=c1)
        )
        self.act = nn.Sigmoid()
        #self.act=nn.SiLU()
    def forward(self, x):
        avgout = self.shared_MLP(self.avg_pool(x).view(x.size(0),-1)).unsqueeze(2).unsqueeze(3)
        maxout = self.shared_MLP(self.max_pool(x).view(x.size(0),-1)).unsqueeze(2).unsqueeze(3)
        return self.act(avgout + maxout)
        
class SpatialAttentionModule(nn.Module):
    def __init__(self):
        super(SpatialAttentionModule, self).__init__()
        self.conv2d = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=7, stride=1, padding=3)
        self.act = nn.Sigmoid()
    def forward(self, x):
        avgout = torch.mean(x, dim=1, keepdim=True)
        maxout, _ = torch.max(x, dim=1, keepdim=True)
        out = torch.cat([avgout, maxout], dim=1)
        out = self.act(self.conv2d(out))
        return out

class CBAM(nn.Module):
    def __init__(self, c1,c2):
        super(CBAM, self).__init__()
        self.channel_attention = ChannelAttentionModule(c1)
        self.spatial_attention = SpatialAttentionModule()

    def forward(self, x):
        out = self.channel_attention(x) * x
        out = self.spatial_attention(out) * out
        return out

        然后 在./models/common.py文件中,导入模块 CBAM。

6. 修改yolo.py

        在for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']):内部加入以下代码:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

牛客NC343 和大于等于K的最短子数组【困难 前缀和 Java/Go】

题目 题目链接: https://www.nowcoder.com/practice/3e1fd3d19fb0479d94652d49c7e1ead1 思路 本答案利用前缀和解答,Java,Go答案通过,但是同样的代码用PHP的话有一个测试用例超时 应该还有更优秀的答案,后面找到更优…

如何远程操作服务器中的Python编译器并将运行结果返回到Pycharm

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

分布式与一致性协议之PBFT算法(一)

PBFT算法 概述 前面提到了拜占庭将军问题之后,有人可能会感到困惑:口信消息型拜占庭问题直接在实际项目中是如何落地的呢?事实上,它很难在实际项目中落地,因为口信消息型拜占庭问题之解是一个非常理论化的算法,没有与…

C++类的概念以及用法

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…

《Fundamentals of Power Electronics》——转换器的传递函数

转换器的工程设计过程主要由以下几个主要步骤组成: 1. 定义了规范和其他设计目标。 2. 提出了一种电路。这是一个创造性的过程,利用了工程师的物理洞察力和经验。 3. 对电路进行了建模。组件和系统的其他部分适当建模,通常使用供应商提供的…

祝天下母亲节快乐!虚无!——早读(逆天打工人爬取热门微信文章解读)

练功加精力哦 引言Python 代码第一篇 人民日报【夜读】人与人之间最好的关系:遇事靠谱,懂得感恩第二篇 冯站长之家 三分钟新闻早餐结尾 感恩与善行 是人生旅途中的灯塔 怀感恩之心 行小善之事 它们将指引我们走向光明 引言 今天是母亲节 祝天下的所有母…

三星硬盘格式化后怎么恢复数据

在数字化时代,硬盘作为数据存储的核心部件,承载着我们的重要文件、照片、视频等资料。然而,不慎的格式化操作可能使我们失去宝贵的数据。面对这样的困境,许多用户可能会感到无助和焦虑。本文旨在为三星硬盘用户提供格式化后的数据…

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

vue3 element plus el-date-picker组件在日期上做标识

1.先看效果图,带红点的就是我要做标识的日期 2.直接把代码拿出来就可以用 (1)html部分 <el-date-pickerv-model"startTime"type"datetime"placeholder"选择开始日期"format"YYYY-MM-DD HH:mm"value-format"YYYY-MM-DD HH:mm…

基于ChatGLM+Langchain离线搭建本地知识库(免费)

目录 简介 服务部署 实现本地知识库 测试 番外 简介 ChatGLM-6B是清华大学发布的一个开源的中英双语对话机器人。基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT…

大模型微调之 在亚马逊AWS上实战LlaMA案例(八)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;八&#xff09; 微调技术 Llama 等语言模型的大小超过 10 GB 甚至 100 GB。微调如此大的模型需要具有非常高的 CUDA 内存的实例。此外&#xff0c;由于模型的大小&#xff0c;训练这些模型可能会非常慢。因此&#xff0c…

计算机网络(网络原理与应用)之高级交换实验------冗余环路与生成树协议

一、实验目的 (1)了解生成树协议的作用&#xff1b; (2)熟悉生成树协议的配置。 二、应用环境 采用生成树协议可以避免环路。 生成树协议的根本目的是将一个存在物理环路的交换网络变成一个没有环路的逻辑树形网络。IEEE802.ID协议通过在交换机上运行一套复杂的算法STA(sp…

Springboot+Vue项目-基于Java+MySQL的影院订票系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

英语复习之英语形近词总结(三)

英语形近词总结复习第三部分: 单词释义例句 adorn 英 /əˈdɔːn/ 美 /əˈdɔːrn/ vt.装饰&#xff1b;使生色&#xff1a;n.(Adorn)人名&#xff1b;&#xff08;泰&#xff09;阿隆 1.They wash and wax the cars, go on and on about them—some even adorn them with …

【GESP】2024年03月图形化二级 -- 找因数

找因数 【题目描述】 默认小猫角色和白色背景。 小杨最近刚刚学习了因数的概念&#xff0c;具体来说&#xff0c;如果一个正整数 a a a 可以被另一个正整数 b b b 整除&#xff0c;那么我们就说 b b b 是 a a a 的因数&#xff0c;例如6可以被1、2、3、6整除&#xff0c;…

[BJDCTF2020]ZJCTF,不过如此 1

涉及&#xff1a;php的伪协议、preg_replace函数的漏洞和正则表达式的运用。 解题步骤 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream"))…

JeeSite 平台 Spring Boot 3 体验版发布,一个 Java 快速开发平台

引言 是时候为 Spring Boot 3 做准备了&#xff0c;2018年2月 Spring Boot 进入 2.0 时代&#xff0c;距今已经 5 年了。2022 年 11 月 Spring Boot 3.0 正式发布&#xff0c;它将基于 Spring Framework 6.0&#xff0c;并且需要 Java 17 版本&#xff0c;同时它也将是 Jakart…

AI仿站源码教程

AI仿站源码教程 随着AI技术的不断发展&#xff0c;仿站技术已经越来越成熟&#xff0c;通过AI一键仿站&#xff0c;开发者们可以更快速、更高效地搭建网站。传统的前端开发过程中&#xff0c;需要大量的手工编码和设计&#xff0c;而AI仿站技术可以通过截图或视频&#xff0c;…

LoRaWAN入门

1.文档资料 飞书云文档 (feishu.cn) G43室内LoRaWAN网关 - doc.alinkwise.com > LoRaWAN网关&#xff08;基站&#xff09; > G4x > G43室内LoRaWAN网关 2.简介 LoRa: 远距离无线电&#xff08;long rang radio), 它最大特点就是在同样的功耗条件下比其他无线方式…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念&#xff0c;多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景&#xff0c;可以充分利用多核处理器和系统资源&#xff0c;提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…