YOLOV5 6.0手把手教你加入CA注意力机制

文章目录

    • YOLOV5 6.0手把手教你加入CA注意力机制
  • yolov5加入注意力机制步骤
  • 一、common.py
  • 二、yolo.py
  • 三.创建自定义的yaml文件
  • 四. 验证加入注意力机制是否正确
  • 总结

yolov5加入注意力机制步骤

1.common.py添加相应条件
2.yolo.py添加判断条件
3.创建属于自己的注意力yaml文件


提示:以下是本篇文章正文内容,下面案例可供参考

一、common.py

在common.py中先添加你想添加的注意力模块

class h_sigmoid(nn.Module):def __init__(self, inplace=True):super(h_sigmoid, self).__init__()self.relu = nn.ReLU6(inplace=inplace)def forward(self, x):return self.relu(x + 3) / 6class h_swish(nn.Module):def __init__(self, inplace=True):super(h_swish, self).__init__()self.sigmoid = h_sigmoid(inplace=inplace)def forward(self, x):return x * self.sigmoid(x)class CoordAtt(nn.Module):def __init__(self, inp, oup, reduction=32):super(CoordAtt, self).__init__()self.pool_h = nn.AdaptiveAvgPool2d((None, 1))self.pool_w = nn.AdaptiveAvgPool2d((1, None))mip = max(8, inp // reduction)self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)self.bn1 = nn.BatchNorm2d(mip)self.act = h_swish()self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)def forward(self, x):identity = xn, c, h, w = x.size()x_h = self.pool_h(x)x_w = self.pool_w(x).permute(0, 1, 3, 2)y = torch.cat([x_h, x_w], dim=2)y = self.conv1(y)y = self.bn1(y)y = self.act(y)x_h, x_w = torch.split(y, [h, w], dim=2)x_w = x_w.permute(0, 1, 3, 2)a_h = self.conv_h(x_h).sigmoid()a_w = self.conv_w(x_w).sigmoid()out = identity * a_w * a_hreturn outclass SELayer(nn.Module):def __init__(self, c1, r=16):super(SELayer, self).__init__()self.avgpool = nn.AdaptiveAvgPool2d(1)self.l1 = nn.Linear(c1, c1 // r, bias=False)self.relu = nn.ReLU(inplace=True)self.l2 = nn.Linear(c1 // r, c1, bias=False)self.sig = nn.Sigmoid()def forward(self, x):b, c, _, _ = x.size()y = self.avgpool(x).view(b, c)y = self.l1(y)y = self.relu(y)y = self.l2(y)y = self.sig(y)y = y.view(b, c, 1, 1)return x * y.expand_as(x)class eca_layer(nn.Module):"""Constructs a ECA module.Args:channel: Number of channels of the input feature mapk_size: Adaptive selection of kernel size"""def __init__(self, channel, k_size=3):super(eca_layer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# feature descriptor on the global spatial informationy = self.avg_pool(x)# Two different branches of ECA moduley = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)# Multi-scale information fusiony = self.sigmoid(y)x = x * y.expand_as(x)return x * y.expand_as(x)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.sharedMLP = nn.Sequential(# nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(),# nn.Conv2d(in_planes // rotio, 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):avg_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)x = self.conv(x)return self.sigmoid(x)class CBAMC3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper(CBAMC3, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.channel_attention = ChannelAttention(c2, 16)self.spatial_attention = SpatialAttention(7)# self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])def forward(self, x):out = self.channel_attention(x) * xprint('outchannels:{}'.format(out.shape))out = self.spatial_attention(out) * outreturn out

二、yolo.py

def parse_model(d, ch):函数下
在下面代码中增加你想添加的注意力名称

        if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,BottleneckCSP, C3, C3TR, C3SPP, C3Ghost]:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]if m in [BottleneckCSP, C3, C3TR, C3Ghost]:args.insert(2, n)  # number of repeatsn = 1

添加后为:

        if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, CoordAtt]:c1, c2 = ch[f], args[0]if c2 != no:  # if not outputc2 = make_divisible(c2 * gw, 8)args = [c1, c2, *args[1:]]if m in [BottleneckCSP, C3, C3TR, C3Ghost]:args.insert(2, n)  # number of repeatsn = 1

三.创建自定义的yaml文件

这里我使用的是yolov5s.yaml为模板,再里面插入了CA注意力机制。注意力机制放置的位置并不是唯一的,需要根据你的数据集来摸索测试,可能别人放这儿涨点了,但是你放这儿没有效果,俗称“玄学”。
CA.yaml代码如下(示例):

# YOLOv5 												

YOLOV5 6.0加入CA注意力机制(看了包会)相关推荐

  1. yolov5-6.0/6.1加入SE、CBAM、CA注意力机制(理论及代码)

    自从yolov5-5.0加入se.cbam.eca.ca发布后,反响不错,也经常会有同学跑过来私信我能不能出一期6.0版本加入注意力的博客.个人认为是没有必要专门写一篇来讲,因为步骤几乎一样,但是问的 ...

  2. 在yolov5的网络结构中添加注意力机制模块

    知足知不足,有为有不为 目录 前言 一.模块添加步骤 二.相应注意力机制介绍及其代码 1.SE注意力 2.CBAM注意力

  3. Yolov5添加注意力机制

    一.在backbone后面引入注意力机制 1.先把注意力结构代码放到common.py文件中,以SE举例,将这段代码粘贴到common.py文件中 2.找到yolo.py文件里的parse_model ...

  4. YOLOv5添加注意力机制的具体步骤

    本文以CBAM和SE注意力机制的添加过程为例,主要介绍了向YOLOv5中添加注意力机制的具体步骤 本文在此篇博客的基础上向YOLOv5-5.0版本代码中添加注意力机制 yolov5模型训练---使用y ...

  5. 小目标检测3_注意力机制_Self-Attention

    主要参考: (强推)李宏毅2021/2022春机器学习课程 P38.39 李沐老师:64 注意力机制[动手学深度学习v2] 手把手带你Yolov5 (v6.1)添加注意力机制(一)(并附上30多种顶会 ...

  6. 【Attention九层塔】注意力机制的九重理解

    本文作者:电光幻影炼金术 研究生话题Top1,上海交大计算机第一名,高中物理竞赛一等奖,段子手,上海交大计算机国奖,港中文博士在读 https://zhuanlan.zhihu.com/p/36236 ...

  7. Attention九层塔:注意力机制的九重理解

    Attention现在已经火爆了整个AI领域,不管是机器视觉还是自然语言处理,都离不开Attention.transformer或者BERT.下面我效仿EM九层塔,提出Attention九层塔.希望能 ...

  8. yolov5-5.0加入CBAM,SE,CA,ECA注意力机制

    CBAM注意力 yolo.py和yaml文件中相应的CBAMC3也要换成CBAM,下面的SE同理 class ChannelAttention(nn.Module):def __init__(self ...

  9. Yolov5 网络改进之增加SE、CBAM、CA、ECA等注意力机制

    本文以Yolov5 6.0版本为例,讲解如何添加SE.CA.ECA.CBAM等即插即用的小模块,可同时适配其他网络结构.在这之前需要明白yolov5文件夹的三个小点: models\common.py ...

最新文章

  1. png 微软ppt 透明度_用5个技巧教你做出让人眼前一亮的「PPT章节页」,一看就会...
  2. CentOS x64上Matlab R2015b的镜像安装方法与卸载
  3. 理解CSS3中的background-size(对响应性图片等比例缩放)
  4. C语言各种变量的初始化
  5. BUU_刷题之旅(One)
  6. print($arr,true)的参数true表示将$arr的值返会,而不是打印
  7. android.view.VelocityTracker
  8. 中源幼儿园收费管理系统 pdf软件
  9. office 快捷键
  10. 为什么打工人996会猝死,而老板007不会?
  11. windows系统部署docker文档
  12. My Thirty-fifth Page - 最大二叉树 - By Nicolas
  13. 前方高能!公司来了一个low逼程序员
  14. 取消pycharm双击shift出现搜索框,但新版找不到ide.suppress.double.click.handler的问题解决
  15. 计算机无法调节亮度,win10屏幕亮度没反应如何处理_win10电脑屏幕亮度调不了怎么办...
  16. 5分钟给商品建立3D模型,我是如何做到的?
  17. php图片处理更新,PHP图片处理的函数学习 | Soo Smart!
  18. python开根号函数图像,使用matplotlib / python的平方根刻度
  19. PMBOK(第六版) PMP笔记——《第十三章 项目干系人管理》
  20. ---中南海香烟---系列[男人应该抽的烟]

热门文章

  1. 常州大学计算机专业研究生怎么样,常州大学计算机应用技术考研经验
  2. linux 出现running guests on default URT情况解决
  3. 为什么建议iOS开发使用Swift
  4. # Freda的队列
  5. MYSQL语句按中文拼音排序
  6. Vue 使用XLSX导出excel,并且设置标题背景颜色、字体、居中。并且在前端导出成excel文件
  7. Android 能让你少走弯路的干货整理
  8. 生产进度管理系统为制造管理提供较完善的解决方案
  9. regexp_substr()用法
  10. 常见浏览器兼容性问题大全