首发于目标检测
Cascade RCNN(1)_论文_CVPR2018

Cascade RCNN(1)_论文_CVPR2018

Cascade RCNN与MSCNN为同一作者,作者针对目标检测做了两个维度的探索:

1 MSCNN:作者提出每个检测分支上感受野尺度不一样,随着feature map层次加深,感受野尺度逐步加大,此时目标尺度最好能与对应feature map上感受野的尺度相匹配,才会有最佳性能,感受野相对目标尺度过大 / 过小,都不能最佳性能地检出目标;因此作者提出了类似SSD中特征金字塔上多分支检测并输出bbox的方案;

2 Cascade RCNN:将2-stage的frcnn拓展为multi-stage,作者提出each-stage分支(1st-stage:RPN,这里指RPN之后的分支)也需要针对专门的IoU阈值挑选对应质量的样本用于训练与检测,才能达到最佳性能;例如,2nd-stage在IoU = 0.5的样本下训练并检测,3rd-stage在IoU = 0.6,以此类推;这样的好处就是:each-stage检出并调整的bbox都会有性能的提升(参照fig1 (c)中灰色线以上三个彩色曲线),2nd-stage处理IoU = 0.5的样本性能最好,经过2nd-stage调整后的bbox与gt的IoU更好,若想做进一步精调,就将2nd-stage的输出,输入到IoU = 0.6的3rd-stage做精调,再依次类推;最终过完所有分支后,得到最终输出结果;结合fig 3(d),可以发现作者是在frcnn基础上做的改进,也即不存在特征金字塔层的多个feature map上生成proposals,再输入Cascade分支,依然是单层feature map上的RPN,再连接multi-stage的Cascade RCNN;


然后如果将Cascade RCNN + MSCNN结合,做一个特征金字塔上各个分支的Cascade结构,是不是又可以发一篇论文了?不过我看了下Cascade RCNN网络结构,老实说就已经挺复杂了,再结合MSCNN,能耐心地写出这个结构还能work的,我敬你是条汉子。。。


这里可以打个比方,某个创业者A,可以将10人的小公司打造成100人的中型公司,这是他的长处;但如果想把1000人的公司发展成1000人,假如他搞不定(当然人是动态成长进步的,我这里只是碰巧打了这个比方),那么他就需要招募合伙人,刚好有这么个合伙人B,可以很好地管理这个100人团队(但他并不适合管理100人以下的团队),并可以继续壮大之,这样两人就顺利地完成了权力的交接棒,公司发展也会越来越好;---- 这里面的思路有点类似Cascade RCNN,pre-stage做一遍目标检测,并refine bbox后,next-stage对refine的bbox作进一步调整,pre-stage做的相对 “快糙猛” 一点,不适合做细活,但细活可以交给next-stage,它更擅长,同样地,它也不适合做 “快糙猛” 的工作,这样通过一个类似流水线的boosting操作,各自扬长避短,最终取得了最佳性能,真个公司也逐渐地壮大了;


那么如何保证pre-stage、next-stage具有这样分工的能力?本文就是在不同分支上通过设置不同的IoU阈值,获得各自分支上高质量的正样本训练达成的,这些分支拥有类似boosting-style逐步提升bbox与gt IoU的能力,因此可以保证每个分支上即使设置了逐步增加的IoU阈值,也能获得数量可观、不至于过拟合的正样本数量(如fig 4所示);


名词定义:

1 hypotheses:假设,猜想;在文中可以理解为:proposal,object candidate或pred bbox,以下就不中文翻译此词了;

2 close false positives:缩写close FP,指目标检测任务中与gt很靠近,却属于false positives,很容易被检测器误检为正样本的负样本,也即 “close but not correct” bbox;


疑问:

1. fig 3(d)为Cascade RCNN前向预测结构图,可以发现RPN输出的B0经过cascade检测分支,进阶提升的方式输出更精准的B1、B2、B3,最后以B3输出的bbox为最终结果,那么问题来了:C1、C2、C3输出的分类结果,我们应该信哪个?是按照C3的结果输出吗?

先卖个关子,可以到 (3)_思考 中解答,但可以给个提示:table 2中有说明,最终实现上可以看代码,不过网络图略微有点复杂,可以好好分析下;

