转:Cascade R-CNN,一个使你的检测更加准确的网络
转自:https://blog.csdn.net/Chunfengyanyulove/article/details/86414810
简要概述文章精华
本篇文章主要解决了在目标检测中,检测框不是特别准,容易出现噪声干扰的问题,即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阈值,训练了多个级联的检测器。
读了文章精华,我想你已经知道这个网络时做什么的,如果感兴趣,那么接着读下面的详细解析吧~~
文章详细解析
目标检测其实主要干的就是两件事,一是对目标分类,二是标出目标位置。所以,了解Faster R-CNN或者SSD的同学可能都比较清楚,为了实现这两个目标,在训练的时候,我们一般会首先提取候选proposal,然后对proposal进行分类,并且将proposal回归到与其对应的groud truth上面,但是这就带来了一个问题,因为我们做分类需要确定样本的标签,那么我们给什么样的proposal打一个标签呢?最常用的做法是利用IOU(proposal与ground truth的交并比),可是IOU阈值设置成多少可以作为我打标签的边界呢?常用的阈值是0.5,可是0.5是最好的吗?作者通过实验证实了不同IOU对于网络的影响,如图Figure 1 ©所示。图c中3条线分别代表3个IOU的阈值,横轴是输入的IOU的proposal,纵轴是对应的proposal经过网络输出后的坐标框与ground truth的IOU,我们观察可以发现,3条线,都在灰色对角线之上,说明3条线都有一定的优化效果,并且,3条线无一例外在自己设定的阈值周围优化较明显。
那么问题来了,我们是否可以将阈值提高,以达到优化输出精度的效果呢?
作者又做了不同阈值下网络精度的实验,结果如图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左右的时候,差距那么大。
实验证明了不能使用高的阈值来进行训练,但是实验也呈现出了另一个事实,那便是:回归器的输出IOU一般会好于输入的IOU,图figure1(c)所示。并且随着u的增大,对于在其阈值之上的proposal的优化效果还是有提升的。
那既然这样,我们是否可以采用级联的方式逐步提升呢?即首先利用u=0.5的网络,将输入的proposal的提升一些,假如提升到了0.6,然后在用u=0.6的网络进一步提升,加入提升到0.7,然后再用u=0.7的网络再提升,这样岂不是精度越来越高了?
于是乎,作者设计了Cascade R-CNN网络。
图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都是相同的,用公式表示就是如下:
这会导致了如下问题:
- 我们采用IOU=0.5来训练网络,如图Figure1 ©所示,其对IOU更高的图像效果提升有限。
- 在每次迭代后,bounding box的分布实际上发生了一定的改变,而分类器是基于最开始的bounding box来训练的,这样会产生较多的outlier point,如下图所示:(红的代表溢出点)
Cascade RCNN的结构图如图Figure3(d)所示,公式表示就是这样的:
iterative bounding box regression是对回归框进行后处理,即生成了之后在多次处理,而Cascade RCNN是在训练的时候就进行重新采样,训练的时候不同的stage的输入数据分布已经是不同的了。这就在一定程度上解决了iterative bounding box regression出现的数据分布变化的问题。高手解决问题,往往就是很简单的一个改动,却产生了重要的意义。
图Figure 4代表了Cascade R-CNN不同stage的输入数据的IOU分布。
实验部分
- 网络参数
网络的默认设置共有4个stage,第一个stage产生RPN,另外三个stage分别设置IOU阈值为[0.5,0.6,0.7],baseline的选择,Faster R-CNN作者默认选择VGG网络,R-FCN以及FPN作者默认选择ResNet作为backbone,使用的是默认参数。
具体的网络训练的默认参数论文中有提及,这里不详述了,感兴趣的读者可以自行查看论文,实验部分的介绍。
- 损失函数
关于损失函数,跟Faster R-CNN基本一致,没有什么变化。分类采用softmax,回归采用smooth L1 loss,并且为了防止由于bounding box的大小以及位置带来的回归尺度的影响,我们一般会对box的坐标进行归一化操作,即:
- 网络分析
图Figure5(a)中,3条实线分别对应3个IOU阈值下训练的模型的AP(注意这里是单独训练的,不是采用级联的方式训练的),如图可以发现,当u=0.6是时候,在IOU比较低的时候,其表现是没有u=0.5好的,但是在IOU比较高的时候,表现比0.5好了一些,而对比u=0.7会发现,其效果基本都在u=0.6以下,只有在IOU>0.8的时候,表现略微超过了u=0.5.该实验说明了,设置不同阈值对于网络的影响。
进一步的,作者又进行了实验,作者将ground truth加入到了Proposal中间,测试结果如图Figure5(b)所示,实验结果显示,网络的表现随着u提升而提升,为什么会这样呢?
说明,u=0.7的时候,需要你保证proposal的质量,即其输入的proposal的准确度要高一点,另外,u=0.7确实可以做到比u=0.5要好,只是需要你保证你proposal的准确度就行。
Cascade RCNN的作用不就是这样吗?那是不是如我们猜想的一样呢?图Figure5(a)给出了答案,其中虚线代表的是cascade结构的精度,可以发现,精度确实提升了,虽然没有在IOU较低的部分超过u=0.5,但是整体上是提升了的,说明cascade的提升还是有效果的。
图Figure(6)向我们展示了不同stage下不同阈值的表现,可以发现,stage1的时候u=0.7的detector表现不是很好,但是当stage=3的时候,u=0.7的表现就非常好了。并且细心的同学可能发现,图6的精度比图5的精度要高?这是为什么呢?因为图6是采用cascade方法训练得到了,而图5只是设置了不同的IOU阈值作为正样本来训练,并没有采用cascade方法,这里也侧面说明了cascade方法的有效性。
另外作者对比了Iterative BBox以及Intrgral Loss的精度,如下表。
对Cascade R-CNN网络的进一步探索实验
- 实验一:stage-wise的比较
下表展示了不同stage的表现,其中1,2,3分别代表单个stage的表现,1 ~ 2代表了级联1和2的表现,1 ~ 3代表了级联1-3的表现,可以发现AP呈递增趋势,效果也是越来越好,符合预期。
- 实验二:提升阈值的作用
下表展示了是否每个stage都需要提升IOU的阈值呢?带有向上箭头的那行表示IOU的阈值会提升,不带的表示不提升,实验结果表明提升的效果还是比较明显的,stat代表的是是否采用回归统计,这个回归统计是什么东西我也还没搞明白,知道的可以跟我说一下。。。
- 实验三:多少个stage是最合适的呢?
最后一个实验,作者对stage的数量进行了分析,如下图所示,作者发现stage为3的时候效果最好,继续增加效果反而下降了。
下图是cascade与目前stage of the art 网络的对比情况,其中Table 6还有训练时间等信息
可以发现使用cascade结构对于精度的提升确实是有帮助的,不过时间也会稍稍增加一些。
结论
本篇论文最大的贡献在于,提出了Cascade R-CNN的方法,同时向我们介绍了不同阈值下对于proposal的回归作用,虽然Cascade R-CNN方法可能没有什么特别的,但是能探究出背后的逻辑,设计出这个方法,还是很厉害的。