cascade-rcnn学习笔记

cascade-rcnn学习笔记

Cascade R-CNN算法是CVPR2018的文章,通过级联几个检测网络达到不断优化预测结果的目的,与普通级联不同的是,cascade R-CNN的几个检测网络是基于不同IOU阈值确定的正负样本上训练得到的,这是该算法的一大亮点。
cascade-rcnn学习笔记_第1张图片
首先我们来看这一组图片。a,b说明了较大的iou阈值可以降低误检率,这是很直觉的。但是,既然这样的话我们为什么还广泛采用iou=0.5呢?那是由于有下面两个问题的存在:

1、样本减少引发的过拟合
2、在train和inference使用不一样的阈值很容易导致mismatch。(只有输入的region proposal自身的IOU值和训练器训练用的设定IOU阈值较为接近的时候,训练器输出的IOU值才会高即性能才好)

其中第一点是比较容易理解的,第二点我们来看一下c,d图,C图说明只有train的iou接近proposal的iou的时候才会有较好的表现力,D图说明0.7的iou会比较快的下降,原因就是正样本的减少,导致正负样本不均衡,所以过拟合。
说到这里,有必要讲一下mismatch是怎么回事了。

mismatch讲解
cascade-rcnn学习笔记_第2张图片
一张图说明问题,在上面这张图中,把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

现在我们知道问题所在了,接下来的任务就是怎么办?
cascade-rcnn学习笔记_第3张图片
历史上有两种解决方案,B和C。A就是一般的faster-rcnn这里就不做过多解释了,我们当他为双阶段检测的baseline就好了(我会在之后的博客中详解一下Faster-rcnn)。
(b)表示迭代式的边界框回归,从图也非常容易看出思想,就是前一个检测模型回归得到的边界框坐标初始化下一个检测模型的边界框,然后继续回归,这样迭代三次后得到结果(注意三个检测模型其实是同一个检测网络,所以他们的iou阈值也是一样的)。这种迭代回归的方式有两个缺点:
1、从Figure1(c)的实验可以知道基于不同IOU阈值训练的检测模型对不同IOU的proposal输入效果差别比较大,因此如果每次迭代都用基于相同IOU阈值的训练数据训练得到的检测模型,那么当输入proposal的IOU不在你训练检测模型时IOU值附近时,效果不会有太大提升。
2、Figure3(下图)是关于迭代式bbox回归在不同阶段的四个回归值分布情况(蓝色点),可以看出在不同阶段这4个值得分布差异较大,对于这种情况,一成不变的检测模型显然难以在这种改变中达到最优效果。
cascade-rcnn学习笔记_第4张图片
这个图很重要!!!这个图很重要!!!这个图很重要!!!
作者从这个图发现,可以看到每经过一次回归,样本都更靠近gt一些,质量也就更高一些,样本的分布也在逐渐变化。如果还是用0.5的阈值,在后面两个stage就会有较多离群点,使用共享的H也无法满足detector的输入的变化。
从上面这个图也可以看出,每个阶段cascade都有不同的IoU阈值,可以更好地去除离群点,适应新的proposal分布。

不好意思跑题了,我们接着讲。
(C)表示Integral Loss,也就是我们一般的集成学习的思想。既然一个固定的iou阈值效果不好,我们就来三个不同的iou阈值,然后融合不就好了。表示对输出边界框的标签界定采用不同的IOU阈值,因为当IOU较高时,虽然预测得到边界框很准确,但是也会丢失一些边界框。关于这个网络的解释看原文更容易理解:
cascade-rcnn学习笔记_第5张图片
这种Trick在比赛中比较常用,就是说按照数据集的评价指标来自定义Loss(一般是把和指标相关的那一项加在原始的Loss后面)往往可以取得更好的效果。
(d)表示Cascade R-CNN,可以看到它和Figure3(b),Figure3©的结构比较像。但和Figure3(b)最主要的区别是Cascade R-CNN中的检测模型是基于前一阶段的输出进行训练,而不是Figure3(b)中那样个模型都是基于原始的数据进行训练。而和Figure3©的区别更加明显,Cascade R-CNN中每个Stage的输入候选框都是前一个阶段的候选框输出,而却没有这种级联的思想,仅仅是模型基于不同的IOU阈值进行训练得到。(也就是站到了巨人的肩膀上)
这里有一个困惑我很久的疑惑,按照图上来说我们每次输入下一个stage的proposal是我们前一个stage输出的proposal,但是原文中有大量的resample,作者自诩他的这个模型是resample模型。打个比方:
training阶段,RPN网络提出了2000左右的proposals,假如stage1在训练的时候首先产生2000个rois,然后通过iou的阈值产生128个rois(32positive,96negtive),接下来带入stage2的anchor是先前传出的2000个rois还是128个rois???
按照resample的定义,不应该是对2000个proposal再进行一次采样吗?
其实不是,文章中给出了resample的定义:
The main difference is that the resampling procedure of the Cascade R-CNN does not aim to
mine hard negatives. Instead, by adjusting bounding boxes,
each stage aims to find a good set of close false positives for training the next stage.
翻译过来就是,级联的方式,不再是为了找到hard negatives,而是通过调整bounding boxes,给下一阶段找到一个IoU更高的正样本来训练。SSD等则是利用hard negatives方法进行优化。即对负样本loss排序,取loss较大的部分。

inference阶段,RPN网络提出了300左右的proposals,这些proposals被送入到Fast R-CNN结构中,和training阶段不同的是,inference阶段没有办法对这些proposals采样(inference阶段肯定不知道gt的,也就没法计算iou),所以他们直接进入Roi Pooling,之后进行类别分类和box回归

又走远了,继续我们的思路。。。。
那么cascade真的可以解决上述B和C的问题吗?下面的Figure4展示了Cascade R-CNN在不同阶段预测得到的候选框的IOU值分布情况。可以看到,每经过一个检测器进行坐标回归,候选框越准确,也即是说候选框和GT框的IOU更大。从Figure4可以看出,经过检测器之后IOU大的样本增加了,这就说明了Cascade R-CNN是可行的,因为它不会因为后面的检测器提高阈值导致正样本过少而过拟合。
cascade-rcnn学习笔记_第6张图片
最后再讲一下,loss函数,关于损失函数,跟Faster R-CNN基本一致,没有什么变化。分类采用交叉熵,回归采用smooth L1 loss,并且为了防止由于bounding box的大小以及位置带来的回归尺度的影响,我们一般会对box的坐标进行归一化操作。即:
在这里插入图片描述
cascade-rcnn学习笔记_第7张图片
至此,cascade-rcnn就完全讲完了。后面的实验可以去看原文
源代码
还有知乎大神写的超详细的原文翻译解读。

你可能感兴趣的:(深度学习,计算机视觉)