![](/style/images/good.png)
![](/style/images/bad.png)
TridentNet (CVPR, 2019)
source link: https://hellozhaozheng.github.io/z_post/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89-TridentNet-CVPR2019/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
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上做了三点变化:
- 构造了不同receptive field的parallel multi-branch,
- 对于trident block中每一个branch的weight是share的。
- 对于每个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不增加任何计算量和参数量的情况下得到的。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK