Fast R-CNN 是对R-CNN的改进,作者栏只有RBG一人。文章先指出了R-CNN存在的问题,再介绍了自己的改进思路。文章结构堪称典范,从现存问题,到解决方案、实验细节,再到结果分析、拓展讨论,条分缕析,值得借鉴。而且,RBG开源的代码也影响了后来大部分这一领域的工作。
R-CNN的问题
- 训练是一个多阶段的过程(Proposal, Classification, Regression)
- 训练耗时耗力
- 推断耗时
而耗时的原因是CNN是在每一个Proposal上单独进行的,没有共享计算。
Fast R-CNN Architecture
Architecture
上图是Fast R-CNN的架构。图片经过feature extractor产生feature map, 原图上运行Selective Search算法将RoI(Region of Interset)对应到feature map上,再对每个RoI进行RoI Pooling操作便得到等长的feature vector,最后通过FC后并行地进行Classifaction和BBox Regression。
Fast R-CNN的这一结构正是检测任务主流2-stage方法所采用的元结构的雏形。整个系统由Proposal, Feature Extractor, Object Recognition&Localization几个部件组成。Proposal部分被替换成RPN(Faster R-CNN),Feature Extractor部分使用SOTA的分类CNN网络(ResNet等),而最后的部分常常是并行的多任务结构(Mask R-CNN等)。
RoI Pooling
这一操作是将不同大小的RoI(feature map上)统一的过程,具体做法是将RoI等分成目标个数的网格,在每个网格上进行max pooling,就得到等长的RoI feature vector。
Mini-batch Sampling
文章指出SPPNet训练较慢的原因在于来自不同图片的RoI不能共享计算,因而Fast R-CNN采用这样的mini-batch采样策略:先采样N张图片,再在每张图片上采样R/N个RoI,构成R大小的mini-batch。
采样时,总是保持25%比例正样本(iou大于0.5),iou在0.1到0.5的作为hard example。
Multi-task Loss
得到RoI feature vector后,后续的操作是一个并行的结构,Fast R-CNN将Classification和Regression的损失统一起来,并且在Regression中用更鲁棒的Smooth L1 Loss代替L2 Loss。
Fine Tuning
文章还发现,对于预训练的VGG网络,开放Conv部分的参数更新有助于性能的提升,而不是只更新FC层。
将proposal, classification, regression统一在一个框架
Design Evaluation
文章最后还对系统结构进行了讨论:
- multi-loss traing相比单独训练Classification确有提升
- Scale invariance方面,multi-scale相比single-scale精度略有提升,但带来的时间开销更大。一定程度上说明CNN结构可以内在地学习scale invariance
- 在更多的数据(VOC)上训练后,mAP是有进一步提升的
- Softmax分类器比”one vs rest”型的SVM表现略好,引入了类间的竞争
- 更多的Proposal并不一定带来性能的提升
小结
Fast R-CNN是对R-CNN的改进,也是对2-stage方法的系统化、架构化。文章将Proposal, Feature Extractor, Object Recognition&Localization统一在一个整体的结构中,并推进共享卷积计算以提高效率的想法演进,是最有贡献的地方。