Cascade R-CNN: Delving into High Quality Object Detection

CVPR2018的文章,通过改进two stage的目标检测算法,采用不同stage,不同iou阈值,上一个stage的输出proposals作为下一stage的输出进行训练,提升了算法的性能。

文章链接:https://arxiv.org/abs/1712.00726

1.motivation:

从(a)中可以看出当IOU设置为0.5(这里的iou表示的是用RPN选出2000个region proposals之后按照正样本:负样本=1:3选取512个样本的时候,判断为正样本的iou阈值)的时候,相比较与IOU=0.7会出现很多的非常接近于真实框的错误框,文中表达为“close” false positives, corresponding to “close but not correct” bounding boxes,这些会对我们的训练过程造成干扰,检测算法必须找到真实的框同时抑制这些“close” false positives。

(c)中的u表示训练RPN的时候用的IOU阈值,横坐标表示输入的proposals的IOU值,纵坐标是输入的proposals经过RPN之后输出的proposals的IOU的值(即RPN输出的proposals与这些proposals提取roi特征,经过全连接层提取特征之后得到的bbox_pred(这里的bbox_pred学习的是proposals与gt之间的偏移) refine之后得到的proposals),可以看出当输入的proposals的阈值在0.5-0.6的时候,u=0.5训练的RPN的效果是最好的,u=0.6,0.7的情况也是如此,在差不多输入iou的阈值等于对应的u的时候效果都会是最好的(each bounding box regressor performs best for examples of IoU close to the threshold that the detector was trained.),而且可以发现三条曲线都在baseline之上,说明经过了RPN之后输出的proposals的IOU阈值都会上升。

(d)中横坐标表示输入的proposals的IOU值,纵坐标表示在u值确定的时候的得到的AP值,可以看出当输入的iou threshold比较小的时候,u=0.5的detector的效果最好。证明一个单iou的detector只是在特定的iou threshold高效。

2.cascade rcnn

2.1 主要思想

从以上的分析就可以看出既然单IOU无法满足需要,cascade rcnn的主要思路就是采用multi-stage的方式,每个stage设置不同的IOU阈值(0.5,0.6,0.7)。每一个stage输出的proposals作为下一个stage的输入,从(c)中可以看出,比如第一个stage的iou=0.5,经过第一个stage之后输出的proposals的IOU的值会增大,再把这些iou阈值增大的proposals作为下一个stage(iou=0.6)的输入,依次类推,不断获得更高IOU值的proposals。

图(b)中采用相同的H,因为当用iou=0.5训练的regressor对那些高品质的proposals的效果会不好,比如对于那些iou=0.85的bbox,就无法取得好的训练效果。

从figure2中可以看出,每一个迭代之后bbox的分布都会发生较大的改变,所以单一iou阈值的regressor只是对于最初的分布是较好的,一旦发生了变化就难以适应。

图(c) 中是采用不同的H,每个H对应不同的iou的值,不如iou={0.5,0.55,....0.75},

就像figure4中看到的,随着iou的增大,正样本的数目减少的很快,这就导致高品质的分类器(即iou比较大的那些)很容易发现过拟合,而且这些高品质的分类器在inference的时候会面临很多低品质的proposals,这就导致了不好的效果,所以这种方式的性能相比于faster rcnn只得到了一点点的提升。

图(d)中采用不同的H,而且不同的H采用iou预制,而且每个stage的输出作为下一个stage的输入,从figure2中,不同的stage可以得到不同的bbox分布,可以看出在2nd stage 2nd stage 一些离群点被移除,从而使得对于该阶段的detector有了更好的训练bbox分布,从figure4中可以看出,在2nd stage, 3nd stage,高品质的正样本数目在不断的增加,从而使得每个stage的训练正样本都是足够的,不会发现过拟合。而且cascade rcnn在inference也采用同样的多stage的方式,使得和train阶段一致。

2.2 实验

作者在文中对stage的数目等做了很多实验,可以看出性能确实提高了不少,而且可以发现在stage数目等于2-3的时候效果最好。反正最后结果好就对了。

3.其他

1.cascade rcnn最后的loss是用RPN阶段产生的loss,不同stage的loss加权(代码中是按照(1,0.5,0.25)进行加权),最后求平均值所得。

2.在计算每个stage的loss的时候,其中reg_loss采用的是class agnostic,按照文中的说法是All regressors are class agnostic for simplicity,比如是一个四分类的任务(三个目标类加上一个背景类),在每一个stage,roi特征经过全连接层之后得到的bbox_pred[512,4],不同于faster rcnn中输出的[512,16](https://blog.csdn.net/breeze_blows/article/details/103334489)

参考:

https://zhuanlan.zhihu.com/p/36095768

猜你喜欢

转载自blog.csdn.net/breeze_blows/article/details/103334517