YoloV10改进策略:Block改进|VOLO,视觉识别中的视觉展望器|即插即用|附代码+改进方法
摘要
论文介绍
- VOLO模型概述:本文提出了一种名为VOLO的视觉识别模型,该模型旨在通过创新的注意力机制——前景器(Outlooker)来提高视觉识别的性能。VOLO模型在ImageNet等基准测试上取得了优异的结果。
- 研究背景:传统的视觉Transformer(ViT)模型在全局依赖性建模上表现出色,但在将精细特征和上下文编码到标记中方面效率较低。这限制了ViT模型在视觉识别任务上的性能。
创新点
- 前景器(Outlooker)的提出:本文创新性地提出了前景器作为新的注意力机制,用于高效地丰富标记表示中的精细信息。Outlooker通过直接从锚标记特征中推断出聚合周围标记的机制,摆脱了昂贵的点积注意力计算。
- 细粒度特征编码:Outlooker能够高效地编码细粒度特征,这对于实现令人信服的视觉识别性能至关重要。它通过密集的局部空间聚合来有效地编码这些信息。
方法
- Outlooker架构:Outlooker由一个Outlook注意力层和一个多层感知器(MLP)组成。Outlook注意力层用于空间信息编码,而MLP则用于通道间信息交互。
- Outlook Attention机制:对于每个空间位置,Outlook Attention计算它与局部窗口内所有邻居的相似度,并通过重塑操作简化了注意力权重的生成过程。这使得Outlook Attention在计算上更加高效。
- 多头展望注意力:通过分割展望权重和价值嵌入为多个头,并分别计算展望注意力,然后将它们拼接作为多头展望注意力的输出,进一步提高了模型的表达能力。
模块作用
- 在YoloV10中的C2f模块应用:将OutlookAttention模块集成到YoloV10的C2f模块中,旨在增强模型对细粒度特征的捕捉能力。
- 特征增强:OutlookAttention能够高效地编码和聚合局部特征,从而增强YoloV10模型对目标物体的特征表示。
- 提高识别性能:通过引入OutlookAttention模块,预期能够提升YoloV10在目标检测任务上的准确性和鲁棒性。
改进的效果
- 性能提升:虽然本文未直接提供将OutlookAttention应用于YoloV10后的具体性能数据,但基于VOLO模型在ImageNet等基准测试上的优异表现,可以推测OutlookAttention模块有望显著提升YoloV10的识别性能。
- 精细特征捕捉:由于OutlookAttention擅长编码细粒度特征,因此可以预期改进后的YoloV10在检测小目标或复杂场景中的目标时表现更佳。
- 计算效率:OutlookAttention机制的计算效率高于传统的自注意力机制,因此改进后的YoloV10在保持高性能的同时,可能具有更好的计算效率和实时性能。
总结:本文通过介绍VOLO模型中的Outlooker注意力机制,详细阐述了其创新点、方法、在YoloV10中C2f模块的作用以及预期改进的效果。OutlookAttention模块的引入有望显著提升YoloV10在目标检测任务上的性能和计算效率。
论文翻译:《VOLO:视觉识别中的视觉展望器》
https://arxiv.org/pdf/2106.13112
视觉识别领域多年来一直被卷积神经网络(CNNs)所主导。尽管最近流行的视觉转换器(ViTs)在ImageNet分类任务中展示了基于自注意力模型的巨大潜力,但如果不提供额外数据,其性能仍然落后于最新的最优卷积神经网络(SOTA CNNs)。在本文中,我们试图缩小性能差距,并证明基于注意力的模型确实能够超越卷积神经网络。我们发现,限制ViTs在ImageNet分类任务中性能的一个主要因素是它们将精细特征编码到标记表示中的效率较低。为了解决这一问题,我们提出了一种新颖的前景注意力机制,并展示了一个简单且通用的架构,称为视觉前景器(VOLO)。与专注于在粗粒度上建模全局依赖性的自注意力不同,前景注意力可以高效地将更精细的特征和上下文编码到标记中,这对识别性能至关重要,但却被自注意力机制所忽视。实验表明,我们的VOLO在ImageNet-1K分类任务上实现了
87.1
%
87.1\%
87.1%的top-1准确率,这是在该竞争激烈的基准测试中首个准确率超过
87
%
87\%
87%的模型,且未使用任何额外训练数据。此外,预训练的VOLO能够很好地迁移到下游任务,如语义分割。我们在cityscapes验证集上实现了
84.3
%
84.3\%
84.3%的mIoU分数,在ADE20K验证集上实现了
54.3
%
54.3\%
54.3%的mIoU分数。代码可在https://github.com/sail-sg/volo获取。
1. 引言
视觉识别领域的建模长期由卷积神经网络(CNNs)主导,但最近已被视觉转换器(ViTs)[14, 51, 68]彻底改变。与通过局部和密集卷积核聚合和转换特征的卷积神经网络不同,视觉转换器通过自注意力机制直接对局部块(又称标记)的长距离依赖性进行建模,在视觉内容建模方面具有更大的灵活性。尽管在视觉识别方面取得了显著成效[37, 32, 52, 79],但ViT模型的性能仍然落后于最先进的卷积神经网络模型。例如,如表1所示,最先进的基于转换器的CaiT[52]在ImageNet上实现了 86.5 % 86.5\% 86.5%的top-1准确率,但相比使用SAM和augmult[15, 16]的基于卷积神经网络的NFNet-F5[2]实现的 86.8 % 86.8\% 86.8%的top-1准确率,仍然低了 0.3 % 0.3\% 0.3%。
在本文中,我们试图缩小这种性能差距。我们发现,限制ViTs超越卷积神经网络的一个主要因素是它们将精细特征和上下文编码到标记表示中的效率较低,这对于实现令人信服的视觉识别性能至关重要。可以通过更细粒度的图像标记化将精细信息编码到标记中,但这会导致标记序列长度增加,从而使ViT的自注意力机制的复杂性二次方增长。在本文中,我们提出了一种新的简单且轻量级的注意力机制,称为前景器(Outlooker),以高效地丰富标记表示中的精细信息。所提出的前景器创新了用于标记聚合的注意力生成方式,并使模型能够高效地编码精细信息。特别是,它通过高效的线性投影直接从锚标记特征中推断出聚合周围标记的机制,从而摆脱了昂贵的点积注意力计算。
基于所提出的前景器,我们提出了VOLO,这是一种简单但功能强大的视觉识别模型架构。VOLO通过两级架构设计实现了精细标记表示编码和全局信息聚合。具体来说,给定大小为 224 × 224 224 \times 224 224×224的输入图像,在使用自注意力在粗粒度上建立全局依赖性(例如, 14 × 14 14 \times 14 14×14)之前,VOLO将图像标记化为更小尺寸的块(例如, 8 × 8 8 \times 8 8×8),并使用多个前景器在精细级别(例如, 28 × 28 28 \times 28 28×28)上编码标记表示。所获得的标记表示更具表达力,从而显著提高了模型在图像分类任务中的性能。
实验表明,我们提出的VOLO在ImageNet分类任务中表现极佳。以具有2660万个可学习参数的VOLO模型为例,它在未使用任何额外数据的情况下,在ImageNet上实现了
84.2
%
84.2\%
84.2%的top-1准确率。将该模型在
384
×
384
384 \times 384
384×384的输入分辨率上进行微调,可以进一步提高准确率至
85.2
%
85.2\%
85.2%。此外,当模型大小扩展到2.96亿个参数时,它在ImageNet上可以达到
87.1
%
87.1\%
87.1%的top-1准确率,在ImageNet-ReaL上达到
90.6
%
90.6\%
90.6%,在ImageNet-V2上达到
78.0
%
78.0\%
78.0%,在这三个分类基准测试中均刷新了最优性能。
如图1所示,与之前的基于卷积神经网络(CNN)的最先进模型(带有SAM[15]的NFNet-F6[2])和基于Transformer的模型(带有KD的CaiT-M48[52])相比,我们的最佳模型VOLO-D5使用了最少的可学习参数,但实现了最高的准确性。此外,如表1所示,即使与以前使用更强数据增强和优化方法(如SAM[15]和augmult[16])的最先进模型相比,我们的Outlooker仍然表现最佳。
我们的VOLO在语义分割任务上也表现出色。我们在两个广泛使用的分割基准测试集上进行了实验:Cityscapes[10]和ADE20K[77]。实验表明,我们的VOLO在Cityscapes验证集上获得了84.3%的平均交并比(mIoU)分数,比之前的最佳结果(由SegFormer-B5[64]获得)高出0.3%。在ADE20K验证集上,我们获得了54.3%的mIoU分数,大幅提升了在ImageNet-22k上预训练的Swin Transformer[37]所实现的当前最佳结果(53.5%)。
2. 方法
我们的模型可以看作是一个具有两个独立阶段的架构。第一阶段由一系列Outlooker组成,用于生成细粒度的标记表示。第二阶段部署一系列Transformer块来聚合全局信息。在每个阶段的开始,都使用一个补丁嵌入模块将输入映射为具有设计形状的标记表示。
2.1. Outlooker
Outlooker由一个用于空间信息编码的Outlook注意力层和一个用于通道间信息交互的多层感知器(MLP)组成。给定一系列输入C维标记表示 X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H \times W \times C} X∈RH×W×C,Outlooker可以表示如下:
X ~ = OutlookAtt ( LN ( X ) ) + X Z = MLP ( LN ( X ~ ) ) + X ~ \begin{array}{l} \tilde{\mathbf{X}}=\operatorname{OutlookAtt}(\operatorname{LN}(\mathbf{X}))+\mathbf{X} \\ \mathbf{Z}=\operatorname{MLP}(\operatorname{LN}(\tilde{\mathbf{X}}))+\tilde{\mathbf{X}} \end{array} X~=OutlookAtt(LN(X))+XZ=MLP(LN(X~))+X~
其中,LN指的是LayerNorm[35]。
2.1.1 Outlook Attention
Outlook attention简单、高效且易于实现。其背后的主要见解是:1)每个空间位置的特征都足够具有代表性,可以为局部聚合其相邻特征生成注意力权重;2)密集且局部的空间聚合可以有效地编码细粒度信息。
对于每个空间位置 ( i , j ) (i, j) (i,j),Outlook attention计算它与以 ( i , j ) (i, j) (i,j) 为中心、大小为 K × K K \times K K×K 的局部窗口内所有邻居的相似度。与需要查询-键矩阵乘法来计算注意力(即Softmax ( Q ⊤ K / d ) \left(\mathbf{Q}^{\top} \mathbf{K} / \sqrt{d}\right) (Q⊤K/d))的自注意力不同,Outlook attention仅通过重塑操作简化了此过程。
形式上,给定输入 X \mathbf{X} X,首先使用两个线性层,其权重分别为 W A ∈ R C × K 4 \mathbf{W}_{A} \in \mathbb{R}^{C \times K^{4}} WA∈RC×K4和 W V ∈ R C × C \mathbf{W}_{V} \in \mathbb{R}^{C \times C} WV∈RC×C,将每个C维标记分别投影为展望权重 A ∈ R H × W × K 4 \mathbf{A} \in \mathbb{R}^{H \times W \times K^{4}} A∈RH×W×K4和价值表示 V ∈ R H × W × C \mathbf{V} \in \mathbb{R}^{H \times W \times C} V∈RH×W×C。令 V Δ i , j ∈ R C × K 2 \mathbf{V}_{\Delta_{i, j}} \in \mathbb{R}^{C \times K^{2}} VΔi,j∈RC×K2表示以 ( i , j ) (i, j) (i,j)为中心的局部窗口内的所有值,即
V Δ i , j = { V i + p − ⌊ K 2 ⌋ , j + q − ⌊ K 2 ⌋ } , 0 ≤ p , q < K \mathbf{V}_{\Delta_{i, j}}=\left\{\mathbf{V}_{i+p-\left\lfloor\frac{K}{2}\right\rfloor, j+q-\left\lfloor\frac{K}{2}\right\rfloor}\right\}, \quad 0 \leq p, q<K VΔi,j={Vi+p−⌊2K⌋,j+q−⌊2K⌋},0≤p,q<K
展望注意力:将位置 ( i , j ) (i, j) (i,j)处的展望权重重新整形为 A ^ i , j ∈ R K 2 × K 2 \hat{\mathbf{A}}_{i, j} \in \mathbb{R}^{K^{2} \times K^{2}} A^i,j∈RK2×K2,然后应用Softmax函数,直接用作值聚合的注意力权重。因此,值投影过程可以表示为
Y Δ i , j = MatMul ( Softmax ( A ^ i , j ) , V Δ i , j ) \mathbf{Y}_{\Delta_{i, j}}=\operatorname{MatMul}\left(\operatorname{Softmax}\left(\hat{\mathbf{A}}_{i, j}\right), \mathbf{V}_{\Delta_{i, j}}\right) YΔi,j=MatMul(Softmax(A^i,j),VΔi,j)
密集聚合:展望注意力密集地聚合投影后的值表示。将来自不同局部窗口但在同一位置的不同加权值相加,得到输出。
算法1总结了类似PyTorch的展望注意力代码。式(3)和式(5)分别对应于Unfold和Fold操作。在展望注意力之后,通常会像自注意力中那样采用一个线性层。
2.1.2 多头展望注意力
多头展望注意力的实现很简单。假设头数设置为 N N N。我们只需要调整 W A \mathbf{W}_{A} WA的权重形状,使其满足 W A ∈ R C × N ⋅ K 4 \mathbf{W}_{A} \in \mathbb{R}^{C \times N \cdot K^{4}} WA∈RC×N⋅K4。然后,将展望权重和价值嵌入均匀地分割成 N N N段,得到 A n ∈ R H × W × K 4 \mathbf{A}_{n} \in \mathbb{R}^{H \times W \times K^{4}} An∈RH×W×K4和 V n ∈ R H × W × C N , { n = 1 , 2 , … , N } \mathbf{V}_{n} \in \mathbb{R}^{H \times W \times C_{N}},\{n=1,2, \ldots, N\} Vn∈RH×W×CN,{n=1,2,…,N},其中 C N C_{N} CN是每个头的维度,满足 C N × N = C C_{N} \times N=C CN×N=C。对于每一对 ( A n , V n ) \left(\mathbf{A}_{n}, \mathbf{V}_{n}\right) (An,Vn),分别计算展望注意力,然后将它们拼接作为多头展望注意力的输出。在我们的实验部分,我们将研究头数对模型性能的影响。
2.1.3 讨论
我们的展望注意力继承了卷积和自注意力的优点。它具有以下优势。首先,展望注意力通过测量成对标记表示之间的相似性来编码空间信息,这在特征学习上比卷积更参数高效,如先前工作[37, 45]所述。其次,展望注意力采用滑动窗口机制,在细粒度上局部编码标记表示,并在一定程度上保留了视觉任务所需的关键位置信息[25,56]。第三,生成注意力权重的方式简单且高效。与依赖于查询-键矩阵乘法的自注意力不同,我们的展望权重可以通过简单的整形操作直接生成,从而节省了计算量。为了说明这一点,我们比较了在大小为 H × W H \times W H×W的标记上操作、滑动窗口大小为 K × K K \times K K×K时,自注意力(SA)和局部自注意力(LSA)以及我们的展望注意力(OA)的计算量:
M-Adds ( S A ) ≈ 4 H W C 2 + 2 ( H W ) 2 C M-Adds ( L S A ) ≈ 4 H W C 2 + 2 H W K 2 C M-Adds ( O A ) ≈ H W C ( 2 C + N K 4 ) + H W K 2 C . \begin{aligned} \text { M-Adds }(\mathbf{S A}) & \approx 4 H W C^{2}+2(H W)^{2} C \\ \text { M-Adds }(\mathbf{L S A}) & \approx 4 H W C^{2}+2 H W K^{2} C \\ \text { M-Adds }(\mathbf{O A}) & \approx H W C\left(2 C+N K^{4}\right)+H W K^{2} C . \end{aligned} M-Adds (SA) M-Adds (LSA) M-Adds (OA)≈4HWC2+2(HW)2C≈4HWC2+2HWK2C≈HWC(2C+NK4)+HWK2C.
考虑到一个典型情况,其中 C = 384 , K = 3 C=384, K=3 C=384,K=3,且 N = 6 N=6 N=6,由于 N K 4 < 2 C N K^{4}<2 C NK4<2C,我们的展望注意力在计算上更高效。
2.2. 网络架构变体
我们基于LV-ViT模型[32]构建了所提出的VOLO,我们发现LV-ViT模型是一个出人意料的强大基线,它使用1.5亿个可学习参数达到了86.2%的ImageNet top-1准确率。原始的LV-ViT模型由一个patch嵌入模块组成,该模块将大小为
224
×
224
224 \times 224
224×224的输入图像映射为
14
×
14
14 \times 14
14×14的标记,以及一系列对
14
×
14
14 \times 14
14×14标记进行操作的Transformer。为了利用细粒度的标记表示,在第一阶段,我们调整patch嵌入模块,使图像在小尺寸(
8
×
8
8 \times 8
8×8)的图像块上进行标记化,而不是(
16
×
16
16 \times 16
16×16)。我们使用一堆Outlooker来生成更具表达力的细粒度标记表示。在第二阶段,使用另一个patch嵌入模块对标记进行下采样。然后采用一系列Transformer来编码全局信息。
基于上述网络结构,我们引入了VOLO的五个版本:VOLO-D1、VOLO-D2、VOLO-D3、VOLO-D4和VOLO-D5。这五个版本的详细超参数设置可以在表2中找到。在所有版本中,我们都将Outlooker和Transformer的比例保持在大约1:3,这是我们在实验中发现的最佳比例。我们还在最后阶段添加了两个类别注意力层[52]来更新类别嵌入。Outlooker中的隐藏维度设置为Transformer中隐藏维度的一半。
3. 实验
我们在ImageNet[12]数据集上评估了所提出的VOLO。在训练过程中,我们没有使用任何额外的训练数据。我们的代码基于PyTorch[39]、Token Labeling工具箱[32]和timm[59]。我们使用带有Token Labeling的LV-ViT-S[32]模型作为基线。
设置:我们使用AdamW优化器[38],采用线性学习率缩放策略
l
r
=
L
R
base
×
batchsize
1024
l r=\mathrm{LR}_{\text {base }} \times \frac{\text { batchsize }}{1024}
lr=LRbase ×1024 batchsize 和
5
×
1
0
−
2
5 \times 10^{-2}
5×10−2的权重衰减率,如之前的工作[51,32]所建议的,所有VOLO模型的
L
R
base
\mathrm{LR}_{\text {base }}
LRbase 在表3中给出。我们使用了随机深度[29]。我们在ImageNet数据集上训练模型300个周期。对于数据增强方法,我们使用了CutOut[76]、RandAug[11]和带有MixToken[32]的Token Labeling目标。我们没有使用MixUp[72]或CutMix[70],因为它们与MixToken冲突。我们在具有8个NVIDIA V100或A100 GPU的机器节点上训练所有VOLO模型,除了需要两个节点的VOLO-D5。对于VOLO-D1和VOLO-D2,4个GPU也足够,批量大小为512(16G)或1024(32G)。为了在更大的图像分辨率上进行微调,我们将批量大小设置为512,学习率设置为
5
e
−
6
5 \mathrm{e}-6
5e−6,权重衰减设置为
1
e
−
8
1 \mathrm{e}-8
1e−8,并运行模型30个周期。其他超参数设置为默认值。微调所需的节点数取决于模型大小,范围为2-8个。
模型设置:VOLO-D1到VOLO-D5的模型设置列在表3中。我们发现大型模型(具有1亿+参数)存在过拟合问题。为了缓解这个问题,我们为它们设置了较大的随机深度率。此外,学习率的选择也对性能有轻微影响。我们发现对于小型模型,使用较大的初始学习率更有益。此外,裁剪比例也可以略微影响性能。大型模型更喜欢较大的裁剪比例。
3.1. 主要结果
我们在表4中将所提出的VOLO与文献中的最新模型进行了比较。所列出的所有结果都是仅使用ImageNet-1k图像进行训练,没有使用任何额外的训练数据。“Top-1”、“Real Top-1”和“V2 Top-1”分别指使用原始ImageNet验证标签、清理后的真实标签[1]和ImageNetV2标签[43]获得的top-1准确率。“训练大小”和“测试大小”表示训练和微调(CNN的测试)中使用的分辨率。我们根据模型大小(参数数量)将结果分为五个部分。
可以看出,对于不同的模型大小,我们提出的VOLO始终优于之前的最新模型。特别是,以具有2660万个参数的VOLO-D1为例,在224分辨率下进行测试已经在ImageNet上获得了84.2%的top-1准确率。在384分辨率下进行微调进一步将性能提高到85.2%,这明显优于具有相当数量训练参数的所有模型。当模型大小扩展到2.96亿时,我们可以在ImageNet上达到87.1%的top-1准确率,在没有额外训练数据的情况下创下了新纪录。据我们所知,我们的VOLO-D5是第一个在没有额外训练数据的情况下在ImageNet上达到87.1% top-1准确率的模型。
我们的模型还在“Real Top-1”和“V2 Top-1”基准上取得了最佳结果。如表4所示,我们的VOLO-D4仅具有1.93亿个参数,其性能明显优于之前的最新模型,如CaiT-M48和NFNet。我们的模型在ImageNet-V2基准上的表现甚至更好。可以看出,我们的VOLO-D3仅使用CaiT-M48四分之一的参数(8600万 v.s. 3.56亿),就可以将之前的最佳结果提高0.8%(76.9% v.s. 77.7%)。我们最大的VOLO-D5可以进一步将性能提高到78%。
3.2. Outlooker的性能
在本小节中,我们证明了所提出的VOLO中Outlooker的重要性。我们采用最近的最新视觉Transformer模型LV-ViT-S作为基线。LV-ViT-S总共包含16个Transformer,并在ImageNet上获得了83.3%的top-1准确率。LV-ViT-S中的每个标记对应于大小为
16
×
16
16 \times 16
16×16的图像块,因此对于
224
×
224
224 \times 224
224×224的输入图像,总共有
14
×
14
14 \times 14
14×14个标记。从LV-ViT-S[32]基线到我们的VOLO-D1的实验路径及相应结果可以在表5中找到。
由于我们提出的Outlooker的目标是编码具有表达力的细粒度特征,我们首先调整起始的patch嵌入模块,并将patch大小从 16 × 16 16 \times 16 16×16更改为 8 × 8 8 \times 8 8×8。我们在细粒度级别上用两个Outlooker替换了两个Transformer。从表5的第二行可以看出,这种轻微的调整在已经达到83.3% top-1准确率的基线基础上为我们带来了0.4%的收益。再添加两个Outlooker可以进一步提高性能至83.9%。最后,将所有Transformer中的头数从6更改为12,并在 384 × 384 384 \times 384 384×384分辨率下对所得模型进行微调,我们可以得到85.2%的结果,据我们所知,这是首次在不到3000万个参数的情况下达到85+%的准确率。
我们也尝试用其他方法进行细粒度特征编码来替换所提出的全局注意力机制,包括局部自注意力[37]和空间卷积。为了公平比较,我们将局部自注意力和卷积的窗口大小都设置为 3 × 3 3 \times 3 3×3。结果可见于表6。可以看出,在相同的训练方案和架构下,我们的Outlooker性能优于局部自注意力和卷积。此外,我们还可以观察到,与LV-ViT-S基线相比,局部自注意力和卷积也能提升性能,这表明编码细粒度标记表征确实有帮助。
3.3 消融分析
模型缩放:我们以两种方式将VOLO-D1模型扩展到4个不同的模型(VOLO-D2至VOLO-D5):1) 在训练期间增加模型大小,包括网络深度、隐藏维度、MLP中的扩展比率以及Outlooker和Transformer中的头数;2) 在微调和测试期间增加图像分辨率。所有模型的规格已在表2中展示,其对应的结果可见于表7。我们可以观察到,上述两种方式都能在很大程度上提高模型性能。从VOLO-D1到VOLO-D2,参数加倍后,性能提升了
1
%
1\%
1%。进一步将模型大小从VOLO-D2增加到VOLO-D5,又带来了近
1
%
1\%
1%的准确率提升。此外,对于所有五个模型,在微调期间增加分辨率带来了大约
1
%
1\%
1%的性能提升。
Outlooker的数量:我们观察到,在VOLO中使用的Outlooker数量对分类性能有影响。在这里,我们研究了在VOLO中使用不同数量的Outlooker的影响。请注意,所有Outlooker都作用于更细粒度的标记表征( 28 × 28 28 \times 28 28×28)。结果已在表8的上部展示。如果不使用任何Outlooker,具有16个Transformer的基线获得了 83.3 % 83.3\% 83.3%的准确率。增加Outlooker的数量可以改善结果,但当使用4个Outlooker时,性能趋于饱和。进一步增加Outlooker不会带来任何性能提升。因此,在扩展模型时,我们大约以 1 : 3 1:3 1:3的比例使用Outlooker和Transformer。
Outlooker中的头数:在Transformer中,给定固定的隐藏维度,每个头中的通道维度与头数成反比。不同的是,在Outlooker中,当核大小固定时,每个头中的通道维度是固定的(即 C = K 4 C=K^{4} C=K4)。那么,如果使用更多的头,Outlooker的性能会更好吗?在表8的下部,我们展示了具有不同头数的Outlooker的结果。实验表明,在Outlooker中使用更多的头可以略微提高性能,且几乎没有额外的参数增加,但当头数超过6时,这种提升就停止了。因此,默认情况下,对于384的隐藏维度,我们在Outlooker中设置头数为6。当隐藏维度设置为768时,我们在Outlooker中使用12个头。
3.4 语义分割
在本小节中,我们使用VOLO作为预训练模型来评估语义分割的性能。我们的代码基于mmsegmentation[9]。我们在两个广泛使用的分割基准:Cityscapes[10]和ADE20K[77]上报告了结果。采用了UperNet[62]分割框架。在训练过程中,我们使用AdamW优化器,初始学习率为 6 e − 5 6 \mathrm{e}-5 6e−5,权重衰减为0.01。我们还使用线性学习率调度,最小学习率为 5 e − 6 5 \mathrm{e}-6 5e−6。所有模型都可以在配备8个A100 GPU的机器节点上进行训练。对于Cityscapes,我们将批量大小设置为8,输入分辨率设置为 1024 × 1024 1024 \times 1024 1024×1024。对于ADE20K,批量大小设置为16,输入分辨率为 512 × 512 512 \times 512 512×512。根据[77]的建议,我们报告了两个数据集的平均交并比(mIoU)和ADE20K的平均像素准确率。在推理过程中,我们使用插值率为 [ 0.75 , 1.0 , 1.25 , 1.5 , 1.75 ] [0.75, 1.0, 1.25, 1.5, 1.75] [0.75,1.0,1.25,1.5,1.75]的多尺度测试。
3.4.1 Cityscapes数据集
Cityscapes[10]是语义分割领域最受欢迎的数据集之一,其目标是街道场景分割。该数据集包含5000张高质量像素级标注图像,分辨率为 1024 × 2048 1024 \times 2048 1024×2048,共包含19个类别。与大多数先前的工作一样,我们将整个数据集分为三个部分:训练集、验证集和测试集,分别包含2975张、500张和1525张图像。我们在验证集上报告结果。对比结果可参见表9。显然,所提出的方法优于所有其他方法,包括最近的最先进的SegFormer-B5模型。我们采用UperNet解码器头的VOLO-D4取得了最佳结果,为 84.3 % 84.3\% 84.3%,比先前最先进的SegFormer-B5模型的结果 84.0 % 84.0\% 84.0%高出 0.3 % 0.3\% 0.3%。根据PaperWithCode 3 { }^{3} 3,这是Cityscapes验证集上的最新最佳结果。
3.4.2 ADE20K数据集
我们还在广泛使用的ADE20K[77]数据集上进行了实验。ADE20K总共包含25000张图像,其中20000张用于训练,2000张用于验证,3000张用于测试。它涵盖了150个不同的常见前景类别。我们在表10中将我们的分割结果与先前最先进的分割方法进行了比较。在没有在ImageNet-22K等大规模数据集上进行预训练的情况下,我们的采用UperNet的VOLO-D1实现了
50.5
50.5
50.5的mIoU分数。当使用VOLO-D5作为主干网络时,mIoU分数可以进一步提高到
54.3
54.3
54.3,这是在ADE20K上的最新最佳结果,除了ImageNet-1k外,没有使用其他额外的预训练数据。
4. 相关工作
作为计算机视觉中最基本的问题之一,自引入深度神经网络模型以来,图像分类取得了显著进展。接下来,我们简要回顾那些与本文密切相关的成功模型。
早期在图像分类方面取得最佳性能的模型大多是基于卷积神经网络(CNN)的,它们简单地堆叠一系列空间卷积和池化,以AlexNet[33]和VGGNet[44]为代表。ResNets[20]通过引入跳跃连接来改进CNN架构的设计,从而能够训练非常深的模型。Inceptions[48, 49, 47]和ResNeXt[65]研究了模型构建块的设计原则,并引入了多条并行路径的专门过滤器集合。SENet[27]提出了一个压缩-激励模块,以显式地建模通道间的相互依赖关系。DPNs[7]利用残差连接和密集连接来设计更强的构建块。EfficientNet[50]和NasNet[80]利用神经架构搜索来搜索强大的网络架构。后来的最先进模型[30, 53, 63]大多利用不同的训练或优化方法或微调技术来改进EfficientNet。最近,NFNet[2]通过设计一种无归一化架构打破了EfficientNet的主导地位,这是首个在ImageNet上使用无额外数据达到 86.5 % 86.5\% 86.5% top1准确率的模型。多年来,卷积神经网络作为视觉识别中的实际网络,确实取得了非常成功的结果,但其重点是通过设计更好的架构来学习更具判别性的局部特征。从本质上讲,它们缺乏在表示之间显式构建全局关系的能力,而这已被证明是至关重要的[58]。
图像分类领域的最新进展主要是由基于注意力[73, 58, 26]或特别是基于Transformer的模型推动的。Transformer利用自注意力机制,使得建模长距离依赖成为可能。Transformer[55]最初是为自然语言任务[13, 41, 3, 67, 40, 36]设计的,但最近已被证明在图像分类中同样有效。Dosovitskiy等人[14]是首批证明纯基于Transformer的架构(即ViT)也能在图像分类中取得最佳性能的研究者之一,但这类架构需要大规模数据集(如ImageNet-22k和JFT-300M,后者未公开)进行预训练。DeiT[51]和T2T-ViT[68]缓解了ViT需要大规模数据集的问题,并提出了数据高效的ViT。自此以后,关于ViT的研究层出不穷,并不断进步。其中一些研究[4, 19, 61, 54, 79]通过修改块嵌入(patch embedding)块或Transformer块或两者都修改,将局部依赖性引入视觉Transformer中;而其他研究[21, 37, 57]则采用金字塔结构来减少整体计算量,同时保持模型捕获低级特征的能力。还有一些研究[78, 71, 52, 18]旨在解决ViT的优化和扩展问题。
我们的VOLO不仅建模长距离依赖,还通过提出的Outlooker将精细特征编码到令牌(token)表示中。与最近依赖卷积进行特征编码的混合架构(如Hybrid-ViT[14]和BoTNet[45])不同,Outlooker提出使用局部成对令牌相似性来将精细特征和空间上下文编码到令牌特征中,因此更有效且参数更高效。这也使我们的模型与动态卷积[60]和Involution[34](它们生成依赖于输入的卷积核来编码特征)有所不同。
5. 结论
我们提出了一种新的模型——Vision Outlooker(VOLO)。大量的图像分类和分割实验表明,VOLO优于基于CNN和Transformer的模型,并建立了新的最佳结果。我们希望VOLO在多个计算机视觉任务上的强大性能能够鼓励后续研究更好地学习精细特征。VOLO的性能优势来自于新的Outlook注意力机制,该机制以密集的方式动态聚合精细特征,我们将继续在自然语言处理等其他应用中继续研究。
致谢
我们衷心感谢NVIDIA AI Tech Center(NVAITC)对本研究项目的支持,特别是Terry Jianxiong Yin(NVAITC)和Qingyi Tao(NVAITC)在GPU技术支持方面提供的巨大帮助。
代码
class OutlookAttention(nn.Module):
"""
Implementation of outlook attention
--dim: hidden dim
--num_heads: number of heads
--kernel_size: kernel size in each window for outlook attention
return: token features after outlook attention
"""
def __init__(self, dim, num_heads, kernel_size=3, padding=1, stride=1,
qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):
super().__init__()
head_dim = dim // num_heads
self.num_heads = num_heads
self.kernel_size = kernel_size
self.padding = padding
self.stride = stride
self.scale = qk_scale or head_dim ** -0.5
self.v = nn.Linear(dim, dim, bias=qkv_bias)
self.attn = nn.Linear(dim, kernel_size ** 4 * num_heads)
self.attn_drop = nn.Dropout(attn_drop)
self.proj = nn.Linear(dim, dim)
self.proj_drop = nn.Dropout(proj_drop)
self.unfold = nn.Unfold(kernel_size=kernel_size, padding=padding, stride=stride)
self.pool = nn.AvgPool2d(kernel_size=stride, stride=stride, ceil_mode=True)
self.id = nn.Identity()
def forward(self, x):
x = x.permute(0, 2, 3, 1)
B, H, W, C = x.shape
v = self.v(x).permute(0, 3, 1, 2) # B, C, H, W
h, w = math.ceil(H / self.stride), math.ceil(W / self.stride)
v = self.unfold(v).reshape(B, self.num_heads, C // self.num_heads,
self.kernel_size * self.kernel_size,
h * w).permute(0, 1, 4, 3, 2) # B,H,N,kxk,C/H
attn = self.pool(x.permute(0, 3, 1, 2)).permute(0, 2, 3, 1)
attn = self.attn(attn).reshape(
B, h * w, self.num_heads, self.kernel_size * self.kernel_size,
self.kernel_size * self.kernel_size).permute(0, 2, 1, 3, 4) # B,H,N,kxk,kxk
attn = attn * self.scale
attn = attn.softmax(dim=-1)
attn = self.attn_drop(attn)
x = (attn @ v).permute(0, 1, 4, 3, 2).reshape(
B, C * self.kernel_size * self.kernel_size, h * w)
x = F.fold(x, output_size=(H, W), kernel_size=self.kernel_size,
padding=self.padding, stride=self.stride)
x = self.proj(x.permute(0, 2, 3, 1))
x = self.proj_drop(x) # B, H, W, C
x = x.permute(0, 3, 1, 2) # B, C, H, W
return x