2 现在假设RPN输出了hypotheses至Cascade RCNN,按照文中说法,这些hypotheses可能大部分都是低质量的,可以通过Cascade RCNN各个分支逐步提升检测质量,那么问题来了:hypotheses中总得有少量高质量的hypotheses,文中也提到,各个分支只有在处理对应IoU范围内的hypotheses,才能最佳地refine它们,那么此时将这些质量参差不齐的hypotheses(低质量占主导)一股脑送进Cascade RCNN,会不会性能不降反升?答案肯定是NO~,如果是Yes,就没有论文什么事儿了,但为什么?可以到 (3)_思考 中解答,但可以给个提示:参照fig 1;


Abstract

1 目标检测算法中,IoU阈值用于定义并生成正负样本,一般将IoU阈值设置为:0.5,但如果使用0.5的低IoU阈值训练检测器,会带来检测的噪声(mAP并不高),若简单粗暴地提高IoU阈值,检测性能却不升反降,原因有二:

1.1 IoU阈值提高了,用于训练的正样本数量就指数倍减少了,会导致训练的过拟合;

1.2 预测阶段,输入hypotheses与检测分支训练时采用的IoU阈值不一致,会导致性能下降;---- 不是很容易一句话讲清楚,但结合fig1、以及后续对Cascade RCNN的理解就很明白了;Cascade RCNN中,使用特定IoU阈值训练的分支用于检测特定IoU的bbox,且bbox准确度是进阶提升的;

2 本文提出multi-stage的Cascade RCNN,用于解决以上两个问题;Cascade RCNN使用进阶提升的IoU阈值训练Cascade的检测分支,使得模型对close FP更加鲁棒;同时基于fig 1、fig 2中的实验:前阶段检测器的输出分布(fig 1(c)中三条彩色线都在baseline的灰色线之上,说明检测器输出的结果对于输入而言,性能还是有提升的)更有利于使用更高IoU阈值训练下阶段更高质量的检测器,整个Cascade RCNN使用stage-by-stage的方式训练,也即后面检测分支的训练依赖于前面检测分支输出的结果;

3 Cascade RCNN中所蕴含的进阶采样方式,通过各个检测分支逐步输出高质量的hypotheses,确保每个分支上的训练都有足够数量的正样本,避免了1.1中的训练过拟合问题(如fig 4);同样的操作也用于预测阶段,以确保各个检测分支输出的更高质量hypotheses,能最佳适配于下一阶段的分支预测;---- enabling a closer match between the hypotheses and the detector quality of each stage

4 在COCO上,Cascade R-CNN性能超过了所有单模型(all single-model object detectors,感觉做多模型ensemble测性能有点耍流氓)的目标检测算法;此外将Cascade R-CNN思想迁移到其他目标检测算法时,也都能对比其baseline取得性能的提升(achieve consistent gains);


1. Introduction

目标检测需要解决两个任务:

1 recognition:将前景目标从背景中揪出来,并且指定正确的类别标签;---- 人脸检测就只需要从背景中揪出来就行了,因为只有fg / bg两类,通用目标检测就得给清楚具体的类别;

2 localization:给前景目标预测准确的bbox位置;

以上两个任务都挑战重重,因为都会面临海量的 “close” false positives ---- 很像正样本,但又不是正样本,而且还容易与TP混淆,不容易区分,因此检测器不仅要检出TP,还得抑制close FP;


当前sota的检测器都是2-stage,同时完成分类 + bbox回归的multi-task,IoU阈值用于定义并生成正负样本,当通用的阈值设置IoU = 0.5,对于正样本的生成条件过于宽松,会产生如fig 1(a)中的过多噪声bbox;主要原因是,这些被肉眼上判定为close FP的hypotheses可以轻易通过IoU >= 0.5的限制;尽管使用IoU = 0.5可以生成数量足够多、且多样化的正样本,但因为close FP也会顺势生成,导致分类器训练期间很难区分这些close FP;

hypothesis的质量:hypothesis与gt的IoU;

detector的质量:用于训练该detector的IoU阈值 u;

本文目标为,如fig 1(b)中,探索高质量检测器的必备因素,最好能输出包含更少close FP;本文关注于给定IoU阈值前提下,如何提升检测器性能,而非优化false positive rate;


fig 1(c)、1(d)展示了在IoU阈值 u = 0.5、0.6、0.7下,训练的检测器在localization和detection上的性能,fig 1(c)为localization性能,基于输入 / 输出proposals与gt的IoU评估(三条彩色线都在baseline的灰色线之上,说明检测器输出的结果对于输入而言,性能还是有提升的),fig 1(d)为detection性能,使用COCO中经典的动态调整IoU阈值得到不同AP性能的方案;

