利用深度学习迭代自洽的蛋白序列设计

——背景——

现有的基于蛋白结构的深度学习序列设计方法,虽然在测试的计算指标上取得了很好的成果,但是还鲜有方法经过实验的考验仍然超越传统的能量函数方法。基于这一挑战,中国科学技术大学的刘海燕教授课题组,发展了名为ABACUS-R方法,相关工作名为Rotamer-free protein sequence design based on deep learning and self-consistency,于近期发表在Nature Computational Science上。

图1. ABACUS-R方法的示意图

——方法——

ABACUS-R方法包含两部分:(1)一个encoder-decoder网络被预训练用以推断给定骨架的局部环境时中心残基的侧链类型 (2)用该encoder-decoder网络连续更新每个残基的类型,最终收敛获得自洽(self-consistent)。网络的输入是中心残基与空间上最邻近(Cα间距离)k个残基组成的局部结构。邻近残基的特征包含空间层面的相对位置与取向信息(XSPA)、序列层面的相对位置信息(XRSP)以及邻近残基的残基类型(XAA)。第i个中心残基的特征包含全零的XSPA、被mask的XAA以及骨架上的15个ϕi−2ψi−2ωi−2 ⋯ ϕi+2ψi+2ωi+2,这些特征组合起来会被映射到与邻近残基特征相同的维度。以上模型输入的信息都是旋转平移不变的。局部结构中的所有残基的特征经过可学习的映射后融合后,得到每个残基总特征En。{En; n = 0, 1, 2, … , k}经过基于transformer架构的encoder-decoder,预测每个中心残基的类型以及其他辅助任务。

自洽迭代设计的方法是:对序列随机初始化,第一轮随机选择80%的残基通过encoder-decoder并行预测其残基类型,以后每轮随机选择的残基数目逐渐下降。最终的设计结果会逐渐收敛。

作者将PDB中的非冗余结构按照两种不同的方式划分了95%作为训练集、5%作为测试集,第一种划分方式确保测试集的结构不会存在训练集中出现过的CATH拓扑,训练得到的模型为Model­­eval;第二种划分方式时随机划分Modelfinal。Model­­eval可以用来评估模型能力的无偏向性的表现,而Modelfinal使用了更丰富的数据训练表现应当更好。

——表现评估——

Encoder-decoder的架构可以进行多任务学习,除了训练序列的恢复的任务以外,还可以预测二级结构、SASA、B-factor与侧链扭转角χ1、χ2。多个任务可以增强模型设计序列的能力(图2a),Model­­eval与Model­­final都可以在测试集上最好取得50%左右准确度。在测试集上的结果显示,虽然有些残基类型没有恢复正确,但是模型也学习到了替换为性质相似的残基(图2b)。

图2. Model­­eval在不同任务类型下的表现

Decoder网络输出的是每个位置上残基类型的-logP,类似于选择不同残基对应的能量,所以作者将ProTherm数据集中蛋白突变的ΔΔG与模型计算出相应的−ΔΔlogits进行了比较,发现二者有一定的相关性(图2d),说明模型一定程度上学习到了能量。

接着,作者验证了模型的自洽性,测试集中100个蛋白属于CATH的三个大类,对其中的每个蛋白从随机序列出发设计10条序列,随着迭代的次数变多,平均-logP会趋于收敛(图3a),同时未收敛的残基比例也会收敛(图3b)。不同CATH类别的骨架上取得的序列恢复率差距不大(图3c)。同一蛋白骨架设计出的序列会有很高的相似性(0.76-0.89)。设计出的序列与天然序列相比,序列的成分高度相似(图3d),Pearson相关系数达到了0.93,但GLU、ALA与LYS出现得更频繁,而Gln、His、Met出现得更少。此外,ABACUS-R设计出的序列与ABACUS设计出的序列相比,平均每个残基的Rosetta打分更低(图3e),而平均的-logP打分却更高(图3f),这意味着ABACUS-R学习到的能量与Rosetta打分函数存在正交的部分。

图3. ABACUS-R的自洽能力、设计能力以及学习到的能量与Rosetta打分的比较

相较于其他深度学习方法在单个残基恢复任务上的表现,ABACUS-R超过了除DenseCPD外的所有方法(表1),在整条序列重设计任务上ABACUS-R在两个测试集上都取得了最好的表现(表2)。

最后,作者在3种天然骨架(PDB ID: 1r26, 1cy5 and 1ubq)上通过实验验证了ABACUS-R的设计能力。设计的方法有两种:第一种采用迭代自洽的设计方法(生成序列的多样性低),第二种采用迭代时对decoder输出结果进行采样(生成序列的多样性高,但-logP能量也略高)。

第一种方法设计的27条序列有26条成功表达,体积排阻色谱与1H NMR实验结果显示所有的蛋白都以单体形式存在,示差扫描量热实验显示5条序列有很好的热稳定性( 97~117 C )。最终,1r26的3个设计与1cy5的1个设计成功解出了晶体结构,Cα RMSD位于0.51~0.88 Å,而1ubq的1个设计虽然没有解出结构,但已有的实验结果显示它折叠成了明确的三维结构。

第二种方法对同一骨架设计的序列相似度在58%左右。30条设计的序列中,25条被成功表达,23条能被可溶地纯化。所有设计同样都是单体存在并且折叠成了明确的三维结构,5个设计有很好的热稳定性(85~118 C)。最终,1r26的1个设计被成功解出了晶体结构,Cα RMSD为0.67 Å。相较方法一的自洽设计,方法二设计成功率下降,成功设计的蛋白热稳定性也略微下降,但作者认为可以接受。

最后,作者展示了所有1r26设计晶体结构核心的侧链pack(图4a,b),以及1cy5设计晶体结构的侧链的极性作用(图4c),说明了ABACUS-R学会了设计侧链的组合以pack好的结构。

——总结——

总之,作者开发的ABACUS-R方法在不需要显示地模拟侧链,可以学习到给定结构下侧链类型的能量打分。ABACUS-R不仅取得了很好的序列恢复度,还在实验上取得了很好的成功率。

CVPR2022 | 自注意力和卷积的融合(ACmix)

前言  通常convolution和self-attention被认为是表征学习的两个有力且相互对等的不用方法。在本文中,作者发掘了两者之间的潜在关系,两者的大部分计算实际上是相通的。

作者将K x K 的传统卷积分解为k方个1 x 1的卷积,然后将self-attention模块中queries、 keys等解释为多个1 x 1的卷积,然后计算注意力权重和聚合值。

该模型在图像识别和down streamtasks取得了优异的结果。

论文题目:On the Integration of Self-Attention and Convolution

论文链接:https://openaccess.thecvf.com/content/CVPR2022/papers/Pan_On_the_Integration_of_Self-Attention_and_Convolution_CVPR_2022_paper.pdf

源代码:https://github.com/LeapLabTHU/ACmix         https://gitee.com/mindspore/models.

卷积神经网络与自注意力在图像识别、语义分割等方面取得了飞速的发展。随着transformers的出现,attention-based的方法取得了更加优异的性能。尽管两种方法都取得了成功,但是两者遵循不同的设计思路。前者在特征图中共享权重,后者通过动态计算像素间的相似度函数从而能够捕获不同区域的特征进而获得更多的特征。

在一些工作中,研究人员仅使用self-attention来独立地构建视觉任务模型,这一做法的有效性在一些任务中得到了验证,其完全可以代替卷积操作。Vision Transformer表明只要给定足够的数据,就可以获得优异的结果,这一做法在点云分割等其他视觉任务上也取得了不错的效果。Hu等人提出自适应确定聚合的方法;Wang等人通过引入非局部块来增加感受野来比较全局像素之间的相似性;Conformer将transformer与独立的CNN结合来整合两个特征。

早期的工作从几个不同的角度探索了convolution和self-attention的组合,CBAM等证明self-attention可以作为convolution的增强;SAN等提出self-attention可以代替传统的convolution;AA-ResNet等在设计独立架构方面存在局限性。现有的方法仍将自注意力和卷积视为不同的部分,因此它们之间的关系并未得到充分利用。

本文主要贡献


1、揭示了self-attention和convolution之间的潜在关系,为了解两个模块间的关联和设计新的learning paradigms提供了新的视角。

2、self-attention和convolution的组合使得两者的功能得到整合,经验及实验证明混合模型的性能始终优于纯卷积或者自注意力模型。

方法


1、将self-attention和convolution关联起来

标准卷积可以分为两个部分,第一个阶段为一个特征学习模块,通过执行1 x 1的卷积共享相同的操作将特征投影到更深的空间,第二阶段对应于特征聚合的过程。作为结论,分析表明卷积和自注意力在通过1 x 1的卷积投影输入特征图实际上共享相同的操作,聚合操作是轻量级的,并不需要获取额外的学习参数。卷积和自注意力的示意图如下图所示。

2、将self-attention和convolution进行整合

作者根据上述的分析提出ACmix模型,如下图所示:

ACmix模型分为两个阶段,在阶段一,输入特征由三个1 x 1的卷积操作并被reshape成N块,由此获得丰富的3 x N的特征图;在阶段二,对于self-attention,作者将中间特征收集到N组中,每组包含三个部分特征,其中每个1 x 1卷积对应一个。通过移动和聚合生成的特征(用以下公式表达),并像传统方法一样从本地感受野中收集信息。

3、对Shift和Summation进行改进

中间特征遵循传统的卷积模块中的Shift和Summation操作,尽管这些操作在理论上是轻量级的,但是难以矢量化实现,这会极大影响计算的实际效率。作者采用了固定内核的深度卷积来解决这一问题,如下图所示。

