平面设计师服务平台,如何给网站做排名优化,wordpress文章批量编辑器,超碰网站正在建设中1. 文章主要内容 本篇博客主要涉及规范化注意力机制#xff0c;融合到YOLOv5(v6.1版本#xff0c;去掉了Focus模块)模型中#xff0c;通过惩罚机制#xff0c;调整特征权重因子#xff0c;使模型更加关注有效特征#xff0c;助力模型涨点。
2. 简要概括 论文地址#x…1. 文章主要内容 本篇博客主要涉及规范化注意力机制融合到YOLOv5(v6.1版本去掉了Focus模块)模型中通过惩罚机制调整特征权重因子使模型更加关注有效特征助力模型涨点。
2. 简要概括 论文地址NAM论文地址 论文Github代码Github代码 NAM注意力机制在2021年的时候就挂在arxiv上博主最近逛了一逛发现其github代码的关键模块中还是缺乏了论文当中的空间注意力模块只提供了通道注意力模块所以这篇论文的NAM在代码层面上只利用了通道注意特征如下图所示。 亮点在于NAM的核心思想在于通过调整利用稀疏的权重惩罚来降低不太显著的特征(换句话说对显著有效特征更加关注)的权重使得整体注意力权重在计算上保持同样性能的情况下变得更加高效助力模型高效涨点有兴趣的可以阅读原论文 分析NAM也是一个即插即用的注意力模块可以融合到YOLOv5网络结构中的任何地方前提是通道等维度对齐。另外因为论文代码只提高了通道注意力且一般情况下高维度的通道特征比较丰富换句话说网络深度越深通道数越高其高层次的语义特征也就会越丰富所以建议将NAM放在网络更深层次有助于提取丰富的高层次特征助力模型涨点下面给出NAM原论文中的一个结构图注意只针对于通道注意力
3. 详细代码改进流程 接下来记录一下将NAM添加到YOLOv5模型中某一个地方的实验过程。注意到(在后面的yolov5-NAM.yaml中体现)本文是将NAM添加在检测大目标的检测头的前面也就是23层 (P5/32-large)的后面添加了一层后面的Detect序号也得增加一变成[[17, 20, 24], 1, Detect, [nc, anchors]]!
3.1新建一个NAM的py文件放置源代码 首先新建一个NAM.py存放其源代码博主在此文件中还提供了一个main函数的测试案例启动可以正常输出就证明模块木有问题通道数对得上。
import torch.nn as nn
import torchclass Channel_Att(nn.Module):def __init__(self, channels, t16):super(Channel_Att, self).__init__()self.channels channelsself.bn2 nn.BatchNorm2d(self.channels, affineTrue)def forward(self, x):residual xx self.bn2(x)weight_bn self.bn2.weight.data.abs() / torch.sum(self.bn2.weight.data.abs())x x.permute(0, 2, 3, 1).contiguous()x torch.mul(weight_bn, x)x x.permute(0, 3, 1, 2).contiguous()x torch.sigmoid(x) * residual #return xclass NAMAttention(nn.Module):def __init__(self, channels, out_channelsNone, no_spatialTrue):super(NAMAttention, self).__init__()self.Channel_Att Channel_Att(channels)def forward(self, x):x_out1 self.Channel_Att(x)return x_out1if __name__ __main__:model NAMAttention(64)inputs torch.randn((1, 64, 64, 64))print(model(inputs).size())3.2新建一个yolov5-NAM.yaml文件 然后新建一个yolov5-NAM.yaml文件同时 注意nc改为自己数据集的类别数。另外yaml文件中NAMAttention的位置其实可以放置在任何地方只需要调试好通道数输入输出即可。
# YOLOv5 by Ultralytics, GPL-3.0 license# Parameters
nc: 10 # 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 output_channel, kernel_size, stride, padding[-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, NAMAttention, [1024]],# 修改[[17, 20, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
3.3 将NAM引入到yolo.py文件中 在下图的红色圈内位置处引入NAMAttention并手动导入相应的包即可。代码和示意图如下 elif m is NAMAttention:c1, c2 ch[f], args[0]if c2 ! no:c2 make_divisible(c2 * gw, 8)args [c1, *args[1:]]3.4 修改train.py启动文件 修改配置文件为yolov5-NAM.yaml即可如下图所示
4. 总结 本篇博客主要介绍了规范化注意力机制NAM通过惩罚机制降低不显著特征助力YOLOv5模型涨点。另外在修改过程中要是有任何问题评论区交流如果博客对您有帮助请帮忙点个赞收藏一下后续会持续更新本人实验当中觉得有用的点子如果很感兴趣的话可以关注一下谢谢大家啦