YOLOv8目标检测创新改进与实战案例专栏
专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLOv8基础解析+创新改进+实战案例
介绍
摘要
学习捕捉远程关系是图像/视频识别的基础。现有的CNN模型通常依赖于增加深度来建模这种关系,这效率极低。在这项工作中,我们提出了“双重注意力块”,这是一个新颖的组件,它从输入图像/视频的整个时空空间聚合和传播有用的全局特征,使后续的卷积层能够高效地访问整个空间的特征。该组件设计了两个步骤的双重注意力机制,第一步通过二阶注意力池化将整个空间的特征聚集到一个紧凑集,第二步通过另一个注意力自适应地选择和分配特征到每个位置。提出的双重注意力块易于采用,可以方便地插入现有的深度神经网络中。我们进行了广泛的消融研究和实验,以评估其在图像和视频识别任务中的性能。在图像识别任务中,配备了我们双重注意力块的ResNet-50在ImageNet-1k数据集上以超过40%的参数量和更少的FLOPs超越了更大规模的ResNet-152架构。在动作识别任务中,我们提出的模型在Kinetics和UCF-101数据集上实现了最新的最先进结果,效率显著高于最近的工作。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
双重注意力机制(Double Attention)的详细介绍及其技术原理
技术原理
双重注意力机制(Double Attention Mechanism)由两个主要步骤组成:特征聚合(Feature Gathering)和特征分配(Feature Distribution)。这一机制旨在有效地捕获输入数据中全局特征,从而使后续的卷积层能够更高效地访问这些特征。
特征聚合(Feature Gathering):
- 输入张量:$X \in \mathbb{R}^{c \times d \times h \times w}$,其中 $c$ 是通道数,$d$ 是时间维度,$h$ 和 $w$ 是空间维度。
- 局部特征:每个位置 $i$ 处的局部特征记为 $v_i$。
- 聚合函数:
$$ g_i = A \cdot \text{softmax}(b_i)^T $$
其中 $A$ 和 $B$ 是由不同卷积层生成的特征图,分别表示为 $A = \phi(X; W\phi)$ 和 $B = \text{softmax}(\theta(X; W\theta))$。
特征分配(Feature Distribution):
- 分配函数:
$$ z_i = G_{\text{gather}}(X) \cdot v_i $$
其中 $v_i$ 是位置 $i$ 的注意力向量,确保 $\sumj v{ij} = 1$。
- 分配函数:
双重注意力块(Double Attention Block):
- 组合操作:
$$ Z = G_{\text{gather}}(X, V) = \left[ \phi(X; W_\phi) \cdot \text{softmax}(\theta(X; W_\theta))^T \right] \cdot \text{softmax}(\rho(X; W_\rho)) $$
这一步包括:- 特征聚合:使用二阶注意力池化。
- 特征分配:通过注意力向量适应性地分配局部需要的特征。
- 计算图:包括双线性池化和注意力机制(参见文档中的实现图)。
- 组合操作:
核心代码
class DoubleAttention(nn.Module):
def __init__(self, in_channels, c_m, c_n, reconstruct=True):
super().__init__()
self.in_channels = in_channels
self.reconstruct = reconstruct
self.c_m = c_m
self.c_n = c_n
# 定义三个1x1卷积层
self.convA = nn.Conv2d(in_channels, c_m, 1)
self.convB = nn.Conv2d(in_channels, c_n, 1)
self.convV = nn.Conv2d(in_channels, c_n, 1)
# 如果需要重构,定义一个重构卷积层
if self.reconstruct:
self.conv_reconstruct = nn.Conv2d(c_m, in_channels, kernel_size=1)
task与yaml配置
详见: https://blog.csdn.net/shangyanaf/article/details/140478959