YOLOv8目标检测创新改进与实战案例专栏
专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLOv8基础解析+创新改进+实战案例
ContextAggregation介绍
摘要
卷积神经网络(CNNs)在计算机视觉中无处不在,具有众多高效的变体。最近,最初在自然语言处理(NLP)中引入的Transformers越来越多地被应用于计算机视觉领域。尽管早期采用者继续使用CNN骨干网络,但最新的网络是端到端的、无CNN的Transformer解决方案。一个最近令人惊讶的发现表明,基于简单多层感知机(MLP)的解决方案,即使没有传统的卷积或Transformer组件,也能生成有效的视觉表示。虽然CNNs、Transformers和MLP-Mixers可以被认为是完全不同的架构,但我们提供了一个统一的视角,表明它们实际上是神经网络堆栈中聚合空间上下文的一种更普遍的方法的特例。我们提出了CONTAINER(CONText AggregatIon NEtwoRk),这是一个多头上下文聚合的通用构建模块,能够像Transformers一样利用长程交互,同时仍然利用局部卷积操作的归纳偏差,从而实现更快的收敛速度,这通常在CNNs中可见。我们的CONTAINER架构在ImageNet上使用22M参数实现了82.7%的Top-1准确率,相比DeiT-Small提高了2.8个百分点,并且只需200个epoch就能收敛到79.9%的Top-1准确率。与基于Transformer的方法相比,后者在依赖更大输入图像分辨率的下游任务中不具备良好的扩展性,我们的高效网络CONTAINER-LIGHT可以应用于DETR、RetinaNet和Mask-RCNN等目标检测和实例分割网络,获得令人印象深刻的检测mAP分别为38.9、43.8、45.1,和掩码mAP为41.3,相比使用可比计算和参数规模的ResNet-50骨干分别提高了6.6、7.3、6.9和6.6个点。与DeiT在DINO框架上的自监督学习相比,我们的方法也取得了可喜的结果。代码已在GitHub发布。
基本原
关键组成部分和机制
-
输入表示:
- 输入图像表示为 X ∈ R C × H × W X \in \mathbb{R}^{C \times H \times W} X∈RC×H×W,其中 C C C 是通道数, H × W H \times W H×W 是空间维度。该图像被展平为一系列标记 { X i ∈ R C ∣ i = 1 , … , N } \{X_i \in \mathbb{R}^C | i = 1, \ldots, N\} {Xi∈RC∣i=1,…,N},其中 N = H × W N = H \times W N=H×W。
-
亲和矩阵:
-
定义亲和矩阵 A ∈ R N × N A \in \mathbb{R}^{N \times N} A∈RN×N 以表示上下文聚合的邻域。该矩阵决定了信息在特征空间中的传播方式。聚合函数可以表示为:
Y = ( A V ) W 1 + X , Y = (A V) W_1 + X, Y=(AV)W1+X,其中 V ∈ R N × C V \in \mathbb{R}^{N \times C} V∈RN×C 是通过线性投影 V = X W 2 V = X W_2 V=XW2 从 X X X 获得的变换版本。 W 1 W_1 W1 和 W 2 W_2 W2 是可学习参数。
-
-
多头聚合:
-
为了增加建模能力,使用多个亲和矩阵,创建几条上下文信息的路径。多头版本的聚合函数为:
Y = Concat ( A 1 V 1 , … , A M V M ) W 2 + X , Y = \text{Concat}(A_1 V_1, \ldots, A_M V_M) W_2 + X, Y=Concat(A1V1,…,AMVM)W2+X,其中每个 A m A_m Am (对 m = 1 , … , M m = 1, \ldots, M m=1,…,M)是表示特征空间内不同关系的亲和矩阵,增强了相比单头版本的表示能力。
-
-
不同架构中的上下文聚合:
-
Transformers:利用基于投影的query-key对之间相似性动态生成的亲和矩阵。自注意机制可以表示为:
A s a m = Softmax ( Q m K m T C / M ) , A_{sa}^m = \text{Softmax}\left(\frac{Q_m K_m^T}{\sqrt{C/M}}\right), Asam=Softmax(C/MQmKmT),
其中 Q m Q_m Qm 和 K m K_m Km 是query和key投影。这种方法捕捉实例级信息,但计算密集。 -
深度卷积:并行融合空间和通道信息,使用从卷积核导出的静态和稀疏亲和矩阵。这种方法高效且适合捕捉局部上下文。
-
MLP-Mixer:使用转置MLP操作进行上下文聚合,具有密集亲和矩阵:
A m l p = ( W M L P ) T , A_{mlp} = (W_{MLP})^T, Amlp=(WMLP)T,
其中 W M L P W_{MLP} WMLP 是可学习参数。
-
-
统一框架:CONTAINER:
- CONTAINER(上下文聚合网络)模块通过可学习参数结合静态和动态亲和矩阵,提供灵活而强大的上下文聚合方法。一般形式为:
Y = ( α A ( X ) + β A ) V W 2 + X , Y = (\alpha A(X) + \beta A)V W_2 + X, Y=(αA(X)+βA)VW2+X,
其中 A ( X ) A(X) A(X) 是动态亲和矩阵, A A A 是静态亲和矩阵。 α \alpha α 和 β \beta β 是可学习参数。
- CONTAINER(上下文聚合网络)模块通过可学习参数结合静态和动态亲和矩阵,提供灵活而强大的上下文聚合方法。一般形式为:
引入GhosConv代码
YOLOv8内置GhosConv,具体代码可见:ultralytics/ultralytics/nn/modules/conv.py
配置yolov8_GhostConvContextAggregation.yaml
ultralytics/ultralytics/cfg/models/v8/yolov8_GhostConvContextAggregation.yaml
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPs
# YOLOv8.0s backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, GhostConv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, GhostConv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, GhostConv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, GhostConv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv8.0s head
head:
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12
- [-1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 19 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 23 (P5/32-large)
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/140665117