从fig 1(c)中可知,每个bbox回归器仅在其训练时给定的IoU阈值下,才对应最佳的检测性能(performs best for examples of IoU close to the threshold that the detector was trained,可以看fig 1(c)中各区间段,0.5 ~ 0.6:蓝色曲线性能最好;0.6 ~ 0.75:绿色曲线;0.75 ~ :红色曲线),这也是因为过拟合的缘故 ---- 更严格的IoU设定导致了正样本数量的急剧减少;

从fig 1(d)中可知,u = 0.5训练的检测器在低IoU阈值下,性能优于u = 0.6,但在高IoU阈值下,性能低于u = 0.6,同理u = 0.7;这说明如果仅使用单一的IoU阈值训练检测器,其并不能在各个level的proposals上都取得最佳性能(a detector optimized at a single IoU level is not necessarily optimal at other levels);---- 可以这么理解,就是如果检测器仅在低IoU的proposals下训练了,知道如何把不怎么准确的低质量proposals大幅度调整至靠近gt,实现方式“快糙猛”,但对于高质量proposals,只需要做微操就可以靠近gt,但此时检测器就懵逼了,猛张飞并不会绣花呀~~~

以上就说明了一个道理:不同质量的proposals最好对应不同能力的检测分支来操作,如果想得到高质量的检测结果,更需要在不同IoU阈值下训练的检测分支调整能力,与对应的hypotheses质量更匹配;


一般情况下,如果输入检测器的proposals质量高,那么检测器能输出refine后更高质量的结果,但从fig 1(d)中发现,简单粗暴地提升IoU阈值(u = 0.7)来训练模型,性能不升反降,作者认为原因如下:

1 图像中正负样本的比例本身就存在不均衡,如果再提升IoU阈值来筛选样本,正样本的数量会呈指数倍减少,更加加剧了正负样本的不均衡性,也即,简单粗暴地提升IoU阈值导致了训练阶段的模型过拟合;

2 从fig 1(c)中可以看出,每个检测分支经过特定IoU阈值下取得的样本下训练后,若检测的hypotheses也处于该IoU阈值范围内,就可以获得optimal检测效果,反之若将该分支用于其他IoU阈值下hypotheses的检测,检测的结果只能是suboptimal,也即在训练、测试阶段,不同IoU阈值下获取的样本训练的检测分支,最好也有一个类似流水线操作的boosting提升过程:低IoU分支搞定低质量hypotheses,refine后,此时低IoU分支搞不定高质量hypotheses,无法进一步提升其性能,那么就交给高IoU分支,它刚好适合搞定高质量hypotheses,可以作进一步refine;---- 通过观察fig 1(c)中各区间段性能就可以发现,不同IoU分支最适合处理其对应训练IoU下的hypotheses;


本文的Cascade RCNN可以解决以上问题,Cascade RCNN将RCNN拓展为multi-stage形式,采用cascade方式叠层各个不同IoU阈值训练的检测分支,使得hypotheses获得boosting的提升,更好地处理close FP;

Cascade RCNN的multi-stage分支按序逐步训练,pre-stage的输出结果输入next-stage用于训练,从fig 1(c)中可知,三条彩色线都在baseline的灰色线之上,说明检测器输出的结果对于输入而言,性能还是有提升的,那么multi-stage分支按序逐步训练,每个分支在一个特定IoU阈值下收集正负样本训练后,将该分支refine后得到的hypotheses,刚好可以用于训练next-stage更高IoU阈值下的检测分支;

作者认为以上操作与机器学习中常用的boostrapping方法有类似之处,但Cascade RCNN的重采样过程并不是像adaboost中那样,为了挖掘难负样本;而是经过curr-stage refine bbox后,每个分支可以获得更高质量的close FP用于下阶段的训练;此种方式可以保证各个检测分支通过按序逐步提升IoU阈值,也能收集到足够的正样本用于训练,避免了过拟合问题;


测试阶段也使用同样的cascade结构,经过不同IoU分支检测以性能进阶提升的hypotheses,恰好可以在各自分支上获得最佳的检测性能(The progressively improved hypotheses are better matched to the increasing detector quality at each stage),一如fig 1(c)、(d);


