Introduction
structure层面
论文中给出了Fast R-CNN的大致结构。需要注意的是,右半边的结构图(灰底色)中,黑框
表示operation
,红框
表示output
:
我画了一个流程图,用来解释Fast R-CNN的形成:
如图所示,R-CNN留下了两大问题亟待后人解决:
- feature map不共享;
- mutli-stage (特征抽取、SVM分类、location回归) 太复杂太costly。
第一个问题,被前辈SPPNet通过 共享卷积 (本质上就是共享特征提取的结果) 解决了。
Fast R-CNN继承了SPPNet这一思想,并把SPPNet的SPP layer改进为了RoI Pooling。
Note:
- SPP layer是在RP上做3-stage (每个scale宽高比相等但 H × W H×W H×W大小不等) 的average pooling;RoI Pooling将之简化为1-stage的max pooling。
- 由于SPP layer有着明显的缺陷——pooling后得到的一根根tensor并没有按原先的位置排放成阵列,而是直接头尾相接,从而放弃了重要的位置信息,对RoI的分类不利。Fast R-CNN对此进行了修正。
针对第二个问题,特征抽取网络、SVM分类器、location回归器在Fast R-CNN中被整合到了同一个深度学习网络中,从此可以便捷快速地一起训练了。
loss层面
L l o c L_{loc} Lloc :由R-CNN、SPPNet时代沿用的 L 2 L_2 L2 演化为了 S m o o t h L 1 Smooth\ L_1 Smooth L1 。
batch层面
RBG大神提出了mini-batch (即N=2) 的认知。
basemodel层面
出于basemodel的限制,R-CNN、SPPNet的basemodel用的都是AlexNet。到了Fast R-CNN的时候,已经有VGG了。于是Fast R-CNN采用了VGG-16作为其basemodel。
在SPPNet中,由于其basemodel是AlexNet这种小网络,所以SPPNet的作者们说,train的时候只fine-tune最后的几个fc层,模型精度最高。
RBG大神说,这套定理到了以VGG-16为basemodel的深网络中就不适用了。RBG大神做了一系列ablation,发现沿用SPPNet的fine-tune定理会掉点:
而如果把fine-tune的范围往前一直扩大到conv3_1 (再往前就对mAP几乎没有提升了) 则效果最好。
compute层面
从time的角度来看,fc层的存在对于单图的cls任务而言,耗时占比小于前面的那些conv层;但在detection任务中,conv只需执行一次,fc却要执行几千次 (对每个RoI都要完整地走一遍fc) ,此时在fc上的耗时就占到了总耗时的50%。
RBG大神给出了解决方案:通过TSVD (截断奇异值分解) 来简化计算。
该方法节省了30%的detection耗时,mAP只牺牲了0.3%:
Innovation
宏观上,
- 从 stage 的角度来看,是从 four-stage 到 two-stage 的演进;
- 从 task system 的角度来看,是从 two-network system (将分类器和定位回归器用两个网络分开,各自独立训练) 到 one-network system (虽然这两个task是并行的,但都属于同一个network,可以一起训练) 的演进。
Result
Fast R-CNN在VOC数据集上吊打其他算法。
VOC2007:
VOC2010:
VOC2012:
Thinking
Fast R-CNN最吸引我的地方是它第一个将三个独立的任务 (feature extraction、cls、loc regression) 三合为一。将原本笨拙的Detection惯用设计大大精简,Simple is powerful。
到了Faster R-CNN,更是将Selective Search也替换为了能无缝衔接的RPN,从此,Detection的四大任务 (feature extraction、region proposal、cls、loc regression) 归于一统 (可以被一起训练了) 。
[1] Fast R-CNN