Cascade R-CNN

本篇文章主要解决了在目标检测中,检测框不是特别准,容易出现噪声干扰的问题,即close false positive,为什么会有这个问题呢?作者实验发现,因为在基于anchor的检测方法中,我们一般会设置训练的正负样本(用于训练分类以及对正样本进行坐标回归),选取正负样本的方式主要利用候选框与ground truth的IOU占比,常用的比例是50%,即IOU>0.5的作为正样本,IOU<0.3作为负样本等,但是这样就带来了一个问题,阈值取0.5是最好的吗?作者通过实验发现,1、设置不同阈值,阈值越高,其网络对准确度较高的候选框的作用效果越好2、不论阈值设置多少,训练后的网络对输入的proposal都有一定的优化作用。基于这两点,作者设计了Cascade R-CNN网络,如下面图Figure3(d)所示,即通过级联的R-CNN网络,每个级联的R-CNN设置不同的IOU阈值,这样每个网络输出的准确度提升一点,用作下一个更高精度的网络的输入,逐步将网络输出的准确度进一步提高。

一句话总结就是:Cascade R-CNN就是使用不同的IOU阈值,训练了多个级联的检测器。

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

最后简单回顾一下R-CNN的结构。

                Cascade R-CNN

首先,以经典的Faster R-CNN为例。整个网络可以分为两个阶段,training阶段和inference阶段,如上图所示。

  • training阶段,RPN网络提出了2000左右的proposals,这些proposals被送入到Fast R-CNN结构中,在Fast R-CNN结构中,首先计算每个proposal和gt之间的iou,通过人为的设定一个IoU阈值(通常为0.5),把这些Proposals分为正样本(前景)和负样本(背景),并对这些正负样本采样,使得他们之间的比例尽量满足(1:3,二者总数量通常为128),之后这些proposals(128个)被送入到Roi Pooling,最后进行类别分类和box回归。
  • inference阶段,RPN网络提出了300左右的proposals,这些proposals被送入到Fast R-CNN结构中,和training阶段不同的是,inference阶段没有办法对这些proposals采样(inference阶段肯定不知道gt的,也就没法计算iou),所以他们直接进入Roi Pooling,之后进行类别分类和box回归。

在这里插一句,在R-CNN中用到IoU阈值的有两个地方,分别是Training时PositiveNegative判定,和Inference时计算mAP。论文中强调的IoU阈值指的是Training时PositiveNegative判定处。

 一.概述

目标检测其实主要干的就是两件事,一是对目标分类,二是标出目标位置。所以,了解Faster R-CNN或者SSD的同学可能都比较清楚,为了实现这两个目标,在训练的时候,我们一般会首先提取候选proposal,然后对proposal进行分类,并且将proposal回归到与其对应的groud truth上面,但是这就带来了一个问题,因为我们做分类需要确定样本的标签,那么我们给什么样的proposal打一个标签呢?最常用的做法是利用IOU(proposal与ground truth的交并比),可是IOU阈值设置成多少可以作为我打标签的边界呢?常用的阈值是0.5,可是0.5是最好的吗?作者通过实验证实了不同IOU对于网络的影响,如图Figure 1 (c)所示。图c中3条线分别代表3个IOU的阈值,横轴是输入的IOU的proposal,纵轴是对应的proposal经过网络输出后的坐标框与ground truth的IOU,我们观察可以发现,3条线,都在灰色对角线之上,说明3条线都有一定的优化效果,并且,3条线无一例外在自己设定的阈值周围优化较明显。

                                           Cascade R-CNN

那么问题来了,我们是否可以将阈值提高,以达到优化输出精度的效果呢?

作者又做了不同阈值下网络精度的实验,结果如图figure1(d)所示,可以发现,对于阈值为0.5以及0.6的时候,网络精度差距不大,甚至提升了一点,但是将精度提升到0.7后,网络的精度就急速下降了,(COCO数据集上:AP:0.354->0.319),这个实验说明了,仅仅提高IoU的阈值是不行的,因为提高阈值以后,我们会发现,实际上网络的精度(AP)反而降低了

为什么会下降呢?

  • 由于提高了阈值,导致正样本的数量呈指数减低,导致了训练的过拟合
  • 在inference阶段,输入的IOU与训练的IOU不匹配也会导致精度的下降。所以才会出现Figure1(d)中,u=0.7的曲线在IOU=0.5左右的时候,差距那么大。

                                           Cascade R-CNN

一张图说明问题,在上面这张图中,把RPN提出的Proposals的大致分布画了下,横轴表示Proposals和gt之间的iou值,纵轴表示满足当前iou值的Proposals数量。

  • 在training阶段,由于我们知道gt,所以可以很自然的把与gt的iou大于threshold(0.5)的Proposals作为正样本,这些正样本参与之后的bbox回归学习。
  • 在inference阶段,由于我们不知道gt,所以只能把所有的proposal都当做正样本,让后面的bbox回归器回归坐标。