Cascade RCNN实现简单,训练end2end,在COCO上,Cascade RCNN的简单实现版(without any bells and whistles)就可以轻松吊打之前所有sota的单模型检测器,特别是在COCO的更高评估标准上,这种吊打来得更凶猛;此外Cascade RCNN思想可以应用于任意基于RCNN的2-stage方法上,计算量增加不大,性能却提升了2 ~ 4个点,且性能的提升不是baseline中不同主干网的功劳,而是完完全全来自于Cascade RCNN的高效设计,因此Cascade RCNN思想可以迁移到其他检测方案中;


2. Related Work

基于RCNN的2-stage目标检测算法,包含了proposal detector + region-wise classifier两步骤,同时完成分类 + bbox回归的multi-task;

为减少RCNN中的冗余计算,SPPNet、Fast RCNN使用region-wise feature extraction(空间金字塔pooling、RoI pooling),只需对图像单次前向卷积提特征,避免了多个proposals重复计算卷积提特征的高计算量,Faster RCNN采用RPN提proposals,速度快,且做到了整个检测框架的end2end;

R-FCN:通过替换RoI pooling为position sensitive RoI pooling,采用region-wise的全卷积替换Fast RCNN中的fc层,将Faster RCNN中2nd-stage的Fast RCNN计算量进一步压缩,速度快,效果好;

MS-CNN、FPN:2-stage,在特征金字塔的多个分支上生成proposals,可以有效避免Faster RCNN中单个feature map上目标尺度与感受野尺度不匹配的问题,以达到proposals的高召回率;

YOLO:1-stage,对图像一次前向操作即可在7 x 7的feature map网格上得到检测结果,检测速度实时,且效果还不错;

SSD:1-stage,采用了RPN中预定义anchor + YOLO中同时输出分类得分 + bbox回归的思想,而且在特征金字塔的多个不同分辨率分支上预测不同尺度目标,速度快,性能更好;

RetinaNet:1-stage,通过focal loss改进目标检测中fg / bg类别不平衡的问题,比sota的2-stage方法性能还要好;

iterative bbox reg:multi-stage,如fig 3(b),通过对同一个RCNN操作多次,以生成更高质量的bbox;

AttractioNet、CRAFT:使用multi-stage操作生成更准确的proposals,再用Fast-RCNN做进一步目标检测;

Cascade CNN、CC-Net:使用经典的Cascade方案完成人脸、目标检测;


3. Object Detection

Cascade RCNN基于2-stage的Faster RCNN作进一步改进,如fig 3(a):

0 conv梭一波,得到feature map;

1 proposals生成子网络(H0、RPN),作用于整幅feature map上生成初始的hypotheses,也即proposals;

2 hypotheses输入RoI检测子网络(H1,也即detection head,Fast RCNN),再为每个hypotheses预测分类得分(C)和bbox回归(B);

Cascade RCNN关注于multi-stage的检测子网络,proposals生成基于RPN;


3.1. Bounding Box Regression

image patch x 上预测的bbox坐标:b = (bx, by, bw, bh),bbox回归任务:学习一个回归器f(x, b),将 b 尽量靠近gt bbox g;训练流程通过训练样本集 {gi, bi},最小化损失函数Lloc实现:

Lloc在RCNN中为L2 loss,Fast RCNN中为Smoothed L1 loss;

为保证回归操作对尺度、位置的不变性,Lloc操作对应的向量Δ = (δx, δy, δw, δh)一般都会做以下处理:

作者发现bbox reg的refine幅度都比较小,因此公式(2)中的数值也都比较小,对比分类任务的调整幅度小很多;那么为了提升multi-task训练的效率,Δ一般都会做个正则化操作:δx <- δx′ = (δx − μx) / σx,就是减均值除方差;


还有一种观念认为,单个回归操作 f 并不能对bbox准确定位,那么在检出proposals之后,可以叠加回归操作 f 若干次,作为 post-processing step来更精确地调整bbox:

操作方式如公式(3),也称为iterative BBox reg,如fig 3(b),从fig 3(b)和公式(3)中可知,所有的head都相同参数,为同一个 f ,但此操作会带来两个问题:

1 如fig 1(c)所示,一个回归器 f 在u = 0.5阈值下训练,那么仅对同样为u = 0.5范围内的hypotheses性能最佳,更高IoU对应的hypotheses在该同样的 f 下性能可不是都棒棒哒,而且fig 1(c)中也看到了,对于IoU > 0.85的hypotheses,u = 0.5阈值下训练的 f ,refine输出后性能竟然还下降了;

