2017网站开发前景,全国招标公告公示平台,网站建设意见征求汇报,安徽 电子政务网站定制前言#xff1a;Hello大家好#xff0c;我是小哥谈。注意力机制是近年来深度学习领域内的研究热点#xff0c;可以帮助模型更好地关注重要的特征#xff0c;从而提高模型的性能。在许多视觉任务中#xff0c;输入数据通常由多个通道组成#xff0c;例如图像中的RGB通道或… 前言Hello大家好我是小哥谈。注意力机制是近年来深度学习领域内的研究热点可以帮助模型更好地关注重要的特征从而提高模型的性能。在许多视觉任务中输入数据通常由多个通道组成例如图像中的RGB通道或视频中的时间序列帧。传统的卷积神经网络CNN在处理这些通道时通常是独立地对每个通道进行操作忽略了通道之间的相互作用。CA注意力机制通过引入通道注意力来解决这个问题。它能够自动学习到不同通道之间的关联性和重要性从而增强模型对输入数据的建模能力。具体来说CA注意力机制通过计算每个通道的权重使得模型能够更加关注重要的通道并抑制不重要的通道。这样可以提高模型在处理多通道输入数据时的表达能力和性能。 前期回顾 YOLOv5算法改进1— 如何去改进YOLOv5算法 YOLOv5算法改进2— 添加SE注意力机制 YOLOv5算法改进3— 添加CBAM注意力机制 目录
1.论文
2.CA注意力机制的原理及实现
3.添加CA注意力机制的好处
4.添加CA注意力机制的方法
步骤1在common.py中添加CA模块
步骤2在yolo.py文件中加入类名
步骤3创建自定义yaml文件
步骤4修改yolov5s_CA.yaml文件
步骤5验证是否加入成功
步骤6修改train.py中的--cfg默认参数
5.添加C3_CA注意力机制的方法在C3模块中添加
步骤1在common.py中添加CABottleneck和C3_CA模块
步骤2在yolo.py文件里parse_model函数中加入类名
步骤3创建自定义yaml文件
步骤4验证是否加入成功
步骤5修改train.py中的--cfg默认参数 1.论文
目前轻量级网络的注意力机制大都采用 SE 模块仅考虑了通道间的信息忽略了位置信息。尽管后来的 BAM 和 CBAM 尝试在降低通道数后通过卷积来提取位置注意力信息但卷积只能提取局部关系缺乏长距离关系提取的能力。为此论文提出了新的高效注意力机制CAcoordinate attention能够将横向和纵向的位置信息编码到 channel attention 中使得移动网络能够关注大范围的位置信息又不会带来过多的计算量。 论文题目Coordinate Attention for Efficient Mobile Network Design 论文地址https://arxiv.org/abs/2103.02907 代码实现GitHub - houqb/CoordAttention: Code for our CVPR2021 paper coordinate attention 2.CA注意力机制的原理及实现
CAChannel Attention注意力机制是一种在深度学习中常用的注意力机制之一用于增强模型对于不同通道channel之间的特征关联性。
其原理如下
1输入特征经过卷积等操作得到中间特征表示。
2中间特征表示经过两个并行的操作全局平均池化和全局最大池化得到全局特征描述。
3全局特征描述通过两个全连接层生成注意力权重。
4注意力权重与中间特征表示相乘得到加权后的特征表示。
5加权后的特征表示经过适当的调整如残差连接后作为下一层的输入。
CA注意力的实现如图所示可以认为分为两个并行阶段
将输入特征图分别在为宽度和高度两个方向分别进行全局平均池化分别获得在宽度和高度两个方向的特征图。假设输入进来的特征层的形状为[C, H, W]在经过宽方向的平均池化后获得的特征层shape为[C, H, 1]此时我们将特征映射到了高维度上在经过高方向的平均池化后获得的特征层shape为[C, 1, W]此时我们将特征映射到了宽维度上。
然后将两个并行阶段合并将宽和高转置到同一个维度然后进行堆叠将宽高特征合并在一起此时我们获得的特征层为[C, 1, HW]利用卷积标准化激活函数获得特征。
之后再次分开为两个并行阶段再将宽高分开成为[C, 1, H]和[C, 1, W]之后进行转置。获得两个特征层[C, H, 1]和[C, 1, W]。
然后利用1x1卷积调整通道数后取sigmoid获得宽高维度上的注意力情况乘上原有的特征就是CA注意力机制。✅ 3.添加CA注意力机制的好处
作者通过将位置信息嵌入到通道注意力中提出了一种新颖的移动网络注意力机制将其称为“Coordinate Attention”。其为即插即用的注意力模块能插入任何经典网络。
加入CA注意力机制的好处包括 1增强特征表达CA注意力机制能够自适应地选择和调整不同通道的特征权重从而更好地表达输入数据。它可以帮助模型发现和利用输入数据中重要的通道信息提高特征的判别能力和区分性。 2减少冗余信息通过抑制不重要的通道CA注意力机制可以减少输入数据中的冗余信息提高模型对关键特征的关注度。这有助于降低模型的计算复杂度并提高模型的泛化能力。 3提升模型性能加入CA注意力机制可以显著提高模型在多通道输入数据上的性能。它能够帮助模型更好地捕捉到通道之间的相关性和依赖关系从而提高模型对输入数据的理解能力。
综上所述加入CA注意力机制可以有效地增强模型对多通道输入数据的建模能力提高模型性能和泛化能力。它在图像处理、视频分析等任务中具有重要的应用价值。 4.添加CA注意力机制的方法
步骤1在common.py中添加CA模块
将下面的CA模块的代码复制粘贴到common.py文件的末尾。 # CA
class h_sigmoid(nn.Module):def __init__(self, inplaceTrue):super(h_sigmoid, self).__init__()self.relu nn.ReLU6(inplaceinplace)def forward(self, x):return self.relu(x 3) / 6
class h_swish(nn.Module):def __init__(self, inplaceTrue):super(h_swish, self).__init__()self.sigmoid h_sigmoid(inplaceinplace)def forward(self, x):return x * self.sigmoid(x)class CoordAtt(nn.Module):def __init__(self, inp, oup, reduction32):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_size1, stride1, padding0)self.bn1 nn.BatchNorm2d(mip)self.act h_swish()self.conv_h nn.Conv2d(mip, oup, kernel_size1, stride1, padding0)self.conv_w nn.Conv2d(mip, oup, kernel_size1, stride1, padding0)def forward(self, x):identity xn, c, h, w x.size()#c*1*Wx_h self.pool_h(x)#c*H*1#C*1*hx_w self.pool_w(x).permute(0, 1, 3, 2)y torch.cat([x_h, x_w], dim2)#C*1*(hw)y self.conv1(y)y self.bn1(y)y self.act(y)x_h, x_w torch.split(y, [h, w], dim2)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 out 具体如下图所示 步骤2在yolo.py文件中加入类名
首先在yolo.py文件中找到parse_model函数然后将 CoordAtt 添加到这个注册表里。 步骤3创建自定义yaml文件
在models文件夹中复制yolov5s.yaml粘贴并命名为yolov5s_CA.yaml。 步骤4修改yolov5s_CA.yaml文件
本步骤是修改yolov5s_CA.yaml将CA模块添加到我们想添加的位置。在这里我将[-11CoordAtt[1024]]添加到SPPF的上一层即下图中所示位置。 说明♨️♨️♨️ 注意力机制可以加在Backbone、Neck、Head等部分常见的有两种一种是在主干的SPPF前面添加一层二是将Backbone中的C3全部替换。不同的位置效果可能不同需要我们去反复测试。 这里需要注意一个问题当在网络中添加新的层之后那么该层网络后面的层的编号会发生变化。原本Detect指定的是[17,20,23]层所以我们在添加了CA模块之后也要对这里进行修改即原来的17层变成18层原来的20层变成21层原来的23层变成24层所以这里需要改为[18,21,24]。同样的Concat的系数也要修改这样才能保持原来的网络结构不会发生特别大的改变我们刚才把CA模块加到了第9层所以第9层之后的编号都需要加1这里我们把后面两个Concat的系数分别由[-1,14][-1,10]改为[-1,15][-1,11]。
具体如下图所示 步骤5验证是否加入成功
在yolo.py文件里将配置改为我们刚才自定义的yolov5s_CA.yaml。 然后运行yolo.py得到结果。 找到了CA模块说明我们添加成功了。
步骤6修改train.py中的--cfg默认参数
在train.py文件中找到 parse_opt函数然后将第二行--cfg的default改为 models/yolov5s_CA.yaml然后就可以开始进行训练了。 5.添加C3_CA注意力机制的方法在C3模块中添加
上面是单独添加注意力层接下来的方法是在C3模块中加入注意力层。这个策略是将CA注意力机制添加到Bottleneck替换Backbone中所有的C3模块。
步骤1在common.py中添加CABottleneck和C3_CA模块
将下面的代码复制粘贴到common.py文件的末尾。
# CA
class h_sigmoid(nn.Module):def __init__(self, inplaceTrue):super(h_sigmoid, self).__init__()self.relu nn.ReLU6(inplaceinplace)def forward(self, x):return self.relu(x 3) / 6class h_swish(nn.Module):def __init__(self, inplaceTrue):super(h_swish, self).__init__()self.sigmoid h_sigmoid(inplaceinplace)def forward(self, x):return x * self.sigmoid(x)class CABottleneck(nn.Module):# Standard bottleneckdef __init__(self, c1, c2, shortcutTrue, g1, e0.5, ratio32): # ch_in, ch_out, shortcut, groups, expansionsuper().__init__()c_ int(c2 * e) # hidden channelsself.cv1 Conv(c1, c_, 1, 1)self.cv2 Conv(c_, c2, 3, 1, gg)self.add shortcut and c1 c2# self.caCoordAtt(c1,c2,ratio)self.pool_h nn.AdaptiveAvgPool2d((None, 1))self.pool_w nn.AdaptiveAvgPool2d((1, None))mip max(8, c1 // ratio)self.conv1 nn.Conv2d(c1, mip, kernel_size1, stride1, padding0)self.bn1 nn.BatchNorm2d(mip)self.act h_swish()self.conv_h nn.Conv2d(mip, c2, kernel_size1, stride1, padding0)self.conv_w nn.Conv2d(mip, c2, kernel_size1, stride1, padding0)def forward(self, x):x1 self.cv2(self.cv1(x))n, c, h, w x.size()# c*1*Wx_h self.pool_h(x1)# c*H*1# C*1*hx_w self.pool_w(x1).permute(0, 1, 3, 2)y torch.cat([x_h, x_w], dim2)# C*1*(hw)y self.conv1(y)y self.bn1(y)y self.act(y)x_h, x_w torch.split(y, [h, w], dim2)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 x1 * a_w * a_h# outself.ca(x1)*x1return x out if self.add else outclass C3_CA(C3):# C3 module with CABottleneck()def __init__(self, c1, c2, n1, shortcutTrue, g1, e0.5):super().__init__(c1, c2, n, shortcut, g, e)c_ int(c2 * e) # hidden channelsself.m nn.Sequential(*(CABottleneck(c_, c_, shortcut, g, e1.0) for _ in range(n))) 步骤2在yolo.py文件里parse_model函数中加入类名
在yolo.py文件的parse_model函数中加入CABottleneck、C3_CA这两个模块。 步骤3创建自定义yaml文件
按照上面的步骤创建yolov5s_C3_CA.yaml文件替换4个C3模块。 步骤4验证是否加入成功
在yolo.py文件里配置刚才我们自定义的yolov5s_C3_CA.yaml然后运行。 步骤5修改train.py中的--cfg默认参数
在train.py文件中找到parse_opt函数然后将第二行--cfg的default改为 models/yolov5s_C3_CA.yaml然后就可以开始进行训练了。