在此基础上,作者额外引入了一些配置来增强模块的灵活性,如下图所示,作者将卷积核释放为可学习的权重,对内核初始化,这不仅改善了模型容量,而且能够保持原有的能力,同时使用多组卷积内核来匹配卷积和自注意力路径的输出通道维度。

4、ACmix的计算成本

作者总结了ACmix的FLOPS和参数量,在stage1 的训练参数与self-attention相同,并且比传统的卷积更轻,在第二阶段,引入了额外的计算开销,包含轻量级的全连接层等。

5、向其他注意力模式推广

作者所提出的ACmix独立于自注意力机制,并且很容易衍生出其他变体,注意力的权重可以表示为

实验

1、ImageNet分类

作者在4个baseline models上应用了ACmix,包括ResNet, SAN, PVT和 Swin-Transformer。

2、语义分割

作者在ADE20K上对比了Semantic-FPN、UperNet 两种方法

3、目标检测

在COCO benchmark上开展了实验,实验结果证实了ACmix的性能优于baseline

结论


在本文中,作者发掘了self-attention和convolution之间的潜在关系,两者的大部分计算实际上是相通的,所提的ACmix在目标检测、语义分割等多个任务上展示了优异的性能。

Yolo 系列之 Yolov7 基础网络结构

YOLOV7 整体结构

我们先整体来看下 YOLOV7,首先对输入的图片 resize 为 640×640 大小,输入到 backbone 网络中,然后经 head 层网络输出三层不同 size 大小的 feature map,经过 Rep 和 conv输出预测结果,这里以 coco 为例子,输出为 80 个类别,然后每个输出(x ,y, w, h, o) 即坐标位置和前后背景,3 是指的 anchor 数量,因此每一层的输出为 (80+5)x3 = 255再乘上 feature map 的大小就是最终的输出了。

  1. backbone
    YOLOV7 的 backbone 如下图所示

总共有 50 层, 我在上图用黑色数字把关键层数标示出来了。 首先是经过 4 层卷积层,如下图,CBS 主要是 Conv + BN + SiLU 构成,我在图中用不同的颜色表示不同的 size 和 stride, 如 (3, 2) 表示卷积核大小为 3 ,步长为 2。 在 config 中的配置如图。

经过 4个 CBS 后,特征图变为 160 * 160 * 128 大小。随后会经过论文中提出的 ELAN 模块,ELAN 由多个 CBS 构成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化, 后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道。

MP 层 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化。


backbone的基本组件就介绍完了,我们整体来看下 backbone,经过 4 个 CBS 后,接入例如一个 ELAN ,然后后面就是三个 MP + ELAN 的输出,对应的就是 C3/C4/C5 的输出,大小分别为 80 * 80 * 512 , 40 * 40 * 1024, 20 * 20 * 1024。 每一个 MP 由 5 层, ELAN 有 8 层, 所以整个 backbone 的层数为 4 + 8 + 13 * 3 = 51 层, 从 0 开始的话,最后一层就是第50层。

3、head

YOLOV7 head 其实就是一个 pafpn 的结构,和之前的YOLOV4,YOLOV5 一样。首先,对于 backbone 最后输出的 32 倍降采样特征图 C5,然后经过 SPPCSP,通道数从1024变为512。先按照 top down 和 C4、C3融合,得到 P3、P4 和 P5;再按 bottom-up 去和 P4、P5 做融合。这里基本和 YOLOV5 是一样的,区别在于将 YOLOV5 中的 CSP 模块换成了 ELAN-H 模块, 同时下采样变为了 MP2 层。 ELAN-H 模块是我自己命名的,它和 backbone 中的 ELAN 稍微有点区别就是 cat 的数量不同。

对于 pafpn 输出的 P3、P4 和 P5 , 经过 RepConv 调整通道数,最后使用 1×1 卷积去预测 objectness、class 和 bbox 三部分。 RepConv 在训练和推理是有一定的区别。训练时有三个分支的相加输出,部署时会将分支的参数重参数化到主分支上

YOLOv7来临:论文详读和解析+训练自己数据集

2022年7月,YOLOv7来临,

论文链接:https://arxiv.org/abs/2207.02696

代码链接:https://github.com/WongKinYiu/yolov7

文章摘自https://mp.weixin.qq.com/s/5qK1FIU7qp0Sv3IE49-t_w

在v7论文挂出不到半天的时间,YOLOv3和YOLOv4的官网上均挂上了YOLOv7的链接和说明,由此看来大佬们都比较认可这款检测器。

官方版的YOLOv7相同体量下比YOLOv5精度更高,速度快120%(FPS),比 YOLOX 快180%(FPS),比 Dual-Swin-T 快1200%(FPS),比 ConvNext 快550%(FPS),比 SWIN-L快500%(FPS)。在5FPS到160FPS的范围内,无论是速度或是精度,YOLOv7都超过了目前已知的检测器,并且在GPU V100上进行测试, 精度为56.8% AP的模型可达到30 FPS(batch=1)以上的检测速率,与此同时,这是目前唯一一款在如此高精度下仍能超过30FPS的检测器。另外,YOLOv7所获得的成果不止于此,例如:

  • YOLOv7-e6 (55.9% AP, 56 FPS V100 b=1) by +500% FPS faster than SWIN-L Cascade R-CNN (53.9% AP, 9.2 FPS A100 b=1)
  • YOLOv7-e6 (55.9% AP, 56 FPS V100 b=1) by +550% FPS faster than ConvNeXt-RCNN (55.2% AP, 8.6 FPS A100 b=1)
  • YOLOv7-w6 (54.6% AP, 84 FPS V100 b=1) by +120% FPS faster than YOLOv5-X6-v6.1 (55.0% AP, 38 FPS V100 b=1)
  • YOLOv7-w6 (54.6% AP, 84 FPS V100 b=1) by +1200% FPS faster than Dual-Swin-RCNN (53.6% AP, 6.5 FPS V100 b=1)
  • YOLOv7 (51.2% AP, 161 FPS V100 b=1) by +180% FPS faster than YOLOX-X (51.1% AP, 58 FPS V100 b=1)

本文做出的贡献如下:

  1. 设计了几种可训练的bag-of-freebies,使实时检测器可以在不提高推理成本的情况下大大提高检测精度;
  2. 对于目标检测的发展,作者发现了两个新的问题,即模块重参化如何高效替代原始模块,以及动态标签分配策略如何处理好不同输出层的分配。因此在本文中提出了方法进行解决。
  3. 作者为实时探测器提出了“扩展”和“复合缩放”(extend” and “compound scaling”)方法,可以更加高效地利用参数和计算量,同时,作者提出的方法可以有效地减少实时探测器50%的参数,并且具备更快的推理速度和更高的检测精度。(这个其实和YOLOv5或者Scale YOLOv4的baseline使用不同规格分化成几种模型类似,既可以是width和depth的缩放,也可以是module的缩放)

2.1 实时检测器

目前最先进的实时探测器主要基于YOLO和FCOS,如果需要研发更先进的实时检测器,通常需要具备以下特征:

  • (1)更快和更高效的网络架构;
  • (2)更有效的特征积分方法;
  • (3)更准确的检测方法;
  • (4)更鲁棒的损失函数;
  • (5)更有效的标签分配方法;
  • (6)更有效的训练方式。

2.2 模型重参化

模型重参化策略在推理阶段将多个模块合并为一个计算模块,可以看作是一种集成技术(model ensemble,其实笔者觉得更像是一种基于feature的distillation),可以将其分为模块级集成和模型级集成两类。对于模型级重新参数化有两种常见的操作:

  • 一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均。
  • 一种是对不同迭代次数下模型权重进行加权平均。

模块重参化是近年来一个比较流行的研究课题。这种方法在训练过程中将一个整体模块分割为多个相同或不同的模块分支,但在推理过程中将多个分支模块集成到一个完全等价的模块中。然而,并不是所有提出的重参化模块都可以完美地应用于不同的架构。考虑到这一点,作者开发了新的重参数化模块,并为各种架构设计了相关的应用程序策略。下图是作者使用重参化实现构建的多个module,按照分组数不同进行排列,为什么作者会选择32的分组数,应该搞过部署的佬们会清楚一些,模块参考:https://github.com/WongKinYiu/yolov7/blob/main/models/common.py~

2.3 模型缩放

模型缩放通过扩大或缩小baseline,使其适用于不同的计算设备。模型缩放方法通常包括不同的缩放因子,如:

  • input size(输入图像大小)
  • depth(层数)
  • width(通道数)
  • stage(特征金字塔数量)

从而在网络的参数量、计算量、推理速度和精度方面实现很好的权衡。网络架构搜索(NAS)也是目前常用的模型缩放方法之一

三、模型设计架构

3.1 高效的聚合网络

在大多数关于设计高效网络的论文中,主要考虑的因素是参数量、计算量和计算密度。但从内存访存的角度出发出发,还可以分析输入/输出信道比、架构的分支数和元素级操作对网络推理速度的影响(shufflenet论文提出)。在执行模型缩放时还需考虑激活函数,即更多地考虑卷积层输出张量中的元素数量。