2 如fig 2所示,bbox向量内各元素数据的分布随着每个stage操作都会有很大变化,尽管最开始u = 0.5的回归器 f 对于该hypotheses的分布处理是最优的,但接下来两个stage,很明显数据分布都改变了,再要求 f 同样能搞定它们,就有点为难 f 了;

基于以上两个弊端,iterative BBox不仅还需要一些human engineering辅助其做更精准的检测(这些后操作还不确保一定能提升性能),而且一般也就最多叠加两个 f ,不然各种影响因素加在一起就不好控制如何提升性能了;


3.2. Classification

分类器h(x):将image patch x 预测为 M + 1 中的一个类,0:bg,M:各个类别;也即h(x)是一个输出 M + 1 维向量,基于各个类别的后验分布函数:hk(x) = p(y = k|x),y对应类别标签;

给定训练集(xi, yi),分类loss:Lcls采用经典的cross-entropy loss:


3.3. Detection Quality

目标检测一般使用IoU确定正负样本集,如果与某个 gt 的IoU > 阈值 u,那么hypothesis可以认为是该 gt 类下对应的一个正样本,那么hypothesis的类标签是阈值 u 的函数:

gy:就是gt bbox g所对应的类标签,IoU阈值 u 可以定义检测器的质量;

目标检测比较难搞的一个原因是,不管IoU阈值 u 如何设定,检测任务总是一个对抗互斥关系的(detection setting is highly adversarial):

IoU阈值 u 设置得高一点吧,正样本里 bg 信息是少了,但对正样本的标准高了,正样本就更难收集了; u 设置得低一点吧,倒是可以收集到更多样化,数量更多的正样本,训练的检测器就搞不定close FP了;如fig 1(c),很难要求一个检测分支能处理所有IoU跨度的hypotheses,前向操作时,hypotheses一般来源于SS、RPN的输出,都是比较低质量的proposals,此时就需要检测器对这些低质量proposals有更好的判别能力,常规的折中操作就是设置 u = 0.5,但阈值还是太低了,会导致检出如fig 1(a)中过多的close FP;

另一种解决方案如fig 3(c),集成若干个不同检测能力的检测分支,各个分支也设定不同的阈值 u,损失函数也定位于学习各个分支的参数(optimized with a loss that targets various quality levels):

U:IoU阈值集,如U = { 0.5,0.55,...,0.75 },类似integral loss,但可以发现各个分支是独立输出预测结果的,没有cascade的叠层进阶关系;最后融合各个分支的检测结果,得到最终的检测结果;但此操作还是有这么个问题:IoU阈值高的话,正样本依然不好收集,正负样本依然不平衡,就依然会对高IoU阈值下的检测分支产生过拟合;

从fig 4中可知,1-stage输入hypotheses由RPN生成,质量比较低(大部分都是IoU:0.5 ~ 0.6之间),随着IoU阈值提升,对应的直方图数据分布急剧减少,如果依旧使用这些hypotheses训练integral loss的各个高IoU阈值分支,经过阈值 u 这么一卡,原先低IoU阈值的分支下属于正样本的数据全被干为负样本了,正样本更少了,正负样本更不均衡了,过学习的问题就来了;

即使我们有足够数量的正样本训练integral loss的各个分支,保证不会出现过拟合,但高IoU阈值下收集的正样本,训练的针对高质量hypotheses做refine的检测分支,也并不适合refine这些低质量的hypotheses(fig 3(c)中H1、H2、H3输入都来自H0),就又回到了fig 1(c)中的老问题了;

基于以上原因,如公式(6)、fig 3(c),尽管integral loss独立地堆叠了若干性能逐步递增的检测分支,但也无法针对所有IoU阈值跨度下的hypotheses都能取得最佳性能,实际上integral loss只比fig 3(a)中的frcnn性能好那么一丢丢,但框架处理流程、复杂度却增加了不少;


4. Cascade R-CNN

本节介绍fig 3(d)中的Cascade RCNN;

4.1. Cascaded Bounding Box Regression

