Fast R-CNN整体把握
RCNN很好地解决了目标检测分类和定位的问题。但是缺点是速度太慢。原因1:2k个候选区域都要经过变形成统一的正方形才能依次输入CNN进行特征提取。候选区域可能是互相包含的,这就导致原图同一个特征的重复提取。原因2:RCNN的分类和回归是分开的,耗费时间和空间。每个候选区域都要经过相同的CNN和分类+回归,复杂度与候选区域数量成正比。
Ross Girshick在15年推出Fast RCNN。同样使用最大规模的网络,FastRCNN和RCNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。
Fast-RCNN源码https://github.com/rbgirshick/fast-rcnn
针对问题1
改进思路是直接将原图送入CNN得到feature map,然后再加入候选框的信息,在feature map上得到候选区域映射的batch。这样就只对图像进行了一次卷积特征的计算,比RCNN提速100倍。但是虽然我们很快得到了候选区域的卷积特征,但是为了输入到后续的层,还是要求特征的维度一样(原来是要求输入的图像大小一样)。何恺明研究员在2014的论文中将空间金字塔池化Spatial Pyramid Pooling(SPP)结构引入了CNN,使CNN可以处理任意size和scale的图像。Fast-RCNN就使用了其中的SPPlayer。
如上图所示,在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整bin大小,三级bin的个数分别是1,4,16,而SPP的输出尺度始终是固定的,是1+4+16维。提取候选区特征和构建金字塔的过程都在ROI Pooling中完成。
为什么bin的个数之和就是输出的维度呢?因为这一层使用最大池化(max pooling)来将RoI区域转化成固定大小为HW的特征图。如下图,我们可以设定每个候选区域的分块数,但依然不能保证每一个bin内的大小是一样的,最大池化就可以简单理解成求块内最大值的过程,这样不管每一个bin是多大,最后都只输出1个值,最大值。
针对问题2
另外,之前RCNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast-RCNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。实际实验也证明,这两个任务能够共享卷积特征,并相互促进。
Reference:
1.http://shartoo.github.io/RCNN-series/
2.https://blog.****.net/shenxiaolu1984/article/details/51036677
3.https://www.cnblogs.com/skyfsm/p/6806246.html