图2(b)中CSPVoVNet是VoVNet的一个变体。除了考虑上述几个设计问题外,CSPVoVNet的体系结构还分析了梯度路径,使不同层能够学习更多样化的特征。上面描述的梯度分析方法还能使推理速度更快、模型更准确(看下图!其实和Resnext有点像,但比它复杂一些)。

  • 图2(c)中的ELAN出于以下设计考虑——“如何设计一个高效的网络?”得出结论是:通过控制最短最长梯度路径,更深的网络可以有效地进行学习并更好地收敛。
  • 因此,在本文中,作者提出了基于ELAN的扩展版本E-ELAN,其主要架构如图2(d)所示。在大规模ELAN中,无论梯度路径长度和计算模块数量如何,都达到了稳定的状态。但如果更多计算模块被无限地堆叠,这种稳定状态可能会被破坏,参数利用率也会降低。本文提出的E-ELAN采用expand、shuffle、merge cardinality结构,实现在不破坏原始梯度路径的情况下,提高网络的学习能力。

在体系结构方面,E-ELAN只改变了计算模块中的结构,而过渡层的结构则完全不变。作者的策略是利用分组卷积来扩展计算模块的通道和基数,将相同的group parameter和channel multiplier用于计算每一层中的所有模块。然后,将每个模块计算出的特征图根据设置的分组数打乱成G组,最后将它们连接在一起。此时,每一组特征图中的通道数将与原始体系结构中的通道数相同。最后,作者添加了G组特征来merge cardinality。除了维护原始的ELAN设计架构外,E-ELAN还可以指导不同的分组模块来学习更多样化的特性。(难以置信,要是在CPU上运行,分分钟可能爆)

3.2 基于连接的模型的模型缩放

缩放这个就不说了,和YOLOv5、Scale YOLOv4、YOLOX类似。要不就depth and width,要不就module scale,可参考scale yolov4的P4、P5、P5结构。

四、可训练的赠品礼包(bag-of-freebies)

4.1 卷积重参化

尽管RepConv在VGG上取得了优异的性能,但将它直接应用于ResNet和DenseNet或其他网络架构时,它的精度会显着降低。作者使用梯度传播路径来分析不同的重参化模块应该和哪些网络搭配使用。通过分析RepConv与不同架构的组合以及产生的性能,作者发现RepConv中的identity破坏了ResNet中的残差结构和DenseNet中的跨层连接,这为不同的特征图提供了梯度的多样性(题外话,之前在YOLOv5 Lite上做过此类实验,结果也是如此,因此v5Lite-g的模型也是砍掉了identity,但分析不出原因,作者也没给出具体的分析方案,此处蹲坑)。

基于上述原因,作者使用没有identity连接的RepConv结构。图4显示了作者在PlainNet和ResNet中使用的“计划型重参化卷积”的一个示例。

4.2 辅助训练模块

深度监督是一种常用于训练深度网络的技术,其主要概念是在网络的中间层增加额外的辅助头,以及以辅助损失为指导的浅层网络权重。即使对于像ResNet和DenseNet这样收敛效果好的网络结构,深度监督仍然可以显着提高模型在许多任务上的性能(这个和Nanodet Plus相似,按笔者理解可以当成是深层局部网络的ensemble,最后将辅助头和检测头的权重做融合)。图5(a)和(b)分别显示了“没有”和“有”深度监督的目标检测器架构,在本文中,作者将负责最终的输出头称为引导头,将用于辅助训练的头称为辅助头。

接下来讨论标签分配的问题。在过去,在深度网络的训练中,标签分配通常直接指的是ground truth,并根据给定的规则生成hard label(未经过softmax)。然而近年来,以目标检测为例,研究者经常利用网络预测的质量分布来结合ground truth,使用一些计算和优化方法来生成可靠的软标签(soft label)。例如,YOLO使用bounding box预测和ground truth的IoU作为软标签。

在本文中,作者将网络预测结果与ground truth一起考虑后再分配软标签的机制称为“标签分配器”。无论辅助头或引导头,都需要对目标进行深度监督。那么,‘’如何为辅助头和引导头合理分配软标签?”,这是作者需要考虑的问题。目前最常用的方法如图5(c)所示,即将辅助头和引导头分离,然后利用它们各自的预测结果和ground truth执行标签分配。

本文提出的方法是一种新的标签分配方法,通过引导头的预测来引导辅助头以及自身。换句话说,首先使用引导头的prediction作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习,具体可看图5(d)和(e)。

Lead head guided label assigner: 引导头引导“标签分配器”预测结果和ground truth进行计算,并通过优化(在utils/loss.py的SigmoidBin()函数中,传送门:https://github.com/WongKinYiu/yolov7/blob/main/utils/loss.py 生成软标签。这组软标签将作为辅助头和引导头的目标来训练模型。(之前写过一篇博客,【浅谈计算机视觉中的知识蒸馏】]https://zhuanlan.zhihu.com/p/497067556)详细讲过soft label的好处)这样做的目的是使引导头具有较强的学习能力,由此产生的软标签更能代表源数据与目标之间的分布差异和相关性。此外,作者还可以将这种学习看作是一种广义上的余量学习。通过让较浅的辅助头直接学习引导头已经学习到的信息,引导头能更加专注于尚未学习到的残余信息。

Coarse-to-fine lead head guided label assigner: Coarse-to-fine引导头使用到了自身的prediction和ground truth来生成软标签,引导标签进行分配。然而,在这个过程中,作者生成了两组不同的软标签,即粗标签和细标签,其中细标签与引导头在标签分配器上生成的软标签相同,粗标签是通过降低正样本分配的约束,允许更多的网格作为正目标(可以看下FastestDet的label assigner,不单单只把gt中心点所在的网格当成候选目标,还把附近的三个也算进行去,增加正样本候选框的数量)。原因是一个辅助头的学习能力并不需要强大的引导头,为了避免丢失信息,作者将专注于优化样本召回的辅助头。对于引导头的输出,可以从查准率中过滤出高精度值的结果作为最终输出。然而,值得注意的是,如果粗标签的附加权重接近细标签的附加权重,则可能会在最终预测时产生错误的先验结果。

4.3 其他可训练的bag-of-freebies

  1. Batch normalization:目的是在推理阶段将批归一化的均值和方差整合到卷积层的偏差和权重中。
  2. YOLOR中的隐式知识结合卷积特征映射和乘法方式:YOLOR中的隐式知识可以在推理阶段将计算值简化为向量。这个向量可以与前一层或后一层卷积层的偏差和权重相结合。
  3. EMA Model:EMA 是一种在mean teacher中使用的技术,作者使用 EMA 模型作为最终的推理模型。

五、实验

5.1 实验环境

作者为边缘GPU、普通GPU和云GPU设计了三种模型,分别被称为YOLOv7-Tiny、YOLOv7和YOLOv7-W6。同时,还使用基本模型针对不同的服务需求进行缩放,并得到不同大小的模型。对于YOLOv7,可进行颈部缩放(module scale),并使用所提出的复合缩放方法对整个模型的深度和宽度进行缩放(depth and width scale),此方式获得了YOLOv7-X。对于YOLOv7-W6,使用提出的缩放方法得到了YOLOv7-E6和YOLOv7-D6。此外,在YOLOv7-E6使用了提出的E-ELAN,从而完成了YOLOv7-E6E。由于YOLOv7-tincy是一个面向边缘GPU架构的模型,因此它将使用ReLU作为激活函数。作为对于其他模型,使用SiLU作为激活函数。

选择当前先进的检测器YOLOR作为基线。在相同设置下,表1显示了本文提出的YOLOv7模型和其他模型的对比。从结果中可以看出:

  • 与YOLOv4相比,YOLOv7的参数减少了75%,计算量减少了36%,AP提高了1.5%。
  • 与最先进的YOLOR-CSP相比,YOLOv7的参数少了43% ,计算量少了15%,AP高了0.4%。
  • 在小模型的性能中,与YOLOv4-tiny相比,YOLOv7-Tiny减少了39%的参数量和49%的计算量,但保持相同的AP。
  • 在云GPU模型上,YOLOv7模型仍然具有更高的AP,同时减少了19%的参数量和33%的计算量。

5.3 与sota算法的比较

本文将所提出的方法与通用GPU上或边缘GPU上最先进的的目标检测器进行了比较

  • 比较YOLOv7-Tiny-SiLU和YOLOv5-N(v6.1),YOLOv7-Tiny-SiLU在速度上快127帧,准确率提高10.7%。
  • YOLOv7在帧率为161帧时有51.4%的AP,而相同AP的PP-YOLOE-L只有78帧,且参数l少41%。
  • YOLOv7-X在114FPS时,比YOLOv5-L(v6.1)99FPS的推理速度更快,同时可以提高3.9%的AP。
  • YOLOv7-X与YOLOv5-X(v6.1)相比,YOLOv7-X的推理速度要快31fps。此外,在参数量和计算量方面,YOLOv7-X比YOLOv5-X(v6.1)减少了22%的参数和8%的计算量,但AP提高了2.2%。
  • 使用输入分辨率1280,YOLOv7与YOLOR进行比较,YOLOv7-W6的推理速度比YOLOR-P6快8FPS,检测率也提高了1%的AP。
  • 至于YOLOv7-E6和YOLOv5-X6(v6.1)比较时,前者的AP增益比后者高0.9%,但参数减少45%,计算量减少63%,推理速度提高了47%。
  • YOLOv7-D6的推理速度与YOLOR-E6接近,但AP提高了0.8%。
  • YOLOv7-E6E的推理速度与YOLOR-D6接近,但AP提高了0.3%。

六、结论

本文提出了一种新的实时检测器。在研究过程中,本文发现了重参化模块的替换问题和动态标签的分配问题。为了解决这一问题,提出了一种可训练的bag-of-freebies策略来提高目标检测的精度。基于此,本文开发的YOLOv7系列目标检测模型获得了最先进的结果。

训练自己数据:

数据集准备:准备coco类型数据 ,新建MyDataCoco.yaml

# COCO 2017 dataset http://cocodataset.org

# download command/URL (optional)
# download: bash ./scripts/get_coco.sh

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train:yolov7/data/train.txt  # 118287 images
val:yolov7/data/val.txt  # 5000 images
test:yolov7/data/test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# number of classes
nc: 10

# class names
names: ['lighthouse',
'sailboat',
'buoy',
'railbar',
'cargoship',
'navalvessels',
'passengership',
'dock',
'submarine',
'fishingboat' ]

 results:

目标检测: Anchor-based 与 Anchor-free

目标检测技术包括anchor-based和anchor-free两大类:

1、基于anchor-based的技术包括一个阶段和两个阶段的检测。其中一阶段的检测技术包括SSD,DSSD,RetinaNet,RefineDet,YOLOV3等,二阶段技术包括Faster-RCNN,R-FCN,FPN,Cascade R-CNN,SNIP等。一般的,两个阶段的目标检测会比一个阶段的精度要高,但一个阶段的算法速度会更快。

二步法相对于一步法有以下几个优势:

(a).二阶段的分类

(b).二阶段的回归

(c).二阶段的特征

(d).特征校准

为了能让一步法也具备二步法的这些个优势,提出了RefineDet、SRN、AlignDet等一些列检测算法。

2、 anchor-free的技术包括基于Keypoint与Segmentation两类。其中基于Keypoint技术包括CornerNet,CenterNet,CornerNet-Lite等,基于Segmentation的技术包括FSAF,FCOS,FoveaBox等。

anchor-base存在的问题:

•与锚点框相关超参 (scale、aspect ratio、IoU Threshold) 会较明显的影响最终预测效果;(尺度(scale)和长宽比( aspect ratio)是比较难设计的。这需要较强的先验知识。)

•预置的锚点大小、比例在检测差异较大物体时不够灵活;

•大量的锚点会导致运算复杂度增大,产生的参数较多;

•容易导致训练时negative与positive的比例失衡。(冗余框非常之多:一张图像内的目标毕竟是有限的,基于每个anchor设定大量anchor box会产生大量的easy-sample,即完全不包含目标的背景框。这会造成正负样本严重不平衡问题,也是one-stage算法难以赶超two-stage算法的原因之一。)

此外基于anchor box进行目标类别分类时,IOU阈值超参设置也是一个问题,0.5?0.7?有同学可能也想到了CVPR2018的论文Cascade R-CNN,专门来讨论这个问题。

anchor-base 优点:

(1)使用anchor机制产生密集的anchor box,使得网络可直接在此基础上进行目标分类及边界框坐标回归;

(2)密集的anchor box可有效提高网络目标召回能力,对于小目标检测来说提升非常明显。

Anchor-free算法的优点:

•使用类似分割的思想来解决目标检测问题;

•不需要调优与anchor相关的超参数;

•避免大量计算GT boxes和anchor boxes 之间的IoU,使得训练过程占用内存更低。

anchor-free是通过另外一种手段来解决检测问题的。同样分为两个子问题,即确定物体中心和对四条边框的预测。预测物体中心时,将中心预测融入到类别预测的 target 里面,也可以预测一个 soft 的 centerness score。对于四条边框的预测,则比较一致,都是预测该像素点到 ground truth 框的四条边距离,不过会使用一些 trick 来限制 regress 的范围。

anchor-free类算法归纳:

A.基于多关键点联合表达的方法

a.CornerNet/CornerNet-lite:左上角点+右下角点

b.ExtremeNet:上下左右4个极值点+中心点

c.CenterNet:Keypoint Triplets for Object Detection:左上角点+右下角点+中心点

d.RepPoints:9个学习到的自适应跳动的采样点

e.FoveaBox:中心点+左上角点+右下角点

f.PLN:4个角点+中心点

B.基于单中心点预测的方法

a.CenterNet:Objects as Points:中心点+宽度+高度

b.CSP:中心点+高度(作者预设了目标宽高比固定,根据高度计算出宽度)

c.FCOS:中心点+到框的2个距离

yolov6 又快又准的目标检测框架

多年来,YOLO 系列一直是高效目标检测的行业标准。YOLO 社区蓬勃发展,丰富了其在众多硬件平台和丰富场景中的使用。在这份技术报告力求将其极限推向新的高度,以坚定不移的行业应用心态向前迈进。

考虑到真实环境中对速度和准确性的不同要求,作者广泛研究了来自工业界或学术界的最新目标检测进展。具体来说,从最近的网络设计、训练策略、测试技术、量化和优化方法中大量吸收了一些想法。最重要的是,整合思想和实践,构建了一套不同规模的部署网络,以适应多样化的用例。

在 YOLO 作者的慷慨许可下,作者将其命名为 YOLOv6。作者也热烈欢迎用户和贡献者进一步增强。YOLOv6-N 在 NVIDIA Tesla T4 GPU 上以 1234 FPS 的吞吐量在 COCO 数据集上达到 35.9% 的 AP。YOLOv6-S 以 495 FPS 的速度达到 43.5% 的 AP,优于同规模的其他主流检测器(YOLOv5-SYOLOX-S 和 PPYOLOE-S)。

YOLOv6-S 量化版本甚至带来了 869 FPS 的最新 43.3% AP。此外,与具有相似推理速度的其他检测器相比,YOLOv6-M/L 还实现了更好的准确度性能(即 49.5%/52.3%)。

近日,美团视觉智能部研发了一款致力于工业应用的目标检测框架 YOLOv6,能够同时专注于检测的精度和推理效率。在研发过程中,视觉智能部不断进行了探索和优化,同时吸取借鉴了学术界和工业界的一些前沿进展和科研成果。在目标检测权威数据集 COCO 上的实验结果显示,YOLOv6 在检测精度和速度方面均超越其他同体量的算法,同时支持多种不同平台的部署,极大简化工程部署时的适配工作。特此开源,希望能帮助到更多的同学。

YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。本框架同时专注于检测的精度和推理效率,在工业界常用的尺寸模型中:YOLOv6-nano 在 COCO 上精度可达 35.0% AP,在 T4 上推理速度可达 1242 FPS;YOLOv6-s 在 COCO 上精度可达 43.1% AP,在 T4 上推理速度可达 520 FPS。在部署方面,YOLOv6 支持 GPU(TensorRT)、CPU(OPENVINO)、ARM(MNN、TNN、NCNN)等不同平台的部署,极大地简化工程部署时的适配工作。

目前,项目已开源至Github,传送门:YOLOv6。欢迎有需要的小伙伴们Star收藏,随时取用。

精度与速度远超 YOLOv5 和 YOLOX 的新框架

目标检测作为计算机视觉领域的一项基础性技术,在工业界得到了广泛的应用,其中 YOLO 系列算法因其较好的综合性能,逐渐成为大多数工业应用时的首选框架。至今,业界已衍生出许多 YOLO 检测框架,其中以 YOLOv5[1]、YOLOX[2] 和 PP-YOLOE[3] 最具代表性,但在实际使用中,我们发现上述框架在速度和精度方面仍有很大的提升的空间。基于此,我们通过研究并借鉴了业界已有的先进技术,开发了一套新的目标检测框架——YOLOv6。该框架支持模型训练、推理及多平台部署等全链条的工业应用需求,并在网络结构、训练策略等算法层面进行了多项改进和优化,在 COCO 数据集上,YOLOv6 在精度和速度方面均超越其他同体量算法,相关结果如下图 1 所示:

图1-1 YOLOv6 各尺寸模型与其他模型性能对比
图1-1 YOLOv6 各尺寸模型与其他模型性能对比
图1-2 YOLOv6 与其他模型在不同分辨率下性能对比
图1-2 YOLOv6 与其他模型在不同分辨率下性能对比

图 1-1 展示了不同尺寸网络下各检测算法的性能对比,曲线上的点分别表示该检测算法在不同尺寸网络下(s/tiny/nano)的模型性能,从图中可以看到,YOLOv6 在精度和速度方面均超越其他 YOLO 系列同体量算法。

图 1-2 展示了输入分辨率变化时各检测网络模型的性能对比,曲线上的点从左往右分别表示图像分辨率依次增大时(384/448/512/576/640)该模型的性能,从图中可以看到,YOLOv6 在不同分辨率下,仍然保持较大的性能优势。

2. YOLOv6关键技术介绍

YOLOv6 主要在 BackBone、Neck、Head 以及训练策略等方面进行了诸多的改进:

  • 设计了更高效的 Backbone 和 Neck :受到硬件感知神经网络设计思想的启发,基于 RepVGG style[4] 设计了可重参数化、更高效的骨干网络 EfficientRep Backbone 和 Rep-PAN Neck。
  • 优化设计了更简洁有效的 Efficient Decoupled Head,在维持精度的同时,进一步降低了一般解耦头带来的额外延时开销。
  • 在训练策略上,我们采用Anchor-free 无锚范式,同时辅以 SimOTA[2] 标签分配策略以及 SIoU[9] 边界框回归损失来进一步提高检测精度。

将 YOLOv6 的主要方面总结如下:

  • 针对不同场景中的工业应用重新设计了一系列不同规模的网络。不同规模的架构各不相同,以实现最佳的速度和准确性权衡,其中小型模型具有简单的单路径主干,大型模型建立在高效的多分支块上。
  • 为 YOLOv6 注入了一种self-distillation策略,在分类任务和回归任务上都执行。同时,动态调整来自教师和标签的知识,以帮助学生模型在所有训练阶段更有效地学习知识。
  • 广泛验证标签分配、损失函数和数据增强技术的先进检测技术,并有选择地采用它们以进一步提高性能。
  • 在 RepOptimizer 和通道蒸馏的帮助下改进了检测的量化方案,这带来了具有 43.3% 的 COCO AP 和 869 FPS 的吞吐量的快速准确的检测器,批量大小为 32。

2.1 Hardware-friendly 的骨干网络设计

YOLOv5/YOLOX 使用的 Backbone 和 Neck 都基于 CSPNet[5] 搭建,采用了多分支的方式和残差结构。对于 GPU 等硬件来说,这种结构会一定程度上增加延时,同时减小内存带宽利用率。下图 2 为计算机体系结构领域中的 Roofline Model[8] 介绍图,显示了硬件中计算能力和内存带宽之间的关联关系。

图2 Roofline Model 介绍图
图2 Roofline Model 介绍图

于是,我们基于硬件感知神经网络设计的思想,对 Backbone 和 Neck 进行了重新设计和优化。该思想基于硬件的特性、推理框架/编译框架的特点,以硬件和编译友好的结构作为设计原则,在网络构建时,综合考虑硬件计算能力、内存带宽、编译优化特性、网络表征能力等,进而获得又快又好的网络结构。对上述重新设计的两个检测部件,我们在 YOLOv6 中分别称为 EfficientRep Backbone Rep-PAN Neck,其主要贡献点在于:

  1. 引入了 RepVGG[4] style 结构。
  2. 基于硬件感知思想重新设计了 Backbone 和 Neck。

RepVGG[4] Style 结构是一种在训练时具有多分支拓扑,而在实际部署时可以等效融合为单个 3×3 卷积的一种可重参数化的结构(融合过程如下图 3 所示)。通过融合成的 3×3 卷积结构,可以有效利用计算密集型硬件计算能力(比如 GPU),同时也可获得 GPU/CPU 上已经高度优化的 NVIDIA cuDNN 和 Intel MKL 编译框架的帮助。

实验表明,通过上述策略,YOLOv6 减少了在硬件上的延时,并显着提升了算法的精度,让检测网络更快更强。以 nano 尺寸模型为例,对比 YOLOv5-nano 采用的网络结构,本方法在速度上提升了21%,同时精度提升 3.6% AP。

图3 Rep算子的融合过程[4]
图3 Rep算子的融合过程[4]

EfficientRep Backbone:在 Backbone 设计方面,我们基于以上 Rep 算子设计了一个高效的Backbone。相比于 YOLOv5 采用的 CSP-Backbone,该 Backbone 能够高效利用硬件(如 GPU)算力的同时,还具有较强的表征能力。

下图 4 为 EfficientRep Backbone 具体设计结构图,将 Backbone 中 stride=2 的普通 Conv 层替换成了 stride=2 的 RepConv层。同时,将原始的 CSP-Block 都重新设计为 RepBlock,其中 RepBlock 的第一个 RepConv 会做 channel 维度的变换和对齐。另外,我们还将原始的 SPPF 优化设计为更加高效的 SimSPPF。

图4 EfficientRep Backbone 结构图
图4 EfficientRep Backbone 结构图

Rep-PAN:在 Neck 设计方面,为了让其在硬件上推理更加高效,以达到更好的精度与速度的平衡,我们基于硬件感知神经网络设计思想,为 YOLOv6 设计了一个更有效的特征融合网络结构。

Rep-PAN 基于 PAN[6] 拓扑方式,用 RepBlock 替换了 YOLOv5 中使用的 CSP-Block,同时对整体 Neck 中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力(Rep-PAN 结构图如下图 5 所示)。

图5 Rep-PAN 结构图
图5 Rep-PAN 结构图

2.2 更简洁高效的 Decoupled Head

在 YOLOv6 中,我们采用了解耦检测头(Decoupled Head)结构,并对其进行了精简设计。原始 YOLOv5 的检测头是通过分类和回归分支融合共享的方式来实现的,而 YOLOX 的检测头则是将分类和回归分支进行解耦,同时新增了两个额外的 3×3 的卷积层,虽然提升了检测精度,但一定程度上增加了网络延时。

因此,我们对解耦头进行了精简设计,同时综合考虑到相关算子表征能力和硬件上计算开销这两者的平衡,采用 Hybrid Channels 策略重新设计了一个更高效的解耦头结构,在维持精度的同时降低了延时,缓解了解耦头中 3×3 卷积带来的额外延时开销。通过在 nano 尺寸模型上进行消融实验,对比相同通道数的解耦头结构,精度提升 0.2% AP 的同时,速度提升6.8%。

图6 Efficient Decoupled Head 结构图
图6 Efficient Decoupled Head 结构图

2.3 更有效的训练策略

为了进一步提升检测精度,我们吸收借鉴了学术界和业界其他检测框架的先进研究进展:Anchor-free 无锚范式 、SimOTA 标签分配策略以及 SIoU 边界框回归损失。

Anchor-free 无锚范式

YOLOv6 采用了更简洁的 Anchor-free 检测方法。由于 Anchor-based检测器需要在训练之前进行聚类分析以确定最佳 Anchor 集合,这会一定程度提高检测器的复杂度;同时,在一些边缘端的应用中,需要在硬件之间搬运大量检测结果的步骤,也会带来额外的延时。而 Anchor-free 无锚范式因其泛化能力强,解码逻辑更简单,在近几年中应用比较广泛。经过对 Anchor-free 的实验调研,我们发现,相较于Anchor-based 检测器的复杂度而带来的额外延时,Anchor-free 检测器在速度上有51%的提升。

SimOTA 标签分配策略

为了获得更多高质量的正样本,YOLOv6 引入了 SimOTA [4]算法动态分配正样本,进一步提高检测精度。YOLOv5 的标签分配策略是基于 Shape 匹配,并通过跨网格匹配策略增加正样本数量,从而使得网络快速收敛,但是该方法属于静态分配方法,并不会随着网络训练的过程而调整。

近年来,也出现不少基于动态标签分配的方法,此类方法会根据训练过程中的网络输出来分配正样本,从而可以产生更多高质量的正样本,继而又促进网络的正向优化。例如,OTA[7] 通过将样本匹配建模成最佳传输问题,求得全局信息下的最佳样本匹配策略以提升精度,但 OTA 由于使用了Sinkhorn-Knopp 算法导致训练时间加长,而 SimOTA[4]算法使用 Top-K 近似策略来得到样本最佳匹配,大大加快了训练速度。故 YOLOv6 采用了SimOTA 动态分配策略,并结合无锚范式,在 nano 尺寸模型上平均检测精度提升 1.3% AP。

SIoU 边界框回归损失

为了进一步提升回归精度,YOLOv6 采用了 SIoU[9] 边界框回归损失函数来监督网络的学习。目标检测网络的训练一般需要至少定义两个损失函数:分类损失和边界框回归损失,而损失函数的定义往往对检测精度以及训练速度产生较大的影响。

近年来,常用的边界框回归损失包括IoU、GIoU、CIoU、DIoU loss等等,这些损失函数通过考虑预测框与目标框之前的重叠程度、中心点距离、纵横比等因素来衡量两者之间的差距,从而指导网络最小化损失以提升回归精度,但是这些方法都没有考虑到预测框与目标框之间方向的匹配性。SIoU 损失函数通过引入了所需回归之间的向量角度,重新定义了距离损失,有效降低了回归的自由度,加快网络收敛,进一步提升了回归精度。通过在 YOLOv6s 上采用 SIoU loss 进行实验,对比 CIoU loss,平均检测精度提升 0.3% AP。

3. 实验结果

经过以上优化策略和改进,YOLOv6 在多个不同尺寸下的模型均取得了卓越的表现。下表 1 展示了 YOLOv6-nano 的消融实验结果,从实验结果可以看出,我们自主设计的检测网络在精度和速度上都带来了很大的增益。

表1 YOLOv6-nano 消融实验结果
表1 YOLOv6-nano 消融实验结果

下表 2 展示了 YOLOv6 与当前主流的其他 YOLO 系列算法相比较的实验结果。从表格中可以看到:

表2 YOLOv6各尺寸模型性能与其他模型的比较
表2 YOLOv6各尺寸模型性能与其他模型的比较
  • YOLOv6-nano 在 COCO val 上 取得了 35.0% AP 的精度,同时在 T4 上使用 TRT FP16 batchsize=32 进行推理,可达到 1242FPS 的性能,相较于 YOLOv5-nano 精度提升 7% AP,速度提升 85%。
  • YOLOv6-tiny 在 COCO val 上 取得了 41.3% AP 的精度, 同时在 T4 上使用 TRT FP16 batchsize=32 进行推理,可达到 602FPS 的性能,相较于 YOLOv5-s 精度提升 3.9% AP,速度提升 29.4%。
  • YOLOv6-s 在 COCO val 上 取得了 43.1% AP 的精度, 同时在 T4 上使用 TRT FP16 batchsize=32 进行推理,可达到 520FPS 的性能,相较于 YOLOX-s 精度提升 2.6% AP,速度提升 38.6%;相较于 PP-YOLOE-s 精度提升 0.4% AP的条件下,在T4上使用 TRT FP16 进行单 batch 推理,速度提升 71.3%。

在海面图片(自己的训练集)上的训练:

is_coco: False
# Classes
nc: 10  # number of classes
names: ['lighthouse',
'sailboat',
'buoy',
'railbar',
'cargoship',
'navalvessels',
'passengership',
'dock',
'submarine',
'fishingboat']  # class names

yolov6s 结果: coco_detection_metrics ——COCO检测指标

Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.779
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.992
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.922
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.661
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.710
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.817
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.697
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.801
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.813
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.686
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.740
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.847

Average Precision (AP)和Average Recall (AR)等等这些都是啥意思?

  • IoU=0.50意味着IoU大于0.5被认为是检测到。
  • IoU=0.50:0.95意味着IoU在0.5到0.95的范围内被认为是检测到。
  • 越低的IoU阈值,则判为正确检测的越多,相应的,Average Precision (AP)也就越高。参考上面的第二第三行。
  • small表示标注的框面积小于32 * 32
  • medium表示标注的框面积同时小于96 * 96
  • large表示标注的框面积大于等于96 * 96
  • all表示不论大小,我都要。
  • maxDets=100表示最大检测目标数为100。

 Average Precision (AP)和Average Recall (AR)值里面有-1是什么情况?

参考:https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py#L52

标注里面没有此类型的目标框,则Average PrecisionAverage Recall值为-1。

Recall   召回率(查全率)。表示正确识别物体A的个数占测试集中物体A的总个数的百分数,即所有正例中预测正确的概率,Recall = tpr = TP / (TP+FN)

Precision 精确率(查准率)。表示正确识别物体A的个数占总识别出的物体个数n的百分数,即预测为正例中预测正确的概率,Precision = TP / (TP+FP)

以下12个指标用于表征COCO上物体检测器的性能:

Average Precision (AP):

AP                              % AP at IoU=0.50:0.05:0.95 (primary challenge metric)

APIoU=.50                   % AP at IoU=0.50 (PASCAL VOC metric)

APIoU=.75                   % AP at IoU=0.75 (strict metric)

AP Across Scales:

APsmall                       % AP for small objects: area < 322

APmedium                   % AP for medium objects: 322 < area < 962

APlarge                        % AP for large objects: area > 962

Average Recall (AR):

ARmax=1                     % AR given 1 detection per image

ARmax=10                   % AR given 10 detections per image

ARmax=100                 % AR given 100 detections per image

AR Across Scales:

ARsmall                       % AR for small objects: area < 322

ARmedium                   % AR for medium objects: 322 < area < 962

ARlarge                        % AR for large objects: area > 962

1)除非另有说明,否则AP和AR在多个交汇点(IoU)值上取平均值。具体来说,我们使用10个IoU阈值0.50:0.05:0.95。这是对传统的一个突破,其中AP是在一个单一的0.50的IoU上计算的(这对应于我们的度量APIoU=.50 )。超过均值的IoUs能让探测器更好定位(Averaging over IoUs rewards detectors with better localization.)。