如fig 1(c),单个IoU阈值下训练的检测分支无法在所有IoU分布下的hypotheses都取得最佳性能,受启发于人脸检测算法cascade CNN、mtcnn、PCN,可以使用divide-and-conquer方式,将难以搞定的bbox reg任务分解成一系列的更简单的bbox reg操作,cascade RCNN操作流程如fig 3(d),如公式(7)中cascade堆叠各个检测分支:---- 注意啦,公式(7)与公式(3)的差异性体现在:iterative BBox 所有的head都相同参数,为同一个 f ;Cascade RCNN中各个检测分支 f 却各不相同,且呈现出cascade叠层方式:

T:Cascade RCNN叠加的分支数;

cascade中每个分支 ft 通过各个分支上的训练数据{ bt }优化,{ bt }来源于{ b1 }经过之前所有分支输出后的结果,而非直接使用RPN的初始分布{ b1 }来训练 ft ;---- 这也是Cascade RCNN中经过进阶方式逐步提升hypotheses质量的精髓;


Cascade RCNN与iterative BBox的不同之处在于:

1 iterative BBox相当于一个提升检出bbox质量的后处理步骤,但Cascade RCNN中各个分支上的回归操作相当于在each-stage通过改变hypotheses的分布达到了重采样之目的;

2 Cascade RCNN同时应用于train + inference,两者实操过程在性能上不会有差异;

3 每个专门的检测分支{ fT,fT−1,,,,,f1 }基于每个stage调整分布后的hypotheses进行训练,而iterative BBox仅使用到了一个 f ,该 f 来自于RPN输出的初始化分布;优势:Cascade RCNN随后的分支可以做更精细化的回归训练,预测也能得到更精准的定位结果,且不需要human engineering干预;


如3.1小节,为了更高效地做multi-task训练,公式(2)中的Δ = (δx, δy, δw, δh)需要做减均值除方差操作;如fig 2、4,每个reg stage都会引起hypotheses分布的逐步调整(evolve sequentially),那么训练中,each stage都需要统计均值、方差变量,来正则化每个分支的 Δ 向量;


4.2. Cascaded Detection

如fig 4(a),RPN输出的初始hypotheses质量还是比较低的,大部分都在u = 0.5 ~ 0.6,Cascade RCNN通过各个分支cascade式叠加达到对hypotheses重采样之目的;同样受启发于fig 1(c),三条彩色线都在baseline的灰色线之上,说明所有 u 阈值下训练的检测器,输出的结果对于输入而言,性能还是有提升的;


那么,给定初始hypotheses:(xi,bi),cascade上检测分支对(xi, bi)一番操作,产生新的样本分布(x′i,b′i)以适配更高IoU阈值下的检测分支,那么如fig 4,经过每个stage的样本重采样工作,hypotheses质量也变得越来越好(distribution tilts more heavily towards high quality examples),且即使IoU阈值和检测分支性能逐步提升,在所有stage中正样本的数量大致保持在稳定范围内(keep the set of positive examples of the successive stages at a roughly constant size);


以上操作两个优势:

1 不会出现因正样本过少带来的训练过拟合,如fig 4,每个stage上正样本的数量都比较充足;

2 更高stage上的检测分支使用更高IoU阈值下收集的样本训练,且从fig 2中可知,通过逐步提升的IoU阈值可以在各个stage上去除outliers,就可以筛选到足够高质量的hypotheses用于训练各个分支;


每个stage t,检测分支包含分类器 ht + 回归器 ft,并使用 IoU = ut 阈值下收集的样本集,且 ut > ut−1,损失函数为:

其中,b^t = f^t−1(x^t−1, b^t−1), g 对应 xt 的gt bbox,λ = 1:权重因子; [·]:只在正样本上算reg loss,yt就是 xt 按照公式(5)和 ut 计算出的label;

与公式(6)中iterative BBox的loss不同之处在于,公式(7)、(8)确保各个检测分支的检测质量逐步提升(guarantees a sequence of effectively trained detectors of increasing quality);

在预测阶段,hypotheses随着cascade上各个检测分支的一番操作,质量逐步提升,且更高质量的hypotheses刚好对应基于更高IoU阈值训练的检测分支(higher quality detectors are only required to operate on higher quality hypotheses),最终就产生fig 1(c)、(d)中检测性能越来越好的效果;


5. Experimental Results

Cascade RCNN在MS-COCO 2017上评估,train / val / test:∼118k / 5k / ∼20k,其中test未公开gt标签(也称为test-dev),COCO-style的AP评估标准为IoU阈值从[0.5,0.95]区间,stride = 0.05,比Pascal VOC的单一IoU = 0.5评估方案,能更全面地反应检测器之性能;

