0. 引言
该系列之前的两篇文章分别介绍的R-CNN和SPPnet都具有非常明显的缺点。R-CNN首先通过selective search算法提取2000个proposals,然后对每个proposal分别使用CNN进行特征提取,因此其时间复杂度非常高。SPPnet解决了R-CNN的上述问题,但仍然无法做到端到端的训练,因此相对低效。
本文将要介绍的Fast R-CNN[1]的核心目标就是要解决R-CNN和SPPnet的上述问题。
1. Fast R-CNN
我们一步一步来对上图中Fast R-CNN的网络结构进行解释。
首先,Fast R-CNN仍需要使用proposal提取算法来对输入图像提前提取所有的proposals(例如,使用R-CNN中的selective search算法)。Fast R-CNN中将proposal称为ROI(Region Of Interest),但本质上无任何区别 。
然后,输入图像经过卷积网络得到feature map。理论上讲,卷积网络的选择可以是任意的。原文中使用的是AlexNet和VGG。因为得到的feature map尺寸(宽和高)比原始图像通常要小,因此需要将在原始图像上提取出的所有ROI映射至feature map上的对应位置。这在图中称为RoI projection。
接着,对于feature map上的每一个RoI,首先使用RoI pooling将其映射至固定长度的feature vector。RoI pooling是SPPnet中介绍的Spatial Pyramid Pooling的一个特例。详细方法可以参考上篇SPPnet的文章,这里简单介绍。RoI pooling将RoI(RoI是矩形区域)等分为k个网格(有些时候无法做到绝对等分,但采用近似等分的方法影响并不大),然后对每个网格使用max pooling取出一个值,拼接形成一个k维特征向量。如果feature map有n个通道,那么形成的特征向量是k*n维的(即RoI pooling是对每个通道单独使用的)。
最后,经RoI pooling得到的特征向量经过两层全连后,分别送入两个平行的分支,其中一个用于对该RoI中的目标进行分类;另一个用于对RoI的bounding box进行回归。
从上述分析可知,Fast R-CNN与SPPnet最大的区别是在最后一步使用了两个平行的分支来同时进行分类和回归操作。在训练阶段,网络使用两个分支的损失来共同训练。由两个分支共同构成的联合损失函数定义如下:
其中 p p p表示模型对RoI的分类结果, u u u表示分类的ground-truth。这里把 p p p和 u u u看作标签的index,从0开始编号至 n n