2)AP是所有类别的平均值。传统上,这被称为“平均精确度”(mAP,mean average precision)。我们没有区分AP和mAP(同样是AR和mAR),并假定从上下文中可以清楚地看出差异。

3)AP(所有10个IoU阈值和所有80个类别的平均值)将决定赢家。在考虑COCO性能时,这应该被认为是最重要的一个指标

4)在COCO中,比大物体相比有更多的小物体。具体地说,大约41%的物体很小(面积<322),34%是中等(322 < area < 962)),24%大(area > 962)。测量的面积(area)是分割掩码(segmentation mask)中的像素数量。

5)AR是在每个图像中检测到固定数量的最大召回(recall),在类别和IoU上平均。AR与提案评估(proposal evaluation)中使用的同名度量相关,但是按类别计算。

6)所有度量标准允许每个图像(在所有类别中)最多100个最高得分检测进行计算。

7)除了IoU计算(分别在框(box)或掩码(mask)上执行)之外,用边界框和分割掩码检测的评估度量在所有方面是相同的。

测试速度:

img show:

A ConvNet for the 2020s

论文地址:https://arxiv.org/abs/2201.03545

github: https://github.com/facebookresearch/ConvNeXt

class Block(nn.Module):
    r""" ConvNeXt Block. There are two equivalent implementations:
    (1) DwConv -> LayerNorm (channels_first) -> 1x1 Conv -> GELU -> 1x1 Conv; all in (N, C, H, W)
    (2) DwConv -> Permute to (N, H, W, C); LayerNorm (channels_last) -> Linear -> GELU -> Linear; Permute back
    We use (2) as we find it slightly faster in PyTorch
    
    Args:
        dim (int): Number of input channels.
        drop_path (float): Stochastic depth rate. Default: 0.0
        layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6.
    """
    def __init__(self, dim, drop_path=0., layer_scale_init_value=1e-6):
        super().__init__()
        self.dwconv = nn.Conv2d(dim, dim, kernel_size=7, padding=3, groups=dim) # depthwise conv
        self.norm = LayerNorm(dim, eps=1e-6)
        self.pwconv1 = nn.Linear(dim, 4 * dim) # pointwise/1x1 convs, implemented with linear layers
        self.act = nn.GELU()
        self.pwconv2 = nn.Linear(4 * dim, dim)
        self.gamma = nn.Parameter(layer_scale_init_value * torch.ones((dim)), 
                                    requires_grad=True) if layer_scale_init_value > 0 else None
        self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()

    def forward(self, x):
        input = x
        x = self.dwconv(x)
        x = x.permute(0, 2, 3, 1) # (N, C, H, W) -> (N, H, W, C)
        x = self.norm(x)
        x = self.pwconv1(x)
        x = self.act(x)
        x = self.pwconv2(x)
        if self.gamma is not None:
            x = self.gamma * x
        x = x.permute(0, 3, 1, 2) # (N, H, W, C) -> (N, C, H, W)

        x = input + self.drop_path(x)
        return x

