CVPR18 Detection文章选介(下)

上一期发出之后,很多读者已经在评论中猜出了本期的主角。对,就是今年CVPR的oral paper "An Analysis of Scale Invariance in Object Detection - SNIP"!这个paper具体的做法其实非常简单,但是背后却很有深意。这个文章很早之前就读过了,但是一直感觉没有读透。直到最近抽空细思了一下,有一些心得和大家分享。

先简单来介绍一下SNIP这个paper做的事情。在CNN中,我们需要不同种类的invariance(不变性)来做识别,这其中translation invariance在CNN中可以比较好地被考虑,然而另外一种重要的不变性,scale invariance就很难被CNN考虑到。为了解决这个问题,一般常用的两大种策略就是Image Pyramid或者Feature Pyramid。在传统的Image Pyramid中,一般会使用一个固定大小的模板进行训练,将检测问题转换为一个固定大小的输入图像的分类问题。然后建立大小不同的Image Pyramid,在这个Pyramid中的每个scale的图片上,使用这个固定大小的检测器使用sliding window或cascaded classifier来分类。这大类方法中在deep时代比较经典的有MTCNN;另外一大类方法也就是Feature Pyramid,大家应该比较熟悉,这里的代表工作包括SPPNet和FPN,其中后者已经是目前检测算法的一个标准组件。FPN中的这张图很清晰解释了这两大类方法的关系和区别:

这篇文章中,作者对于scale对于CNN性能的影响做了十分深入的分析。下面这个表是引出这篇文章的motivation的核心。作者首先统一了测试的scale是1400,报告了COCO数据集上小物体(小于32*32)检测的mAP。值得关注的是以下三组实验反映出的问题:

  1. 800(all)和1400(all)的对比:训练时使用不同大小的图训练,理论上如果使用更大图,小物体检测的性能应当有显著提升。但是实验表明这个提升非常小。文章中给出的解释是虽然1400的图训练会提升小物体的性能,但是会加大大物体训练的困难,所以此消彼长,并不会有比较大提升。(其实我是不太认可这个解释的,个人理解见下面的第三条。)
  2. 1400(<80px)和1400(all)的对比:既然大物体太难train了,可能对小物体造成干扰,是否去掉大物体可以提升小物体的性能呢?答案也是否定的,而且损失掉的大物体的语义会让结果变得更加糟糕。
  3. MST:在Object Detection中,为了提升测试针对不同scale物体的性能,大家一般会使用Multi-scale training/testing这样的测试时融合的技巧来提升结果。与SNIP做法最大的区别就在于Multi-scale的做法扩充了不同scale样本的数目,但是仍然要求CNN去fit所有scale的物体。通过这样的一个对比实验,SNIP非常solid地证明了就算是数据相对充足的情况下,CNN仍然很难使用所有scale的物体。个人猜测由于CNN中没有对于scale invariant的结构,CNN能检测不同scale的“假象”,更多是通过CNN来通过capacity来强行memorize不同scale的物体来达到的,这其实浪费了大量的capacity,而SNIP这样只学习同样的scale可以保障有限的capacity用于学习语义信息。

所以,其实SNIP做的事情是非常简单的:在训练中,每次只回传那些大小在一个预先指定范围内的proposal的gradient,而忽略掉过大或者过小的proposal;在测试中,建立大小不同的Image Pyramid,在每张图上都运行这样一个detector,同样只保留那些大小在指定范围之内的输出结果,最终在一起NMS。这样就可以保证网络总是在同样scale的物体上训练,也就是标题中Scale Normalized的意思。

实验结果中可以看到,对比各种不同baseline,在COCO数据集上有稳定的3个点提升,这个结果可以说是非常显著了。

简而言之,SNIP可以看做是一个改版版本的Image Pyramid,从本质上来讲,其实和MTCNN并无太大区别,然而训练的时候使用了全卷积网络来训练和测试,一方面可以加速,另一方面可以利用更好更大的context信息。但是其背后反映出的问题确是十分有insight:也就是直击现在CNN网络其实仍无法解决好的一个问题,也就是scale invariance。虽然大家通过FPN,Multi-scale Training这样的手段来减轻了这个问题,但这个事情还是不能通过现有CNN的框架来本质上描述,无论是使用Multi-scale Training来暴力扩充数据,还是使用FPN来融合底层和高层的不同分辨率特征,都很难得到一个满意的效果。最有效的方式还是这个网络在训练和测试的时候都处理scale差不多大的物体。其实沿着SNIP的思路应该后续可以有很多工作可以来做,例如如何能够加速这样的Image Pyramid,是否可以显式地拆分出CNN中对于物体表示的不同因素(semantic,scale等等)。这些都会是很有价值的研究题目。

编辑于 2018-05-04

文章被以下专栏收录