所有模型在COCO train上训练,val上测试,并提交test-dev上评估性能;


5.1. Implementation Details

为简化操作,所有的回归器都是类别不可知的(All regressors are class agnostic),Cascade RCNN中所有检测stage有相同结构(与fig 3(a)中的H1类似,对应于fig 3(d)中的H1、H2、H3),最终包含4个stage:H0:RPN生成proposals;H1、H2、H3:IoU阈值U = {0.5, 0.6, 0.7};---- 其实参照IouNet可以发现,Cascade RCNN分支迭代次数超过3次后,性能会下降;

H0:RPN生成proposals的方式与frcnn一致,基于RPN生成;

H1、H2、H3:通过前一阶段回归操作输出的proposals,达到进阶采样(progressively resample)目的,用于下一阶段训练;

数据增强:horizontal flipping;

预测:单尺度图像,无其他bells and whistles;


5.1.1 Baseline Networks

三个baseline检测器:

1 Faster-RCNN:VGG作主干网;

2 R-FCN:ResNet作主干网;

3 FPN:ResNet作主干网;

都使用原论文中默认训练参数,采用end2end训练;

Faster-RCNN

原始frcnn中2nd-stage的Fast RCNN有连个fc层,本文做了精简以减少参数数量,每个fc层输入2048个单元,无dropout,128 RoIs / images;

R-FCN

R-FCN基于ResNet使用全卷积操作完成分类 + bbox回归(Cascade RCNN的head与之保持一致),无OHEM,256 RoIs / images;

FPN

使用了RoIAlign,实验中表示为FPN+,主干网ResNet-50用于消融实验,最终预测使用ResNet-101,256 RoIs / images;


5.2. Quality Mismatch

如fig 5(a),三个独立训练的检测器在阈值U = { 0.5,0.6,0.7 }下的AP,可以发现u = 0.5下训练的检测器,在低IoU条件下性能优于u = 0.6下训练的检测器,但高IoU条件下u = 0.6的性能更好,u = 0.5的检测器性能最差;---- 但终究都是IoU阈值越高,检测器的AP性能越差;

fig 5(b):改变了预测阶段proposals的质量:将gt bbox也加入至RPN输出的初始化proposals中,可以发现所有阈值 u 下训练的检测器性能都有提升,且 u = 0.7 下性能提升最明显,说明两个问题:

1 u = 0.5下训练的检测器并不利于精准地检测目标,仅仅在低质量hypotheses下表现出色;

2 若想得到高精度的检测结果,就需要hypotheses质量更能匹配上检测分支的质量;

fig 5(a)中虚线:将初始化的proposals替换为Cascade RCNN中2nd(u = 0.6)、3rd(u = 0.7)输出的更高质量proposals,结果也说明了测试阶段当proposals的质量与检测器更匹配时,其性能会显著提升;

从Cascade RCNN的所有stage上做性能测试,得到的结果也大致类似,如fig 6中可知,当使用更高质量hypotheses时,各个检测器性能提升明显,特别是高IoU阈值下训练的检测分支,性能提升得更夸张;例如:u = 0.7的检测器在低质量proposals的1st-stage性能很差,但2nd、3rd-stage若输入了更高质量的hypotheses,u = 0.7的检测器性能提升也很明显;

此外,对比fig 6与fig 5(a),尽管使用了相同的proposals,fig 6中基于cascade方式进阶训练的检测器,性能明显优于fig 5(a)中各个分支独立训练的检测器,这充分说明了,Cascade RCNN这种通过进阶boosting改变训练数据分布的方式,训练的检测器性能更好;


5.3. Comparison with Iterative BBox and Integral Loss

本小节比较fig 3 (b)、(c)、(d)中iterative BBox / integral loss / Cascade RCNN;

Iterative BBox:FPN+主干网,三个检测分支;

Integral loss:与Cascade RCNN相同数量的cls heads,H1、H2、h3:U = {0.5,0.6,0.7};

Localization

fig 7(a):iterative BBox与Cascade RCNN在定位性能上的比较;

iterative BBox中,1st在高IoU的hypotheses输入时,其输出性能竟然下降了(低于baseline的灰色线),且在iterative BBox的3rd分支下,其性能进一步下降;

但Cascade RCNN中3rd性能优于1st,且在所有输入IoU hypotheses情形下,输出的hypotheses性能都优于iterative BBox;