我们可以明显的看到training阶段和inference阶段,bbox回归器的输入分布是不一样的,training阶段的输入proposals质量更高(被采样过,IoU>threshold),inference阶段的输入proposals质量相对较差(没有被采样过,可能包括很多IoU<threshold的),这就是论文中提到mismatch问题,这个问题是固有存在的,通常threshold取0.5时,mismatch问题还不会很严重。

实验证明了不能使用高的阈值来进行训练,但是实验也呈现出了另一个事实,那便是:回归器的输出IOU一般会好于输入的IOU,图figure1(c)所示。并且随着u的增大,对于在其阈值之上的proposal的优化效果还是有提升的

那既然这样,我们是否可以采用级联的方式逐步提升呢?即首先利用u=0.5的网络,将输入的proposal的提升一些,假如提升到了0.6,然后在用u=0.6的网络进一步提升,假如提升到0.7,然后再用u=0.7的网络再提升,这样岂不是精度越来越高了?

于是乎,作者设计了Cascade R-CNN网络。

                        Cascade R-CNN

a)中u=0.5也是常用的正负样本界定的阈值,但是当阈值取0.5时会有较多的误检,因为0.5的阈值会使得正样本中有较多的背景,这是较多误检的原因;(b)用0.7的IOU阈值可以减少误检,但检测效果不一定最好,主要原因在于IOU阈值越高,正样本的数量就越少,因此过拟合的风险就越大。Figure1(c)和(d)中的曲线是用来描述localization performance,其中横坐标表示输入proposal和ground truth的IOU值,纵坐标表示输出的proposal和ground truth的IOU值。红、绿、蓝3条曲线代表训练检测模型时用的正负样本标签的阈值分别是0.7、0.6、0.5。从(c)可以看出,当一个检测模型采用某个阈值(假设u=0.6)来界定正负样本时,那么当输入proposal的IOU在这个阈值(u=0.6)附近时,该检测模型比基于其他阈值训练的检测模型的效果要好。

那么很自然地想到能不能直接用较大的阈值(比如u=0.7)来训练检测模型呢?这样是不行的,从Figure1(d)也可以看出u=0.7的效果下降比较明显,原因是较高的阈值会使得正样本数量减少,这样数据更加趋于不平衡,而且正样本数量的减少会使得模型更容易过拟合。因此这条路是走不通的,所以就有了这篇文章的cascade R-CNN,简单讲cascade R-CNN是由一系列的检测模型组成,每个检测模型都基于不同IOU阈值的正负样本训练得到,前一个检测模型的输出作为后一个检测模型的输入,因此是stage by stage的训练方式,而且越往后的检测模型,其界定正负样本的IOU阈值是不断上升的。

为什么要设计成cascade R-CNN这种级联结构呢?一方面:从Figure1(c)可以看出用不同的IOU阈值训练得到的检测模型对不同IOU的输入proposal的效果差别较大,因此希望训练每个检测模型用的IOU阈值要尽可能和输入proposal的IOU接近。另一方面:可以看Figure1(c)中的曲线,三条彩色曲线基本上都在灰色曲线以上,这说明对于这三个阈值而言,输出IOU基本上都大于输入IOU。那么就可以以上一个stage的输出作为下一个stage的输入,这样就能得到越来越高的IOU。总之,很难让一个在指定IOU阈值界定的训练集上训练得到的检测模型对IOU跨度较大的proposal输入都达到最佳,因此采取cascade的方式能够让每一个stage的detector都专注于检测IOU在某一范围内的proposal,因为输出IOU普遍大于输入IOU,因此检测效果会越来越好。

 二.网络详解

2.1网络结构 

Cascade R-CNN

(a)是Faster RCNN,因为two stage类型的object detection算法基本上都基于Faster RCNN,所以这里也以该算法为基础算法。(b)是迭代式的bbox回归,从图也非常容易看出思想,就是前一个检测模型回归得到的bbox坐标初始化下一个检测模型的bbox,然后继续回归,这样迭代三次后得到结果。(c)是Integral Loss,表示对输出bbox的标签界定采取不同的IOU阈值,因为当IOU较高时,虽然预测得到bbox很准确,但是也会丢失一些bbox。(d)就是本文提出的cascade-R-CNN。cascade-R-CNN看起来和(b)这种迭代式的bbox回归以及(c)这种Integral Loss很像,和(b)最大的不同点在于cascade-R-CNN中的检测模型是基于前面一个阶段的输出进行训练,而不是像(b)一样3个检测模型都是基于最初始的数据进行训练,而且(b)是在验证阶段采用的方式,而cascade-R-CNN是在训练和验证阶段采用的方式。和(c)的差别也比较明显,cascade R-CNN中每个stage的输入bbox是前一个stage的bbox输出,而(c)其实没有这种refine的思想,仅仅是检测模型基于不同的IOU阈值训练得到而已。

图figure 3(d)是Cascade R-CNN的网络结构对比图,Figure 3(a)是Faster R-CNN的网络结构图,其中H0代表的是RPN网络,H1代表的是Faster R-CNN进行检测与分类的head,C1代表最终的分类结果,B1代表最终的bounding box回归结果。那么Cascade R-CNN有什么不同呢?H1那一部分是一样的,但是Cascade R-CNN得到B1回归后的检测框后,将其输入到H2部分,继续回归,以此类推到H3部分,使得每次对bounding box都提高一定的精度,已达到提高检测框准确度的作用。

