Cascade R-CNN

论文:Cascade R-CNN: Delving into High Quality Object Detection
来源:CVPR 2018

1. Motivation

1.1 改变IoU阈值对检测器性能的影响

  • 在anchor-based检测器中,一般是根据候选框(anchor或proposal)和GT框的IoU阈值 u u u来界定正负样本。通常取IoU阈值 u = 0.5 u=0.5 u=0.5,这时正样本数量较多,有利于缓解正负样本平衡问题,但是,较低的IoU阈值会降低正样本的总体质量,最终导致检测器产生较多的false positive,如下所示。
    在这里插入图片描述

  • 解决上述问题最直接的方法就是提高IoU阈值。随着IoU阈值的增大,正样本与GT框匹配程度会更高,正样本所包含的背景信息也会越小,这样应该可以减小false positive的数量,回归器也将更容易实现高精度定位。

  • 但真的是这样吗?实际上,随着IoU阈值的增大,正样本的数量会指数性减少,最终检测器会因正样本数量不足而产生过拟合问题。下图所示为RPN的输出proposal在各个IoU范围内的数量。可以看到,正样本的数量确实随IoU阈值的增大而指数性衰减。IoU在0.7以上的proposals数量很少,而 u = 0.7 u=0.7 u=0.7时的 A P AP AP u = 0.5 u=0.5 u=0.5时的 A P AP AP更低。在这里插入图片描述在这里插入图片描述

1.2 Quality Mismatch

  • anchor-based方法中,在训练和测试时,存在着边界框质量不匹配问题。以Faster R-CNN为例:
    在这里插入图片描述
  • 训练阶段,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回归。
  • 测试阶段,RPN网络得到大约300个proposals,这些proposals被送入到Fast R-CNN结构中,与训练阶段不同的是,测试阶段没有办法对这些proposals采样,所以他们直接进入RoI Pooling,之后进行类别分类和box回归。
  • 显然,训练阶段和测试阶段的边界框回归器的输入分布是不一样的,训练阶段的输入proposals质量更高(被采样过,IoU>threshold),测试阶段的输入proposals质量相对较差(没有被采样过,可能包括很多IoU<threshold的),这就是quality mismatch问题
  • quality mismatch问题是固有存在的,通常IoU阈值取0.5时,mismatch问题还不会很严重;当增大IoU阈值时,mismatch问题将变得很严重,这将导致检测器的性能变差。

1.3 Cascade R-CNN的提出

  • 作者做了3组对比实验,实验结果如下图所示,横轴表示RPN所输出的proposal在回归前与其相应GT框之间的IoU,纵轴表示proposal经过边界框回归后与其相应GT框之间的IoU。该实验可以得出以下几个结论:
  1. 输出IoU基本上都大于输入IoU,这体现了回归器的重要作用。
  2. u = 0.5 u=0.5 u=0.5的蓝线、 u = 0.6 u=0.6 u=0.6的绿线、 u = 0.7 u=0.7 u=0.7的红线与灰色线的最大间隔分别在Input IoU=0.5、Input IoU=0.6、Input IoU=0.7时取得,表明当回归器对边界框进行精修时的最优性能与IoU阈值相对应。
  3. 若proposal自身的IoU与训练时的IoU阈值相差较远,回归器对边界框的精修能力有所下降,甚至会出现“负精修”现象,其结果还不如不精修,这也正是前文提到的quality mismatch问题。
  4. 单一阈值训练出的检测器效果非常有限,单一阈值不能对所有的Proposals都有很好的优化作用。
    在这里插入图片描述
  • 基于以上实验结论,作者提出了Cascade R-CNN,采取级联的方式让每个检测模型都专注于检测IoU在某一范围内的proposal,并让前一个检测模型的输出作为后一个检测模型的输入。当每个模型的IoU阈值逐渐增加时,由于其输出IoU普遍大于输入IoU,因此检测效果会越来越好。
  • 一句话总结就是:Cascade R-CNN就是使用递增的IoU阈值,训练了多个级联的检测器

2. Cascade R-CNN

  • 以Faster R-CNN为baseline,所以损失函数就是各个阶段的分类损失+回归损失之和
    在这里插入图片描述

2.1 Cascade R-CNN和Iterative BBox比较

  • Iterative BBox的H位置都是共享的,而且3个分支的IoU阈值都取0.5。Iterative BBox存在的问题是:(1) 单一阈值 u = 0.5 u=0.5 u=0.5,是无法对所有proposal取得良好效果的。(2) detection head会改变样本的分布,这时候再使用同一个共享的H对检测肯定是有影响的。作者做了下面的实验证明样本分布在各个stage的变化。
  • 可以看到每经过一次回归,样本都更靠近GT一些,质量也就更高一些,样本的分布也在逐渐变化(各回归变量的方差逐渐减小)。如果还是用0.5的阈值,在后面两个stage就会有较多离群点(红点),使用共享的H也无法满足detection head的输入的化。而Cascade R-CNN每个级联阶段都有不同的IoU阈值,可以更好地去除离群点,适应新的proposal分布。
    在这里插入图片描述

2.2 Cascade R-CNN和Integral Loss比较

  • Integral Loss共用pooling,只有一个stage,但有3个不共享的H,每个H处都对应不同的IoU阈值Integral Loss存在的问题是:第一个stage的输入IoU的分布很不均匀(RPN的输出),高阈值proposals数量很少,导致负责高阈值的detection head很容易过拟合。此外在测试时,3个detection head的结果要进行ensemble,但是它们的输入的IoU大部分都比较低,这时高阈值的detection head也需要处理低IoU的proposals,它就存在较严重的mismatch问题,检测效果就很差了。
  • 而在Cascade R-CNN中,阈值的提升并不会导致正样本的减少,主要是因为检测器输出的检测框的IoU都好于输入proposal的IoU,因此这保证了我们通过一个检测器输出的检测框整体IOU相对输入的proposal的IOU都会提高,可以作为下一个使用更高IoU阈值训练检测器一个很好的数据输入。因此每个检测器输出的检测框质量都会变高,阈值的提高其实也相当于一个resample的过程,一些异常值也可以去掉,提高了模型的鲁棒性。
    在这里插入图片描述

3. 实验

  • Cascade R-CNN的性能更佳
    在这里插入图片描述
  • stage-2的性能提升最明显,stage-3则可以进一步提高高标准下的 A P AP AP,如$ A P 80 AP_{80} AP80 A P 90 AP_{90} AP90,但会减小低标准下的 A P AP AP,如 A P 50 AP_{50} AP50 A P 60 AP_{60} AP60 A P 70 AP_{70} AP70。所以集成3个阶段的输出可进一步提高 A P AP AP
    在这里插入图片描述
  • 使用3个级联的阶段效果最好,继续增加级联阶段反而会降低检测器的 A P AP AP
    在这里插入图片描述