2020年以来,ViT一直是研究热点。ViT在图片分类上的性能超过卷积网络的性能,后续发展而来的各种变体将ViT发扬光大(如Swin-T,CSwin-T等),值得一提的是Swin-T中的滑窗操作类似于卷积操作,降低了运算复杂度,使得ViT可以被用做其他视觉任务的骨干网络,ViT变得更火了。本文探究卷积网络到底输在了哪里,卷积网络的极限在哪里。在本文中,作者逐渐向ResNet中增加结构(或使用trick)来提升卷积模型性能,最终将ImageNet top-1刷到了87.8%。作者认为本文所提出的网络结构是新一代(2020年代)的卷积网络(ConvNeXt),因此将文章命名为“2020年代的卷积网络”。

方法

训练方法

作者首先将ViT的训练技巧,包括lr scheduler、数据增强方法、优化器超参等应用于ResNet-50,并将训练轮数由90扩大到300,结果分类准确率由76.1%上升到78.8%。具体训练config如下:

宏观设计

作者借鉴了Swin-T的两个设计:

  1. 每阶段的计算量
  2. 对输入图片下采样方法

对于第一点类似Swin-T四个阶段1:1:9:1的计算量,作者将ResNet-50每个阶段block数调整为3,3,9,3(原来为3,4,6,3),增加第三阶段计算量,准确率由78.8%提升至79.4%。

对于第二点Swin-T融合压缩2 [公式] 2的区域,作者则使用4  4步长为4的卷积对输入图片进行下采样,这样每次卷积操作的感受野不重叠,准确率由79.4%提升至79.5%。

类ResNeXt设计

depthwise conv中的逐channel卷积操作和self-attention中的加权求和很类似,因此作者采用depthwise conv替换普通卷积。参照ResNeXt,作者将通道数增加到96,准确率提升至80.5%,FLOPs相应增大到了5.3G。相比之下原始的ResNet-50 FLOPs为4G,运算量增大很多。

Inverted Bottleneck

在depthwise conv的基础上借鉴MobileNet的inverted bottleneck设计,将block由下图(a)变为(b)。因为depthwise不会使channel之间的信息交互,因此一般depthwise conv之后都会接1 [公式] 1 [公式] C的pointwise conv。这一顿操作下来准确率只涨了0.1%到80.6%。在后文说明的大模型上涨点多一点。

增大卷积kernel

作者认为更大的感受野是ViT性能更好的可能原因之一,作者尝试增大卷积的kernel,使模型获得更大的感受野。首先在pointwise conv的使用上,作者为了获得更大的感受野,将depthwise conv提前到1  1 conv之前,之后用384个1  1  96的conv将模型宽度提升4倍,在用96个1  1  96的conv恢复模型宽度。反映在上图中就是由(b)变为(c)。由于3[公式]3的conv数量减少,模型FLOPs由5.3G减少到4G,相应地性能暂时下降到79.9%。

然后作者尝试增大depthwise conv的卷积核大小,证明77大小的卷积核效果达到最佳

其他乱七八糟的尝试

借鉴最初的Transformer设计,作者将ReLU替换为GELU;ViT的K/Q/V计算中都没有用到激活函数和归一化层,于是作者也删除了大量的激活函数和归一化层,仅在1  1卷积之间使用激活函数,仅在7  7卷积和1  1 卷积之间使用归一化层,同时将BN升级为LN。最终block结构确定如下:

最后仿照Swin-T,作者将下采样层单独分离出来,单独使用2 [公式] 2卷积层进行下采样。为保证收敛,在下采样后加上Layer Norm归一化。最终加强版ResNet-50准确率82.0%(FLOPs 4.5G)。

总的来说ResNet-50、本文模型和Swin-T结构差别如下:

MAE(Masked Autoencoders Are Scalable Vision Learners)

GitHub: https://github.com/facebookresearch/mae

PAPER: https://arxiv.org/abs/2111.06377

Abstract

恺明提出一种用于计算机视觉的可扩展自监督学习方案Masked AutoEncoders(MAE)。所提MAE极为简单:对输入图像的随机块进行mask并对遗失像素进行重建。它基于以下两个核心设计:

  • 我们设计了一种非对称编解码架构,其中解码器仅作用于可见块(无需mask信息),而解码器则通过隐表达与mask信息进行原始图像重建;
  • 我们发现对输入图像进行高比例mask(比如75%)可以产生一项重要且有意义的自监督任务。

