位置: IT常识 - 正文

Yolov5添加注意力机制(yolov5添加注意力机制真的有用吗?)

编辑:rootadmin
Yolov5添加注意力机制 一、在backbone后面引入注意力机制

推荐整理分享Yolov5添加注意力机制(yolov5添加注意力机制真的有用吗?),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:yolov5添加注意力机制后可以剪枝吗,yolov5添加注意力机制,yolov5添加注意力机制效果怎么样,yolov5添加注意力机制mAP提高吗,yolov5添加注意力机制,yolov5添加注意力机制后精确度降低,yolov5添加注意力机制,但精确度没提高,yolov5添加注意力机制,内容如对您有帮助,希望把文章链接给更多的朋友!

1、先把注意力结构代码放到common.py文件中,以SE举例,将这段代码粘贴到common.py文件中

2、找到yolo.py文件里的parse_model函数,将类名加入进去

3、修改配置文件(我这里拿yolov5s.yaml举例子),将注意力层加到你想加入的位置;常用的一般是添加到backbone的最后一层,或者C3里面,这里是加在了最后一层

当在网络中添加了新的层之后,那么该层网络后续的层的编号都会发生改变,看下图,原本Detect指定的是[ 17 , 20 , 23 ]层,所以在我们添加了SE注意力层之后也要Detect对这里进行修改,即原来的17层变成了18 层;原来的20层变成了21 层;原来的23层变成了24 层;所以Detecet的from系数要改为[ 18 , 21 , 24 ] 

Yolov5添加注意力机制(yolov5添加注意力机制真的有用吗?)

同样的,Concat的from系数也要修改,这样才能保持原网络结构不发生特别大的改变,我们刚才把SE层加到了第9层,所以第9层之后的编号都会加1,这里我们要把后面两个Concat的from系数分别由[ − 1 , 14 ] , [ − 1 , 10 ]改为[ − 1 , 15 ] , [ − 1 , 11 ]

二、在残差模块Bottleneck中引入注意力机制(SimAM/CA)SimAM

1、将SimAM代码加入到common.py文件中,

#SimAMclass simam_module(torch.nn.Module): def __init__(self, channels=None, e_lambda=1e-4): super(simam_module, self).__init__() self.activaton = nn.Sigmoid() self.e_lambda = e_lambda def __repr__(self): s = self.__class__.__name__ + '(' s += ('lambda=%f)' % self.e_lambda) return s @staticmethod def get_module_name(): return "simam" def forward(self, x): b, c, h, w = x.size() n = w * h - 1 x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2) y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5 return x * self.activaton(y)

 2、在common.py的残差结构中引入SimAM,即重新定义一个含有SimAM的类Bottleneck_SimAM

#将SimAM注意力机制加在bottleneck里面class Bottleneck_SimAM(nn.Module): # Standard bottleneck def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion super(Bottleneck_SimAM, self).__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_, c2, 3, 1, g=g) self.add = shortcut and c1 == c2 self.attention = simam_module(channels=c2) def forward(self, x): return x + self.attention(self.cv2(self.cv1(x))) if self.add else self.cv2(self.cv1(x))

3、然后找到yolo.py文件里的parse_model函数,将类Bottleneck_SimAM加入进去并将原类名Bottleneck删除,这样就把注意力SimAM引入的残差结构中了

CA

1、将CoordAtt代码加入到common.py文件中,

# CoordAtt注意力机制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 = x n, c, h, w = x.size() # c*1*W x_h = self.pool_h(x) # c*H*1 # C*1*h x_w = self.pool_w(x).permute(0, 1, 3, 2) y = torch.cat([x_h, x_w], dim=2) # C*1*(h+w) 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_h return out

2、在common.py的残差结构中引入CA,即重新定义一个含有SimAM的类Bottleneck_CA,

# 将CA注意力机制加在bottleneck里面class Bottleneck_CA(nn.Module): # Standard bottleneck def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion super(Bottleneck_CA, self).__init__() c_ = int(c2 * e) # hidden channels self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_, c2, 3, 1, g=g) self.add = shortcut and c1 == c2 self.attention = CoordAtt(inp=c2) def forward(self, x): return x + self.attention(self.cv2(self.cv1(x))) if self.add else self.cv2(self.cv1(x))