注:级联的方式,不再是为了找到hard negatives,而是通过调整bounding boxes,给下一阶段找到一个IoU更高的正样本来训练。SSD等利用hard negatives方法进行优化。即对负样本loss排序,取loss较大的部分

在作者Cascade R-CNN之前,其实也有人研究了基于Cascade的方法进行坐标框的优化,如图figure3(b)所示,这种方法叫做iterative bounding box regression,不过该方法中所有的head都是相同的,用公式表示就是如下:

                                                                          Cascade R-CNN

这会导致了如下问题:

  • 我们采用IOU=0.5来训练网络,如图Figure1 (c)所示,其对IOU更高的图像效果提升有限。
  • 在每次迭代后,得到的所有的bounding box的分布实际上发生了一定的改变,而分类器是基于最开始的bounding box来训练的,这样会产生较多的outlier point,如下图所示:(红的代表溢出点)

Cascade R-CNN

  • 我们已经知道单一阈值0.5,是无法对所有proposal取得良好效果的。
  • 此外,detector会改变样本的分布,这时候再使用同一个共享的H对检测肯定是有影响的。作者做了下面的实验证明样本分布在各个stage的变化。
  • 可以看到每经过一次回归,样本都更靠近gt一些,质量也就更高一些,样本的分布也在逐渐变化。如果还是用0.5的阈值,在后面两个stage就会有较多离群点,使用共享的H也无法满足detector的输入的变化。
    从上面这个图也可以看出,每个阶段cascade都有不同的IoU阈值,可以更好地去除离群点,适应新的proposal分布。 

其中Cascade R-CNNCascade R-CNN有如下意义:

                                                                 Cascade R-CNN

Cascade RCNN的结构图如图Figure3(d)所示,公式表示就是这样的:

                                                                  Cascade R-CNN

iterative bounding box regression是对回归框进行后处理,即生成了之后在多次处理,而Cascade RCNN是在训练的时候就进行重新采样,训练的时候不同的stage的输入数据分布已经是不同的了。这就在一定程度上解决了iterative bounding box regression出现的数据分布变化的问题。高手解决问题,往往就是很简单的一个改动,却产生了重要的意义。 

图Figure 4代表了Cascade R-CNN不同stage的输入数据的IOU分布。

这样网络设计是需要有几个事实支持的,之所以说是事实支持而不是理论支持,因为这些结论大多数通过大量实验验证出的结果,很难用理论严格的证明。

  1. 一个检测器通常只在一个小范围的IOU阈值内(a single quality level)性能最好,从之前图片中c)可以发现,在0.55-0.6的范围内阈值为0.5的detector性能最好,在0.6~0.75阈值为0.6的detector性能最佳,而到了0.75之后就是阈值为0.7的detector了,比IOU阈值过高过低的proposal都会导致检测器性能下降,因此保证检测器训练时的IOU阈值与输入proposal 的IOU相近是十分重要并且有必要的。
  2. 通过观察图c可以发现,几乎所有检测器输出的检测框的IOU都好于输入proposal的IOU(曲线几乎都在灰色对角线之上),因此这保证了我们通过一个检测器输出的检测框整体IOU相对输入的proposal的IOU都会提高,可以作为下一个使用更高IOU阈值训练检测器一个很好的数据输入。因此每个检测器输出的检测框质量都会变高,阈值的提高其实也相当于一个resample的过程,一些异常值也可以去掉,提高了模型的鲁棒性。
  3. 读到这里最大困惑就是,一直提高阈值,那正样本会不会减少,导致过拟合呢? 作者通过详细的实验证明了每个阶段大于对应IOU阈值的proposal数量基本没有改变,甚至还有所提升,实验结果如下:

Cascade R-CNN

三.实验结果

Table1是关于cascade R-CNN和Iterative bbox、Integral loss的对比。

Cascade R-CNN

在COCO数据集上的提升确实非常明显。

Cascade R-CNN

 Table6主要通过在现有的two stage算法上添加cascade思想后的对比结果,另外还对比了训练、测试时间、参数量等信息。

Cascade R-CNN

四.总结

RPN提出的proposals大部分质量不高,导致没办法直接使用高阈值的detector,Cascade R-CNN使用cascade回归作为一种重采样的机制,逐stage提高proposal的IoU值,从而使得前一个stage重新采样过的proposals能够适应下一个有更高阈值的stage。

  • 每一个stage的detector都不会过拟合,都有足够满足阈值条件的样本。
  • 更深层的detector也就可以优化更大阈值的proposals。
  • 每个stage的H不相同,意味着可以适应多级的分布。
  • 在inference时,虽然最开始RPN提出的proposals质量依然不高,但在每经过一个stage后质量都会提高,从而和有更高IoU阈值的detector之间不会有很严重的mismatch。