论文中给出了Fast R-CNN的大致结构。需要注意的是,右半边的结构图(灰底色)中,黑框
表示operation
,红框
表示output
:
我画了一个流程图,用来解释Fast R-CNN的形成:
如图所示,R-CNN留下了两大问题亟待后人解决: 1. feature map不共享; 2. mutli-stage (特征抽取、SVM分类、location回归) 太复杂太costly。
第一个问题,被前辈SPPNet通过 共享卷积 (本质上就是共享特征提取的结果) 解决了。 Fast R-CNN继承了SPPNet这一思想,并把SPPNet的SPP layer改进为了RoI Pooling。
Note:
由于这个时期人们都只在topmost-feature map上进行RP操作,因此,弃SPP layer 而用RoI Pooling相当于主动放弃了SPPNet中的multi-scale思想。而这一multi-scale思想在SSD中通过multi-feature map再次被发扬光大,并成为了之后的detection算法标配。当然,这都是后话。
针对第二个问题,特征抽取网络、SVM分类器、location回归器在Fast R-CNN中被整合到了同一个深度学习网络中,从此可以便捷快速地一起训练了。
LlocLlocL_{loc} :由R-CNN、SPPNet时代沿用的 L2L2L_2 演化为了 Smooth L1Smooth L1Smooth\ L_1 。
RBG大神提出了mini-batch (即N=2) 的认知。
出于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几乎没有提升了) 则效果最好。
从time的角度来看,fc层的存在对于单图的cls任务而言,耗时占比小于前面的那些conv层;但在detection任务中,conv只需执行一次,fc却要执行几千次 (对每个RoI都要完整地走一遍fc) ,此时在fc上的耗时就占到了总耗时的50%。
RBG大神给出了解决方案:通过TSVD (截断奇异值分解) 来简化计算。 该方法节省了30%的detection耗时,mAP只牺牲了0.3%:
宏观上,
Fast R-CNN在VOC数据集上吊打其他算法。
VOC2007:
VOC2010:
VOC2012:
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