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

YOLOv8多种方法改进CBAM注意力机制有效提升检测精度(已跑通)

一、CBAM概念

        CBAM(Convolutional Block Attention Module)是一种用于卷积神经网络(CNN)的注意力机制,旨在提高网络的表现能力。它通过引入两个注意力模块来增强特征图的表达能力。

二、源码:

class ChannelAttention(nn.Module):def __init__(self, in_planes, ratio=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.max_pool = nn.AdaptiveMaxPool2d(1)self.f1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)self.relu = nn.ReLU()self.f2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = self.f2(self.relu(self.f1(self.avg_pool(x))))max_out = self.f2(self.relu(self.f1(self.max_pool(x))))out = self.sigmoid(avg_out + max_out)return outclass SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()assert kernel_size in (3, 7), 'kernel size must be 3 or 7'padding = 3 if kernel_size == 7 else 1self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# 1*h*wavg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)x = torch.cat([avg_out, max_out], dim=1)# 2*h*wx = self.conv(x)# 1*h*wreturn self.sigmoid(x)class CBAM(nn.Module):def __init__(self, c1, c2, ratio=16, kernel_size=7):  # ch_in, ch_out, number, shortcut, groups, expansionsuper(CBAM, self).__init__()self.channel_attention = ChannelAttention(c1, ratio)self.spatial_attention = SpatialAttention(kernel_size)def forward(self, x):out = self.channel_attention(x) * x# c*h*w# c*h*w * 1*h*wout = self.spatial_attention(out) * outreturn out

三、改进步骤

第一步,在ultralytics/nn/modules/conv.py文件内添加注意力源码

d2f0126059c743c6be85eae2f0b87794.png

第二步,在ultralytics/nn/modules/init.py文件内,按下图标识的地方添加注意力名

第一处:在from .conv import()处最后,添加注意力名称

e09a694c0f544d4da5904b9d3b8d85ed.png

第二处:在__all__={}处最后,添加注意力名称 

f6c0b28f7a7e45b48982052209a16b4b.png

第三步,在ultralytics/nn/tasks.py文件内,

首先,在from ultralytics.nn.modules import 处添加CBAM

50361f26a85f44e6b1fc95a4d49c5fce.png

        其次,键盘点击CTRL+shift+F打开查找界面,搜索elif m in ,在该函数下方有一堆的elif m in XXX,在某一个elif下方添加如下代码

        elif m in {CBAM}:c1, c2 = ch[f], args[0]if c2 != nc:  # if not outputc2 = make_divisible(min(c2, max_channels) * width, 8)args = [c1, c2, *args[1:]]

 c83a45ec29944c029b553eb675fdbd92.png

 第五步,在ultralytics/cfg/models/v8文件下,复制yolov8.yaml,并改成自己的名字(如yolov8-CBAM.yaml)

第一种修改方法,在backbone中添加CABM,因为添加了一层CABM,所以在Detect处也要相应的做出修改,如下:

b784458bd35b419da353dabf7ef29f5a.png

运行结果:

ea1793c4de0a41c29e669d6092778590.png

第二张修改方法,在backbone和head中分别添加CABM,Detect处也要根据添加的层数做出相应的做出修改,如下:

87e32732709746eabb9a8c0d6e354ff6.png

运行结果:

50fc6b5fbd184e0f96228ac33ce953a2.png

 


http://www.mrgr.cn/news/10775.html

相关文章:

  • [Android studio]无法联网
  • Linux常用应急排查命令(持续更新)
  • ElasticSearch 的单点部署环境搭建
  • CSS学习笔记(01)flex布局
  • MFC之word操作
  • [数据集][目标检测]电力场景输电线均压环歪斜检测数据集VOC+YOLO格式303张2类别
  • 打手机检测算法源码样本展示打手机检测算法实际应用场景介绍
  • 人脸质量评价:深入解析和实现
  • 【Node】m1 mac 使用 nvm 安装 node v14 报错
  • 容器的ip地址不稳定问题、联合文件系统、核对时间、制作基础镜像
  • 突破编程:深入理解C++中的组合模式
  • docker容器run命令设置
  • Linux中断管理
  • STC89C52 定时器浅谈
  • 树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例
  • 深度优先搜索模板
  • 【Material-UI】Radio Group中的 Label Placement 属性详解
  • 【Solidity】支付
  • SparkSQL数值模式详解
  • 【功能实现】axios实现动态数据