上述两种设计促使我们可以更高效的训练大模型:我们加速训练达3x甚至更多,同时提升模型精度。所提方案使得所得高精度模型具有很好的泛化性能:仅需ImageNet-1K,ViT-Huge取得了87.8%的top1精度 。下游任务的迁移取得了优于监督训练的性能,证实了所提方案的可扩展能力。

极致精简版

用下面几句话来简单说明下这篇文章:

  • 恺明出品,必属精品!MAE延续了其一贯的研究风格:简单且实用;
  • MAE兴起于去噪自编码,但兴盛于NLP的BERT。那么是什么导致了MAE在CV与NLP中表现的差异呢?这是本文的出发点
  • 角度一:CV与NLP的架构不同。CV中常采用卷积这种具有”规则性“的操作,直到近期ViT才打破了架构差异;
  • 角度二:信息密度不同。语言是人发明的,具有高语义与信息稠密性;而图像则是自然信号具有重度空间冗余:遗失块可以通过近邻块重建且无需任何全局性理解。为克服这种差异,我们采用了一种简单的策略:高比例随机块掩码,大幅降低冗余。
  • 角度三:自编码器的解码器在重建方面的作用不同。在视觉任务方面,解码器进行像素重建,具有更低语义信息;而在NLP中,解码器预测遗失的词,包含丰富的语义信息。
  • 基于上述三点分析,作者提出了一种非常简单的用于视觉表达学习的掩码自编码器MAE。
  • MAE采用了非对称的编解码器架构,编码器仅作用于可见图像块(即输入图像块中一定比例进行丢弃,丢弃比例高达75%)并生成隐式表达,解码器则以掩码token以及隐式表达作为输入并对遗失块进行重建。
  • 搭配MAE的ViT-H取得了ImageNet-1K数据集上的新记录:87.8%;同时,经由MAE预训练的模型具有非常好的泛化性能。

Method

所提MAE是一种非常简单的自编码器方案:基于给定部分观测信息对原始信号进行重建 。类似于其他自编码器,所提MAE包含一个将观测信号映射为隐式表达的编码器,一个用于将隐式表达重建为原始信号的解码器。与经典自编码器不同之处在于:我们采用了非对称设计,这使得编码器仅依赖于部分观测信息(无需掩码token信息),而轻量解码器则接与所得隐式表达与掩码token进行原始信号重建(可参见下图)。

Masking 参考ViT,我们将输入图像拆分为非重叠块,然后采样一部分块并移除其余块(即Mask)。我们的采样策略非常简单:服从均匀分布的无重复随机采样 。我们将该采样策略称之为“随机采样”。具有高掩码比例的随机采样可以极大程度消除冗余,进而构建一个不会轻易的被近邻块推理解决的任务 (可参考下面图示)。而均匀分布则避免了潜在的中心偏置问题。

MAE Encoder MAE中的编码器是一种ViT,但仅作用于可见的未被Mask的块。类似于标准ViT,该编码器通过线性投影于位置嵌入对块进行编码,然后通过一系列Transformer模块进行处理。然而,由于该编解码仅在较小子集块(比如25%)进行处理,且未用到掩码Token信息。这就使得我们可以训练一个非常大的编码器 。

MAE Decoder MAE解码器的输入包含:(1) 编码器的输出;(2) 掩码token。正如Figure1所示,每个掩码Token共享的可学习向量,它用于指示待预测遗失块。此时,我们对所有token添加位置嵌入信息。解码器同样包含一系列Transformer模块。

注:MAE解码器仅在预训练阶段用于图像重建,编码器则用来生成用于识别的图像表达 。因此,解码器的设计可以独立于编码设计,具有高度的灵活性。在实验过程中,我们采用了窄而浅的极小解码器,比如默认解码器中每个token的计算量小于编码器的10% 。通过这种非对称设计,token的全集仅被轻量解码器处理,大幅减少了预训练时间。

Reconstruction target 该MAE通过预测每个掩码块的像素值进行原始信息重建 。解码器的最后一层为线性投影,其输出通道数等于每个块的像素数量。编码器的输出将通过reshape构建重建图像。损失函数则采用了MSE,注:类似于BERT仅在掩码块计算损失。

我们同时还研究了一个变种:其重建目标为每个掩码块的规范化像素值 。具体来说,我们计算每个块的均值与标准差并用于对该块进行归一化,最后采用归一化的像素作为重建目标提升表达能力。

Simple implementation MAE预训练极为高效,更重要的是:它不需要任何特定的稀疏操作。实现过程可描述如下:

  • 首先,我们通过线性投影与位置嵌入对每个输入块生成token;
  • 然后,我们随机置换(random shuffle)token序列并根据掩码比例移除最后一部分token;
  • 其次,完成编码后,我们在编码块中插入掩码token并反置换(unshuffle)得到全序列token以便于与target进行对齐;
  • 最后,我们将解码器作用于上述全序列token。

正如上所述:MAE无需稀疏操作。此外,shuffle与unshuffle操作非常快,引入的计算量可以忽略。

Efficient Self-supervised Vision Pretraining with Local Masked Reconstruction

论文地址:https://arxiv.org/abs/2206.00790

https://github.com/junchen14/LoMaR

Efficient Self-supervised Vision Pretraining with Local Masked Reconstruction,比MAE快3.1倍,比BEiT快5.3倍!KAUST&南洋理工提出基于局部mask重建的高效自监督视觉预训练方法LoMaR,同时提高训练精度和效率!

计算机视觉的自监督学习取得了巨大的进步,改进了许多下游视觉任务,如图像分类、语义分割和目标检测。其中,MAE和BEiT等生成性自监督视觉学习方法表现出了良好的性能。然而,它们的全局掩蔽重建机制对计算的要求很高。
为了解决这个问题,作者提出了局部掩蔽重建(local masked reconstruction,LoMaR),这是一种简单而有效的方法,在一个简单的Transformer编码器上,在7×7块的小窗口内执行掩蔽重建,与整个图像的全局掩蔽重建相比,提高了效率和精度之间的权衡。
大量实验表明,LoMaR在ImageNet-1K分类中达到84.1%的top-1精度,优于MAE 0.5%。在384×384图像上对预训练后的LoMaR进行微调后,可以达到85.4%的top-1精度,超过MAE 0.6%。在MS COCO上,LoMaR在目标检测上比MAE好0.5,在实例分割上比MAE好0.5。LoMaR在预训练高分辨率图像上的计算效率尤其高,例如,在预训练448×448图像上,LoMaR比MAE快3.1倍,分类精度高0.2%。这种局部掩蔽重建学习机制可以很容易地集成到任何其他生成性自监督学习方法中。

本文提出了一种新的模型,称为局部掩蔽重建或LoMaR。该模型将注意力区域限制在一个小窗口内,如7×7的图像块,这足以进行重建。对于那些需要在长序列上操作的任务,在许多NLP领域中也可以看到类似的方法。在视觉领域也探索了小窗口,以提高训练和推理速度。但与之前的视觉Transformer(如Swin Transformer)不同,Swin Transformer为每个图像创建具有固定坐标的移动窗口。本文取而代之的是对几个随机位置的窗口进行采样,这样可以更好地捕获不同空间区域中的对象。

在下图中,作者比较了LoMaR和MAE,并注意到两个主要区别:a)本文对一个区域进行了k×k个patch采样,以进行掩蔽重建,而不是从全部patch中进行重建。作者发现,只需一些局部视觉线索,就足以恢复丢失的信息,而不是从图像中全局25%的可见patch重建遮罩patch。b) 本文将MAE中的重量级解码器替换为轻量级MLP头。将所有图像patch直接输入编码器,包括masked和visible patches。相比之下,在MAE中,只有可见的patch被馈送到编码器。实验表明,这些结构变化为小窗口的局部掩蔽重建带来了更大的性能增益。
经过广泛的实验,作者发现

  1. LoMaR在ImageNet-1K数据集上可以实现84.1 top-1 acc,比MAE高出0.5 acc。此外,LoMaR的性能可以进一步提高到84.3 acc,在ViT B/8主干上只需预训练400个阶段,与ViT B/16相比,这不会带来额外的预训练成本。在分辨率为384×384的图像上对预训练模型进行微调后,LoMaR可以达到85.4 acc,比MAE高出0.6 acc。
  2. LoMaR在高分辨率图像预训练中比其他baseline更有效,因为它的计算量对不同的图像分辨率是不变的。然而,其他方法的计算成本是图像分辨率增加的二次方,这导致了昂贵的预训练。比如,对于448×448图像的预训练,LoMaR比MAE快3.1倍,实现了更高的分类性能。
  3. LoMaR是一种高效的学习方法,可以很容易地集成到任何其他生成性自监督学习方法中。将本文的局部掩蔽重建学习机制安装到BEiT中可以将其ImageNet-1K分类性能从83.2提高到83.4,只消耗最初预训练时间的35.8%。LoMaR在其他任务(如目标检测)上也具有很强的泛化能力。在ViTDet的目标检测框架下,它比MAE的性能高出0.5 。

LoMaR依赖于一堆Transformer块,通过从与MAE类似的损坏图像中恢复缺失的patch来预训练大量未标记图像,但LoMaR在几个关键位置将其与MAE区分开来。上图并排比较了两者。在本节中,作者首先回顾MAE模型,然后描述LoMaR和MAE之间的差异。

Architecture

