yolov5改进(一) 添加注意力集中机制

(1)自注意力集中机制

我想学的是注意力机制但是好像一开始跑歪了,学了自注意力机制。该说不说,讲的挺不错的。
台大李宏毅自注意力机制
input:vector set
在这里插入图片描述

在这里插入图片描述

muti-head:可能会有不同的联系

在这里插入图片描述

在图片中的应用:
在这里插入图片描述

将一个像素上的rgb看作一个vector

模型上的应用包括:①self-attention GAN
②DETR

CNN和Self-attention的对比:
CNN只考虑receptive field,Self-attention考虑全局。因此可以将cnn看作是小范围的(简化版)Self-attention
在这里插入图片描述

资料量时CNN占优,量时Self-attention会超过CNN
对于理由李宏毅的说法是:Self-attention弹性大,CNN弹性小

RNN&SA
①SA平行化,RNN不可以平行话
②数据记忆量

(2)注意力机制

接下来就是正儿八经的注意力机制(Attention)
先上资料先上资料
pytorch应用的:
先上资料
其实csdn上是有网课的但是贫困小孩最近真是没钱花,但是我们还是可以参照他的架构进行学习

在这里插入图片描述

1.了解注意力机制

根据注意力作用的不同维度将注意力分成了四种基本类型:通道注意力、空间注意力、时间注意力和分支注意力,以及两种组合注意力:通道-空间注意力和空间-时间注意力
在这里插入图片描述
spatial:空间
temporal:时间
画出三维坐标轴大概就长下面这样:
请添加图片描述

2.正儿八经进入注意力模块

遇到问题先看看b导的课

本小白遇到的不会的函数,例子更好理解一点
1)cat:拼接
在这里插入图片描述
2)view:改变cols和rows的排布

在这里插入图片描述
3)torch.mean通道平均值&torch.max通道最大值
torch.nn.AdaptiveAvgPool2d(output_size):提供2维的自适应平均池化操作 对于任何输入大小的输入,可以将输出尺寸指定为H*W

对比于全局平均池化可以理解成切片方式不一样!!!

注意力机制是一个即插即用的模块,理论上可以放在任何一个特征层后面。
由于放置在主干会导致网络的预训练权重无法使用,将注意力机制应用加强特征提取网络

(3)实战部分

但是我写一半就发现有人已经写好了,这边可以参考一下:yolov5添加注意力集中机制

实际使用时出现什么问题我再补充吧!!感觉b导已经讲的很好了
1.如果是添加一个独立的注意力机制层,可能会影响后面层数(从backbone接受的特征图的层的层数就变了)
2.一般不添加到主干提取网络避免影响预训练权重

### 如何在 YOLOv3-Tiny 中实现注意力机制 #### 1. **基本概念** YOLOv3-Tiny 是种轻量化的对象检测模型,相较于完整的 YOLOv3 模型具有更少的参数和更快的速度。然而,在某些场景下可能需要进步优化其性能,而注意力机制种有效的手段来增强模型对关键区域的关注能力[^4]。 #### 2. **选择合适的注意力机制** 常见的注意力机制包括但不限于 SE (Squeeze-and-Excitation)[^3]、SAM (Spatial Attention Module) 和 CBAM (Convolutional Block Attention Module)[^5]。这些机制可以通过调整通道权重或空间分布来突出重要的特征图部分。对于 YOLOv3-Tiny 的改进,可以选择其中任意种或者组合多种方式来进行实验。 #### 3. **具体实现流程** 以下是将 CBAM 注意力机制集成到 YOLOv3-Tiny 的方法: ##### (1)修改 `common.py` 文件 CBAM 主要由两个子模块组成:Channel Attention 和 Spatial Attention。可以在项目的公用组件文件中定义该结构。例如: ```python import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=8): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) class 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 1 self.conv1 = 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.conv1(x) return self.sigmoid(x) class CBAM(nn.Module): def __init__(self, gate_channels, reduction_ratio=16, pool_types=['avg', 'max'], no_spatial=False): super(CBAM, self).__init__() self.ChannelGate = ChannelAttention(gate_channels, reduction_ratio) self.no_spatial=no_spatial if not no_spatial: self.SpatialGate = SpatialAttention() def forward(self, x): x_out = self.ChannelGate(x) x_out = x * x_out if not self.no_spatial: x_out = self.SpatialGate(x_out) x_out = x * x_out return x_out ``` 上述代码实现了 CBAM 的核心逻辑,并将其封装成独立的类以便后续调用。 ##### (2)更新网络架构 (`yolo.py`) 找到负责构建卷积层的部分并插入 CBAM 层。通常情况下,可以考虑在 backbone 或 neck 阶段的关键位置添加此操作。例如: ```python def add_cbam_to_backbone(model): for name, module in model.named_children(): if isinstance(module, nn.Sequential): # 如果当前模块个序列容器,则递归遍历内部成员 add_cbam_to_backbone(module) elif isinstance(module, nn.Conv2d): channels = module.out_channels cbam_layer = CBAM(channels) setattr(model, f"{name}_cbam", cbam_layer) return model ``` 通过这种方式动态注入新的功能单元至现有框架之中。 ##### (3)配置训练过程 最后步是在数据预处理阶段以及损失函数计算环节保持致性的同时启用新特性。确保所有超参设置合理即可开始新轮迭代验证工作。 --- ### 总结 综上所述,向 YOLOv3-Tiny 引入注意力机制并非难事,只需按照既定模板逐步完成相应改动便能显著改善最终成果表现水平。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值