3、然后找到yolo.py文件里的parse_model函数,将类Bottleneck_CA加入进去并将原类名Bottleneck删除,这样就把注意力CA引入的残差结构中了

三、在YOLOV5的Backbone、Neck、Head模块中分别引入注意力机制1、Backbone

2、Neck

 3、Head 

 

reference

手把手带你Yolov5 (v6.1)添加注意力机制(一)(并附上30多种顶会Attention原理图)_迪菲赫尔曼的博客-CSDN博客_yolov5添加注意力机制https://blog.csdn.net/weixin_43694096/article/details/124443059

注意力机制(SE、Coordinate Attention、CBAM、ECA,SimAM)、即插即用的模块整理_吴大炮的博客-CSDN博客_se注意力机制https://blog.csdn.net/weixin_44645198/article/details/122102201#comments_21981724

本文链接地址:https://www.jiuchutong.com/zhishi/295155.html 转载请保留说明!

上一篇:分享 6 个 Vue3 开发必备的 VSCode 插件(vue3开发app)

下一篇:Chrome谷歌浏览器强制刷新页面(不使用缓存)(Chrome谷歌浏览器网页)

  • 唯品会官方微博,一夜之间清空30000多条微博(唯品会官方微博)

    唯品会官方微博,一夜之间清空30000多条微博(唯品会官方微博)

  • qq黄钻能退款吗(qq黄钻能退款吗怎么退)

    qq黄钻能退款吗(qq黄钻能退款吗怎么退)

  • 华为nova5的耳机插哪里(华为nova5的耳机孔)

    华为nova5的耳机插哪里(华为nova5的耳机孔)

  • 小米云回收站是空的(小米云盘回收站)

    小米云回收站是空的(小米云盘回收站)

  • pencil序列号在哪里看(pencil序列号查询入口)

    pencil序列号在哪里看(pencil序列号查询入口)

  • 荣耀x10支持wifi6吗(荣耀X10支持快充吗)

    荣耀x10支持wifi6吗(荣耀X10支持快充吗)

  • 分页打印怎么保留表头(分页打印怎么保留表头和表尾)

    分页打印怎么保留表头(分页打印怎么保留表头和表尾)

  • 你撤回了一条消息重新编辑(你撤回了一条消息表情包)

    你撤回了一条消息重新编辑(你撤回了一条消息表情包)

  • 苹果充值限制要几小时(苹果充值限制要等多久)

    苹果充值限制要几小时(苹果充值限制要等多久)

  • 抖音视频上传成功但是别人看不到(抖音视频上传成功后看非常卡顿)

    抖音视频上传成功但是别人看不到(抖音视频上传成功后看非常卡顿)

  • 电脑pe是什么意思(电脑的pe是什么意思)

    电脑pe是什么意思(电脑的pe是什么意思)

  • 苹果耳机有几代(苹果耳机有几代 年份)

    苹果耳机有几代(苹果耳机有几代 年份)

  • 抖音的回流刷是什么意思(直播回流刷是什么意思,抖音什么叫回流刷)

    抖音的回流刷是什么意思(直播回流刷是什么意思,抖音什么叫回流刷)

  • ip协议的含义(ip协议的理解)

    ip协议的含义(ip协议的理解)

  • 知乎删除评论对方能看到吗(知乎删除评论对人有害吗)

    知乎删除评论对方能看到吗(知乎删除评论对人有害吗)

  • qq情侣空间怎么设置别人看到(qq情侣空间怎么看别人的情侣是谁)

    qq情侣空间怎么设置别人看到(qq情侣空间怎么看别人的情侣是谁)

  • 华为p30怎么拍月亮(华为p30怎么拍月亮最清楚)

    华为p30怎么拍月亮(华为p30怎么拍月亮最清楚)

  • vsco包年会员怎么取消(vsco怎么取消订阅)

    vsco包年会员怎么取消(vsco怎么取消订阅)

  • 荣耀20怎么清理运行内存(荣耀20怎么清理正在运行程序)

    荣耀20怎么清理运行内存(荣耀20怎么清理正在运行程序)

  • 微信被举报了怎么解除(微信如何投诉对方才能封号)

    微信被举报了怎么解除(微信如何投诉对方才能封号)

  • 抖音网络不可用怎么回事(抖音网络无法使用)

    抖音网络不可用怎么回事(抖音网络无法使用)

  • 如何加强网络安全防范(如何加强网络安全管理)

    如何加强网络安全防范(如何加强网络安全管理)

  • 红米note7返回键怎么设置(红米note7怎么返回桌面)

    红米note7返回键怎么设置(红米note7怎么返回桌面)

  • 网络覆盖范围分类(网络覆盖范围分为哪三类)

    网络覆盖范围分类(网络覆盖范围分为哪三类)

  • procreate背景如何透明(procreate背景如何存为模板)

    procreate背景如何透明(procreate背景如何存为模板)

  • p30有悬浮按钮吗(p30屏幕上的悬浮按钮怎么弄)

    p30有悬浮按钮吗(p30屏幕上的悬浮按钮怎么弄)

  • uc隐藏相册在哪里(uc隐藏相册在哪里打开)

    uc隐藏相册在哪里(uc隐藏相册在哪里打开)

  • win10系统高级打印怎么改为普通打印?(win10高级功能)

    win10系统高级打印怎么改为普通打印?(win10高级功能)

  • 一般纳税人优惠政策最新2022标准
  • 运费收入算销售收入吗
  • 法人购买车险发票怎么开
  • 交车险代收的车船费怎么做的科目呀?
  • 需要冲红的普通发票无法收回怎么办
  • 工资费用分配表属于什么凭证
  • 土地增值税预征率
  • 当月报废生产设备一台,原价80万元
  • 融资租赁承租方会计账务处理流程
  • 增值税一般纳税人证明怎么查询
  • 进项较大航天信息怎么填
  • 阿里云增值税专用发票
  • 股息红利是否交个人所得税
  • 钢板租赁费用
  • 购进货物运费会退吗
  • 交通定额发票税率
  • 公司买的油烟机可以抵扣进项税吗
  • 招待客人买的烟计入业务招待费吗
  • 公账的钱如何合法取出会计
  • 采购的增值税
  • 会议展览服务费需要交印花税吗
  • 个体工商户未给员工缴纳社保
  • 损益类科目的借方是增加还是减少
  • 事业单位财政拨款是编制吗
  • 美元汇户和钞户的区别
  • 先发货后开票的销售业务流程
  • vbs win10
  • php表单系统源码
  • 收到融资款如何做账
  • php判断ua
  • 我国现行的关税税率种类及适用
  • 进口付汇业务流程
  • 房地产开发企业增值税怎么算
  • 自然保护什么意思
  • 公司盈利怎么分配给股东
  • php array_reverse 以相反的顺序返回数组实例代码
  • yii2实现根据时间搜索的方法
  • pytorch如何学
  • php自定义表单
  • phpstorm wsl
  • 定期存款应计入会计哪个科目
  • 小规模纳税人减按1%账务处理
  • 进项发票和销项发票金额相同还需要交税金吗
  • 预付账款的会计处理
  • vscode yaml插件
  • php框架是干什么的
  • 营改增分录
  • 付员工经济补偿金的分录
  • 企业所得税计提分录
  • 奖金如何做账会计分录
  • 社保为什么单位缴费是0什么时间才正常
  • 拍卖车牌收入需要缴纳什么税
  • 避税的形式
  • 交耕地占用税如何交
  • 再保险业务范围
  • 收到境外支付的咨询费免税吗
  • 房地产企业收到政府补助
  • 资金占用费如何计算企业所得税
  • 收到的稳岗补贴要交企业所得税吗
  • 发票内容可以写工程款吗
  • 财政性银行的资金来源是什么
  • mysql 5.7.28安装
  • windows server 2008 日志文件在哪
  • win8硬盘重装
  • win8.1怎么安装appx没有许可证
  • 新买的苹果电脑没有电
  • 新手菜鸟什么意思
  • mac和iphone互动
  • ps显示操作步骤
  • win7不能自动启动
  • ping命令详解步骤
  • cocos2dx开发的游戏有哪些
  • android常用命令
  • 用vue写登录页面
  • 深入探究替换词
  • JavaScript、jQuery与Ajax的关系
  • 原生js
  • 四川省税务局发票查询
  • 中国个人所得税是多少?
  • 四季度预缴申报表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设