LoMaR采用了一种简单的编码器-编码器结构,而不是MAE的非对称编码器-解码器。作者将采样区域下所有可见和mask的patch输入编码器。虽然将mask patch输入编码器可能被认为是比仅将mask patch输入解码器的MAE效率更低的操作,但作者发现,在早期阶段输入mask patch可以增强视觉表现,并使其对较小的窗口大小更具鲁棒性。这可能是因为编码器可以在多个编码器层与其他可见patch交互后,将mask patch转换回其原始RGB表示。隐藏层中恢复的mask patch可以隐式地对图像表示作出贡献。因此,本文在LoMaR中保留mask patch作为编码器输入。

Relative positional encoding

LoMaR在MAE中应用相对位置编码(RPE)而不是绝对位置编码。作者应用了上下文RPE,在计算自注意时,它为每个查询i和键j引入了一个可学习的向量。

Implementation

给定一幅图像,首先将其划分为几个不重叠的patch。每个patch线性投影到嵌入中。作者在不同的空间位置随机抽取几个方形的K×K 个patch。然后,将每个窗口中固定百分比的patch归零。然后,将所有patch从每个窗口按顺序提供给编码器。编码器在自注意层中应用可学习的相对位置编码。作者用一个简单的MLP头将编码器输出的潜在表示转换回其原始特征维,然后用归一化的ground-truth图像计算均方误差。

自监督学习(SSL)可以从大量未标记数据的训练中获益。然而,在大规模的预训练下,它们的高计算要求仍然是一个值得关注的问题。在本文的研究中,作者观察到用于生成SSL的局部掩蔽重建(LoMaR)比MAE和BEiT等有影响力的著作使用的全局版本更有效。
LoMaR在图像分类、实例分割和目标检测方面具有良好的泛化能力;它可以很容易地合并到MAE和BEiT中。LoMaR有希望将SSL扩展到更大的数据集和更高的分辨率,以及计算更密集的数据集,如视频。LoMaR的另一个优点在于,当图像patch数量增加时,效率会提高。
主要原因是LoMaR限制了局部窗口内的自注意,其计算复杂度随每幅图像的采样窗口数呈线性增长。此特性可以在高图像分辨率下进行有效的预训练,而对于其他SSL方法来说,这将非常昂贵。它可以使许多视觉任务受益,例如需要在像素级进行密集预测的对象检测或实例分割。尽管LoMaR相对于其他高分辨率图像基线的预训练效率增益很高,但与MAE相比,LoMaR相对于低分辨率图像的效率提高有限。

ViTDet:只用普通ViT,不做分层设计也能搞定目标检测

论文链接:https://arxiv.org/abs/2203.16527

代码(已开源):https://github.com/facebookresearch/detectron2/tree/main/projects/ViTDet

当前的目标检测器通常由一个与检测任务无关的主干特征提取器和一组包含检测专用先验知识的颈部和头部组成。颈部/头部中的常见组件可能包括感兴趣区域(RoI)操作、区域候选网络(RPN)或锚、特征金字塔网络(FPN)等。如果用于特定任务的颈部/头部的设计与主干的设计解耦,它们可以并行发展。从经验上看,目标检测研究受益于对通用主干和检测专用模块的大量独立探索。长期以来,由于卷积网络的实际设计,这些主干一直是多尺度、分层的架构,这严重影响了用于多尺度(如 FPN)目标检测的颈/头的设计。

在过去的一年里,视觉 Transformer(ViT)已经成为视觉识别的强大支柱。与典型的 ConvNets 不同,最初的 ViT 是一种简单的、非层次化的架构,始终保持单一尺度的特征图。它的「极简」追求在应用于目标检测时遇到了挑战,例如,我们如何通过上游预训练的简单主干来处理下游任务中的多尺度对象?简单 ViT 用于高分辨率图像检测是否效率太低?放弃这种追求的一个解决方案是在主干中重新引入分层设计。这种解决方案,例如 Swin Transformer 和其他网络,可以继承基于 ConvNet 的检测器设计,并已取得成功。

在这项工作中,何恺明等研究者追求的是一个不同的方向:探索仅使用普通、非分层主干的目标检测器。如果这一方向取得成功,仅使用原始 ViT 主干进行目标检测将成为可能。在这一方向上,预训练设计将与微调需求解耦,上游与下游任务的独立性将保持,就像基于 ConvNet 的研究一样。这一方向也在一定程度上遵循了 ViT 的理念,即在追求通用特征的过程中减少归纳偏置。由于非局部自注意力计算可以学习平移等变特征,它们也可以从某种形式的监督或自我监督预训练中学习尺度等变特征。

研究者表示,在这项研究中,他们的目标不是开发新的组件,而是通过最小的调整克服上述挑战。具体来说,他们的检测器仅从一个普通 ViT 主干的最后一个特征图构建一个简单的特征金字塔(如图 1 所示)。这一方案放弃了 FPN 设计和分层主干的要求。为了有效地从高分辨率图像中提取特征,他们的检测器使用简单的非重叠窗口注意力(没有 shifting)。他们使用少量的跨窗口块来传播信息,这些块可以是全局注意力或卷积。这些调整只在微调过程中进行,不会改变预训练。

本文贡献:

(1) 提出了一种仅使用普通、非分层backbone(ViT)的目标检测器为ViTDet,可以与领先的分层backbone检测器(例如,Swin、MViT)竞争,仅使用没有标签的 ImageNet-1K 预训练就能超过ImageNet-21K 预训练的分层backbone检测器。

(2) 在普通的 ViT backbone,舍弃了FPN 模块,而仅仅使用单尺度featur map进行操作。

(3) 在ViT backbone上应用window attention解决在面对高分辨率图像时,处理效率低下问题,并且在之后仅使用少量的cross-window blocks。

(4) 我们的方法保持了将检测模块特定设计与任务不可知的backbone分离的理念,检测模块的先验知识仅在微调期间引入,无需在预训练中先验地调整backbone设计。(个人理解:比如需要根据目标尺寸大小人为设定FPN层数,分层结构等)

方法细节

该研究的目标是消除对主干网络的分层约束,并使用普通主干网络进行目标检测。因此,该研究的目标是用最少的改动,让简单的主干网络在微调期间适应目标检测任务。经过改动之后,原则上我们可以应用任何检测器头(detector head),研究者选择使用 Mask R-CNN 及其扩展。

简单的特征金字塔

FPN 是构建用于目标检测的 in-network 金字塔的常见解决方案。如果主干网络是分层的,FPN 的动机就是将早期高分辨率的特征和后期更强的特征结合起来。这在 FPN 中是通过自上而下(top-down)和横向连接来实现的,如图 1 左所示。

如果主干网络不是分层网络,那么 FPN 动机的基础就会消失,因为主干网络中的所有特征图都具有相同的分辨率。该研究仅使用主干网络中的最后一张特征图,因为它应该具有最强大的特征。研究者对最后一张特征图并行应用一组卷积或反卷积来生成多尺度特征图。具体来说,他们使用的是尺度为 1/16(stride = 16 )的默认 ViT 特征图,该研究可如图 1 右所示,这个过程被称为「简单的特征金字塔」。

从单张特征图构建多尺度特征图的策略与 SSD 的策略有关,但该研究的场景涉及对深度、低分辨率的特征图进行上采样。在分层主干网络中,上采样通常用横向连接进行辅助,但研究者通过实验发现,在普通 ViT 主干网络中横向连接并不是必需的,简单的反卷积就足够了。研究者猜想这是因为 ViT 可以依赖位置嵌入来编码位置,并且高维 ViT patch 嵌入不一定会丢弃信息。如下图所示,该研究将这种简单的特征金字塔与同样建立在普通主干网络上的两个 FPN 变体进行比较。在第一个变体中,主干网络被人为地划分为多个阶段,以模仿分层主干网络的各个阶段,并应用横向和自上而下的连接(图 2(a))。第二个变体与第一个变体类似,但仅使用最后一张特征图(图 2(b))。该研究表明这些 FPN 变体不是必需的。

主干网络调整

目标检测器受益于高分辨率输入图像,但在整个主干网络中,计算全局自注意力对于内存的要求非常高,而且速度很慢。该研究重点关注预训练主干网络执行全局自注意力的场景,然后在微调期间适应更高分辨率的输入。这与最近使用主干网络预训练直接修改注意力计算的方法形成对比。该研究的场景使得研究者能够使用原始 ViT 主干网络进行检测,而无需重新设计预训练架构。该研究探索了使用跨窗口块的窗口注意力。在微调期间,给定高分辨率特征图,该研究将其划分为常规的非重叠窗口。在每个窗口内计算自注意力,这在原始 Transformer 中被称为「受限」自注意力。与 Swin 不同,该方法不会跨层「移动(shift)」窗口。为了允许信息传播,该研究使用了极少数(默认为 4 个)可跨窗口的块。研究者将预训练的主干网络平均分成 4 个块的子集(例如对于 24 块的 ViT-L,每个子集中包含 6 个),并在每个子集的最后一个块中应用传播策略。研究者分析了如下两种策略:

  • 全局传播。该策略在每个子集的最后一个块中执行全局自注意力。由于全局块的数量很少,内存和计算成本是可行的。这类似于(Li et al., 2021 )中与 FPN 联合使用的混合窗口注意力。
  • 卷积传播。该策略在每个子集之后添加一个额外的卷积块来作为替代。卷积块是一个残差块,由一个或多个卷积和一个 identity shortcut 组成。该块中的最后一层被初始化为零,因此该块的初始状态是一个 identity。将块初始化为 identity 使得该研究能够将其插入到预训练主干网络中的任何位置,而不会破坏主干网络的初始状态。

这种主干网络的调整非常简单,并且使检测微调与全局自注意力预训练兼容,也就没有必要重新设计预训练架构。