paper:https://arxiv.org/pdf/2203.16527.pdf
本文对原生ViT(即non-hierarchical)骨干在目标检测中的应用进行了探索,使得原生ViT架构仅需针对目标检测进行微调而无需设计为分层版本预训练,所提方案能够取得极具竞争力的结果,比如,仅需ImageNet-1K预训练,所提ViTDet即可达到61.3
指标(COCO)。令人惊讶的是,我们发现:
- 单尺度特征足够构建一个简单的特征金字塔;
- 窗口注意力辅助极少量跨窗口传播就足够了。
1Method
本文旨在移除骨干网络中的分层约束以促进plain骨干目标检测方案的探索。为此,我们对ViT进行最小的改动以适配目标检测任务且仅发生在微调阶段。在完成上述适配后,理论上我们可以为其添加任意检测头,本文默认采用Mask R-CNN。
Simple Feature Pyramid 上图左为标准的FPN架构示意图,它以多尺度特征作为输入,对多尺度特征通过top-down方式进行融合。但是,如果骨干并非分层模式,那么原生FPN就无法使用了。在这里,我们仅使用骨干网络最后一层特征,并通过一系列卷积、反卷积构建多尺度特征,见上图右(本文将其称之为Simple Feature Pyramid)。
上图给出了两个基于plain骨干构建的FPN变种,即上图a和上图b。上图a将骨干网络人工划分成多个阶段;上图b则仅使用最后一层,但使用了FPN的top-down融合。实验结果表明:FPN的这两种变种是没有必要的。
Backbone Adaptation ViT的全局注意力对于高分辨率输入极不友好:耗显存且计算效率低。本文对其进行微调以适配高分辨率输入(不同于其他方案中的注意力修改),这就使得我们可以采用原生ViT骨干进行检测,且无需重新设计预训练架构。
我们对窗口注意力进行了探索,在微调阶段,给定高分辨率特征,我们将其拆分为规则的非重叠窗口,在每个窗口计算自适应力。但与Swin不同,我们并未进行shift处理,为促进跨窗口信息传播,我们采用少量模块(默认为4)进行跨窗口交互。我们将预训练骨干均匀的拆分为4个子模块集(比如,包含24个模块的ViT-L,每个子模块集包含6个模块),并在每个子模块集中的最后一个模块执行信息传播策略。
- Global Propagation 我们在每个子模块集的最后一个模块执行全局自注意力,由于全局模块的数量比较少,内存占用与计算量消耗是可接受的;
- Convolutional Propagation 另一种选择,我们在每个子模块集最后添加一个额外的卷积模块(即残差模块),同时残差模块最后一层的参数初始化为0,这就使得我们可以在预训练骨干的任意位置进行插入且不会改变骨干的原始状态。
值得一提的是:上述所用的骨干适配非常简单,同时使得检测微调与全局自注意力预训练兼容,故没有必要重新设计预训练架构。
在具体实验方面,我们采用了预训练ViT-B、ViT-L以及ViT-B,我们设置块尺寸为16,因此特征图的尺度维
,即stride=16。在检测头方面,我们采用了Mask R-CNN。输入图像尺寸为
,在COCO数据集上微调了100个epoch。
2Experiments
上表比较了不同FPN变种的性能,可以看到:
- 特征金字塔对检测器性能提升是有帮助的,无论是原生FPN还是本文 提到的仅以最后一层作为输入的FPN变种;
- FPN设计并非必要的,所提SFP对于ViT骨干已足够;
- 上述结果表明:多尺度检测的关键是金字塔特征集,而非top-down/lateral连接。
上表给出了不同骨干适配方案的性能对比,从中可以看到:
- 从上图a可以看到:所提跨窗口通讯方案具有更优的性能;
- 从上图b可以看到:尽管卷积是一种局部操作,但它对于两个窗口的像素连接已足够;basic版的残差模块具有更优的性能;
- 从上图c可以看到:均匀的插入四个全局传播模块可以取得更佳的性能;
- 从上图d可以看到:仅采用两个跨窗口通讯模块已取得非常好的性能提升。总而言之,窗口注意力 少量跨窗口传播模块提供一个有实际意义且高性能的均衡。
上表给出了不同预训练的影响,从中可以看到:由于ViT具有极少的归纳偏置,故它需要更高的容量以学习平移不变性等特性,但高容量的模型容易过拟合;而MAE预训练则可以解决该问题并取得更优的性能提升。
上表给出了所提方案与分层骨干检测器的性能对比,可以看到:
- 所提方案具有更优异的扩展行为,模型越大性能越好;
- ViT-H作为骨干的方案以2.6超过了MViTv2-H.
上表给出了所提方案与其他SOTA检测方案的性能对比,从中可以看到:
- plain骨干检测器首次在COCO上取得了非常高的性能,并与主流方案相当或更优;
- 相比UViT(近期提出的一种plain骨干检测器),所提方案性能更佳。两者的区别在于:UViT旨在设计新的plain骨干用于检测。尽管初衷不同,但两者均表明:plain骨干检测是一个有价值的研究方向。
3个人理解
关于ViTDet的介绍到此结束,更多消融实验&分析建议查阅原文。那么,接下来谈一谈个人的一点愚见。
刚看完Abstract部分时,第一个感觉是ViT YOLOF(见上图),因为YOLOF也是只采用骨干部分的最后一层特征。但走读完全文后再来看,ViTDet与YOLOF的动机和着手点完全不一样。从最终呈现的东西来看,YOLOF聚焦于Neck与Head部分的改动,ViTDet则聚焦于Backbone与Neck部分的改动,但两者不约而同的都对检测领域Neck部分的多尺度输入发起了挑战。
最早采用单尺度特征做检测的应该是YOLOv1吧,但当时性能比较差,迅速被多尺度特征方案吊打。自此之后,多尺度特征就成目标检测的标配。直到YOLOF深挖背后根因后才再一次说明单尺度特征也可以取得不错的性能。
本文的ViTDet则对ViT这种天生的单尺度特征在检测中的应用进行了探索,从两个维度进行了挖掘:(1) 如何在不改动整体结构的前提下将预训练ViT在检测任务上微调;(2) 如何将单尺度特征与通用检测头进行耦合,好像就是YOLOF一文提到的SiMO(可参考下图b)。
除了Neck外,ViTDet为了让ViT在尽可能小的改动下与检测任务兼容,采用了窗口注意力机制,但移除了窗口移位,采用了残差模块方式进行跨窗口通信,最终达成ImageNet预训练模型在对结构轻微适配后可以直接在检测任务上直接微调。不得不说,关于Backbone这里的改动真的是太简单直接了。但是,不得不提的是,ViTDet的指标这么酷很大原因还是MAE的功劳吧(常规预训练比MAE预训练的性能差距在4个点左右),恺明大大的MAE太强悍了!
此时,不由得升起一个疑问:常规的分层式骨干输出的多尺度特征是真正意义上的多尺度吗?多尺度到底应该是从绝对的尺寸维度去看待呢?还是应该从语义维度去看待呢?也许YOLOF与ViTDet会是一个不错的开端!诸位同仁如何看待呢?
最后,顺嘴提一句,如果把ViTDet的骨干部分与YOLOF的Encoder、Head结合一下会是什么样的情形呢?性能又是怎样呢?感兴趣的小伙伴可以一试了,哈哈。