TridentNet (CVPR, 2019)

文章: Scale-Aware Trident Networks for Object Detection
作者: Yanghao Li Yuntao Chen1,3 Naiyan Wang2 Zhaoxiang Zhang
机构: University of Chinese Academy of Sciences 2 TuSimple

注明: 本篇文章转载自图森 Naiyan Wang 博士的知乎专栏(https://zhuanlan.zhihu.com/p/54334986), 这里仅仅作为交流学习使用

简单回顾一下现有的两大类方法。第一大类,也是从非Deep时代,乃至CV初期就被就被广泛使用的方法叫做image pyramid。在image pyramid中,作者直接对图像进行不同尺度的缩放,然后将这些图像直接输入到detector中去进行检测。虽然这样的方法十分简单,但其效果仍然是最佳,也后续启发了SNIP这一系列的工作。单论性能而言,multi-scale training/testing仍然是一个不可缺少的组件。然而其缺点也是很明显的,测试时间大幅度提高,对于实际使用并不友好。另外一大类方法,也是Deep方法所独有的,也就是feature pyramid。最具代表性的工作便是经典的FPN了。这一类方法的思想是直接在feature层面上来近似image pyramid。非Deep时代在检测中便有经典的channel feature这样的方法,这个想法在CNN中其实更加直接,因为本身CNN的feature便是分层次的。从开始的MS-CNN直接在不同downsample层上检测大小不同的物体,再到后续TDM和FPN加入了新的top down分支补充底层的语义信息不足,都是延续类似的想法。然而实际上,这样的近似虽然有效,但是仍然性能和image pyramid有较大差距。

作者考虑对于一个detector本身而言,backbone有哪些因素会影响性能。总结下来,无外乎三点:network depth(structure),downsample rate和receptive field。对于前两者而言,其影响一般来说是比较明确的,即网络越深(或叫表示能力更强)结果会越好,下采样次数过多对于小物体有负面影响。但是没有工作,单独分离出receptive field,保持其他变量不变,来验证它对detector性能的影响。所以,作者做了一个验证性实验,分别使用ResNet50和ResNet101作为backbone,改变最后一个stage中每个3*3 conv的dilation rate。通过这样的方法,作者便可以固定同样的网络结构,同样的参数量以及同样的downsample rate,只改变网络的receptive field。作者很惊奇地发现,不同尺度物体的检测性能和dilation rate正相关!也就是说,更大的receptive field对于大物体性能会更好,更小的receptive field对于小物体更加友好。于是下面的问题就变成了,作者有没有办法把不同receptive field的优点结合在一起呢?

所以作者最开始的一个想法便是直接加入几支并行,但是dilation rate不同的分支,在文中作者把每一个这样的结构叫做trident block。这样一个简单的想法已经可以带来相当可观的性能提升。作者进一步考虑作者希望这三支的区别应该仅仅在于receptive field,它们要检测的物体类别,要对特征做的变换应该都是一致的。所有自然而然地想到作者对于并行的这几支可以share weight。 一方面是减少了参数量以及潜在的overfitting风险,另一方面充分利用了每个样本,同样一套参数在不同dilation rate下训练了不同scale的样本。最后一个设计则是借鉴SNIP,为了避免receptive field和scale不匹配的情况,作者对于每一个branch只训练一定范围内样本,避免极端scale的物体对于性能的影响。

总结一下,作者的TridentNet在原始的backbone上做了三点变化:

  1. 构造了不同receptive field的parallel multi-branch,
  2. 对于trident block中每一个branch的weight是share的。
  3. 对于每个branch,训练和测试都只负责一定尺度范围内的样本,也就是所谓的scale-aware。
    以上三点在任何一个深度学习框架中都是非常容易实现的。

在测试阶段,作者可以只保留一个branch来近似完整TridentNet的结果,后面作者做了充分的对比实验来寻找了这样single branch approximation的最佳setting,一般而言,这样的近似只会降低0.5到1点map,但是和baseline比起来不会引入任何额外的计算和参数。

论文中做了非常详尽的ablation analyses,包括有几个branch性能最好;trident block应该加在网络的哪个stage;trident block加多少个性能会饱和。这些就不展开在这里介绍了,有兴趣的读者可以参照原文。这里主要介绍两个比较重要的ablation。

第一个当然是作者提出的这三点,分别对性能有怎样的影响。作者分别使用了两个很强的结构ResNet101和ResNet101-Deformable作为作者的backbone。这里特地使用了Deformable的原因是,作者想要证明作者的方法和Deformable Conv这种 去学习adaptive receptive field的方法仍然相兼容。具体结果见下。

可以看到,在接近map 40的baseline上,作者提出的每一部分都是有效的,在这两个baseline上分别有2.7和1.9 map的提升。

另外一个值得一提的ablation是,对于作者上面提出的single branch approximation,作者如何选择合适的scale-aware training参数使得近似的效果最好。其实作者发现很有趣的一点是,如果采用single branch近似的话,那么所有样本在所有branch都训练结果最好。这一点其实也符合预期,因为最后只保留一支的话那么参数最好在所有样本上所有scale上充分训练。如果和上文40.6的baseline比较,可以发现作者single branch的结果比full TridentNet只有0.6 map的下降。这也意味着作者在不增加任何计算量和参数的情况,仍然获得2.1 map的提升。这对于实际产品中使用的detector而言无疑是个福音。

作者还和经典的feature pyramid方法FPN做了比较。为了保证比较公平,作者严格遵循Detectron中的实现方式,并使用两层fc作为detector的head。可以看到在这样的setting下,FPN其实对于baseline而言小物体有一定提升,然而大物体性能下降,综合下来并没有比baseline有提高,但是作者的方法仍然可以持续地提升2.2个点map,就算使用single branch approximation,仍然也有1.2个点的提升。这充分证明了作者的方法的普适性。

最后作者将作者的方法和各paper中报告的最好结果相比较。但是其实很难保证绝对公平,因为每篇paper使用的trick都不尽相同。所以作者在这里报告了两个结果,一个是ResNet101不加入任何trick直接使用TridentNet的结果,一个是和大家一样加入了全部trick(包括sync BN,multi-scale training/testing,deformable conv,soft-nms)的结果。在这样的两个setting下,分别取得了在COCO test-dev集上42.7和48.4的结果。这应该分别是这样两个setting下目前最佳的结果。single branch approximation也分别取得了42.2和47.6的map,不过这可是比baseline不增加任何计算量和参数量的情况下得到的。

TridentNet%2Ffig1.jpg

TridentNet%2Ffig2.jpg

TridentNet%2Ffig3.jpg

TridentNet%2Ftab1.jpg

TridentNet%2Ftab2.jpg

TridentNet%2Ftab3.jpg

TridentNet%2Ftab4.jpg

TridentNet%2Ftab5.jpg

TridentNet%2Ftab6.jpg

TridentNet%2Ftab7.jpg

TridentNet%2Ftab8.jpg