CVPR18 Detection文章选介(上)

今天给大家介绍一篇个人觉得对detection非常有insight的一篇文章:"Cascade R-CNN: Delving into High Quality Object Detection"。

在这篇文章中,作者对detection问题中的两个核心,分类和定位做出了细致的分析和观察,并从这样的观察中得到启发,提出了一个非常简单易行,但是效果十分显著的办法。

这篇文章的基础是two-stage detector,如RCNN,RFCN等,在这些two stage detector中,都会有一个header的结构来对每一个proposal同时做两件事情:classification和bounding box regression(bbox reg)。在classification中,每个proposal会被根据一个指定的IoU值分为正样本和负样本;在bbox reg中,每个被标记为正样本的bbox会向其assign的ground-truth方向回归。

这里作者第一个关键的发现是在classification中,指定不同的IoU划分正负样本,会导致bbox reg的行为完全不一样。如下图左,横轴是输入的proposal的IoU,纵轴是经过bbox reg之后的bbox和ground-truth的IoU。可以看到,低IoU threshold对于低IoU的样本有更好的改善,但是对于高IoU的样本就不如高threshold的有用。原因在于不同threshold下样本的分布会不一致,也就导致同一个threshold很难对所有样本都有效。

一个直接的想法是,为什么不可以直接使用高IoU呢?这就会导致第二个问题,也就是proposal的质量过差,导致高IoU的正样本数太少。如果强行这样训练的话,就会导致严重的overfitting问题。如上图右所示,threshold从0.5到0.6,最终的detection AP有些许上升,但是进一步提升到0.7,AP会急剧下降。

所以为了解决以上两个问题,作者提出了一个Cascade RCNN head的办法(上图d)。即有多个IoU threshold递增的header,每一级使用上一级refine过后的bbox作为输入。这样可以保证每一级的header都可以得到足够多的正样本,且正样本的质量可以逐级提升。在训练和测试时,这个操作也都保持一致。在测试中,作者使用多个header输出的均值作为这个proposal最终的分数,可以证明对结果会有进一步的提升。

不同于之前的工作,像Iterative bbox refinement,每次refine使用的是同样threshold训练出来的header,这会导致IoU到一定值之后很难更进一步改善;像Integral loss,只有一个bbox reg,但是有针对不同threshold的classifier,这本质上也并不能改善最终定位的精度。

在实验中,作者在COCO dataset上做了细致的分析,在多个不同backbone的网络上都可以持续性地提升3~4个点的AP。这对于COCO来说,已经是非常显著的改进了。同时,这个结果对比其他state-of-the-art方法仍然也很有优势。

个人总结:Detection其实并不是一个很合适的分类问题,没有一个明确的离散的正负样本的定义,而是通过IoU来连续定义的。但是IoU这个指标很难通过gradient descent来优化,虽然之前也有一些IoU loss的工作,但是效果并不理想。Cascade RCNN便是一个在这个方向上很好的尝试。

编辑于 2018-04-19

文章被以下专栏收录