YOLOV5 6.0加入CA注意力机制(看了包会)
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注意力机制(看了包会)相关推荐
- yolov5-6.0/6.1加入SE、CBAM、CA注意力机制(理论及代码)
自从yolov5-5.0加入se.cbam.eca.ca发布后,反响不错,也经常会有同学跑过来私信我能不能出一期6.0版本加入注意力的博客.个人认为是没有必要专门写一篇来讲,因为步骤几乎一样,但是问的 ...
- 在yolov5的网络结构中添加注意力机制模块
知足知不足,有为有不为 目录 前言 一.模块添加步骤 二.相应注意力机制介绍及其代码 1.SE注意力 2.CBAM注意力
- Yolov5添加注意力机制
一.在backbone后面引入注意力机制 1.先把注意力结构代码放到common.py文件中,以SE举例,将这段代码粘贴到common.py文件中 2.找到yolo.py文件里的parse_model ...
- YOLOv5添加注意力机制的具体步骤
本文以CBAM和SE注意力机制的添加过程为例,主要介绍了向YOLOv5中添加注意力机制的具体步骤 本文在此篇博客的基础上向YOLOv5-5.0版本代码中添加注意力机制 yolov5模型训练---使用y ...
- 小目标检测3_注意力机制_Self-Attention
主要参考: (强推)李宏毅2021/2022春机器学习课程 P38.39 李沐老师:64 注意力机制[动手学深度学习v2] 手把手带你Yolov5 (v6.1)添加注意力机制(一)(并附上30多种顶会 ...
- 【Attention九层塔】注意力机制的九重理解
本文作者:电光幻影炼金术 研究生话题Top1,上海交大计算机第一名,高中物理竞赛一等奖,段子手,上海交大计算机国奖,港中文博士在读 https://zhuanlan.zhihu.com/p/36236 ...
- Attention九层塔:注意力机制的九重理解
Attention现在已经火爆了整个AI领域,不管是机器视觉还是自然语言处理,都离不开Attention.transformer或者BERT.下面我效仿EM九层塔,提出Attention九层塔.希望能 ...
- yolov5-5.0加入CBAM,SE,CA,ECA注意力机制
CBAM注意力 yolo.py和yaml文件中相应的CBAMC3也要换成CBAM,下面的SE同理 class ChannelAttention(nn.Module):def __init__(self ...
- Yolov5 网络改进之增加SE、CBAM、CA、ECA等注意力机制
本文以Yolov5 6.0版本为例,讲解如何添加SE.CA.ECA.CBAM等即插即用的小模块,可同时适配其他网络结构.在这之前需要明白yolov5文件夹的三个小点: models\common.py ...
最新文章
- png 微软ppt 透明度_用5个技巧教你做出让人眼前一亮的「PPT章节页」,一看就会...
- CentOS x64上Matlab R2015b的镜像安装方法与卸载
- 理解CSS3中的background-size(对响应性图片等比例缩放)
- C语言各种变量的初始化
- BUU_刷题之旅(One)
- print($arr,true)的参数true表示将$arr的值返会,而不是打印
- android.view.VelocityTracker
- 中源幼儿园收费管理系统 pdf软件
- office 快捷键
- 为什么打工人996会猝死,而老板007不会?
- windows系统部署docker文档
- My Thirty-fifth Page - 最大二叉树 - By Nicolas
- 前方高能!公司来了一个low逼程序员
- 取消pycharm双击shift出现搜索框,但新版找不到ide.suppress.double.click.handler的问题解决
- 计算机无法调节亮度,win10屏幕亮度没反应如何处理_win10电脑屏幕亮度调不了怎么办...
- 5分钟给商品建立3D模型,我是如何做到的?
- php图片处理更新,PHP图片处理的函数学习 | Soo Smart!
- python开根号函数图像,使用matplotlib / python的平方根刻度
- PMBOK(第六版) PMP笔记——《第十三章 项目干系人管理》
- ---中南海香烟---系列[男人应该抽的烟]
热门文章