Integral Loss

integral loss detector:与Cascade RCNN相同数量的cls heads,性能如fig 7(b);

u = 0.6下检测器性能最好,u = 0.7下性能却最差,且即使所有检测器ensemble,性能也没显著提升;

table 1中,iterative BBox / integral loss / Cascade RCNN三者性能都优于FPN+的baseline,且随着AP标准的提升,Cascade RCNN的领先优势更明显;


5.4. Ablation Experiments

Stage-wise Comparison

table 2为针对stage的消融实验,可以发现仅融合1st-stage性能就优于baseline(受益于multi-stage multi-task的训练方式),2nd-stage、3rd-stage也可以进一步提升性能,并且可以发现不同于integral loss,更高的IoU检测分支,性能是提升的;最终三个检测分支ensemble后性能最好;


IoU Thresholds

row 1:baseline版Cascade RCNN,所有检测分支的head使用同样IoU下收集的样本训练,各个stage的差异就仅体现在输入hypotheses的差异上(参照fig 1(c)、fig 2,各个stage输入还是有区别的,但大致与fig 2中一致);但从row 1中可以看到,尽管各个分支在同IoU下收集的样本,但cascade结构还是提升了baseline性能,充分证明了cascade结构之优越性;

row 2:通过进阶提升IoU阈值 u 的方式,各个分支可以获得更多的close FP用于训练,进而可以提升更多的检测精度,结果与4.2小节分析保持一致;


Regression Statistics

如fig 2,进阶地探索回归的统计结果有利于cls + reg的multi-task学习,从table 3中也可以看到该方案的优势,但作者提到:The learning is not sensitive to these statistics,为什么我觉得还是有区别的?


Number of Stages

table 4中针对stage的消融实验,对比baseline,增加一个stage性能提升明显(34.9% -> 38.2%),增加两个stage性能提升更明显,但增加三个stage(u = 0.75)性能却还下降了,此外可以发现4-stage的AP性能尽管降低了,但却在AP90下性能依然是最好的;

总结下来,3-stage是性能 / 速度的最佳trade-off;


5.5. Comparison with the Sota

table 5,Cascade RCNN + FPN+ + ResNet-101的single-model检测器,RoIs数量:512;

table 5中group 1:1-stage检测器;group 2:2-stage;group 3:3-stage;所有其他检测器在 u = 0.5阈值下训练,从frcnn + FPN+拓展成Cascade RCNN,性能提升4%(38.8% -> 42.8%),从table 5中可以发现,Cascade RCNN在single-model下,各个指标都是sota;

AttractioNet:multi-stage,通过iterative BBox生成proposals,但性能还是比Cascade RCNN差了7.1%,且Cascade RCNN不像Mask R-CNN那样,还需要使用分割的监督信息;


5.6. Generalization Capacity

Faster RCNN、R-FCN、FPN+上都添加了3-stage的Cascade R-CNN结构,性能对比如table 6;


Detection Performance

从table 6中可以发现,添加Cascade RCNN结构后,三个baseline都能在val / test-dev上获得2 ~ 4%的性能提升,充分说明Cascade RCNN的普适性,大家快快把它用在各种检测算法上试一波吧;


Parameter and Timing

随着cascade检测分支数量的增加,模型的参数也会增大,但对于baseline head来说,检测分支数量增加带来的模型参数增加却是线性的,此外各个检测分支的计算量一般远远小于RPN层,因此train / test阶段,Cascade RCNN的计算量带来的额外开销都比较少;


6. Conclusion

1 本文提出multi-stage目标检测算法:Cascade RCNN,用于检测高质量的目标bbox;

2 Cascade RCNN可以避免训练时的过拟合(正样本过少),预测时的bbox质量不匹配问题(指在Cascade中,使用特定IoU阈值训练的分支用于检测特定IoU的bbox,才能达到最佳性能);

3 Cascade RCNN在COCO上的高性能充分说明,通过理解和掌握影响目标检测的各种小因素,并作出一丢丢小改进,也会有很大的性能提升空间;

4 5.6小节的实验表明Cascade RCNN思想可以应用于其他目标检测算法中,并可以进一步提升模型性能;


论文参考

CVPR2018_Cascade R-CNN:Delving into High Quality Object Detection


代码:

github.com/zhaoweicai/c

编辑于 2018-09-20

文章被以下专栏收录