论文链接:https://arxiv.org/abs/1504.08083
Fast R-CNN是RBG大神于2015年发表的目标检测网络,其在SPP-Net的基础上,通过进一步的改进,使得目标检测精度以及检测速度有了进一步的提升,下面详细介绍Fast R-CNN的创新点。
fast r-cnn网络的roi-pooling没有选择与spp-net相同的多级金字塔式的池化,而是选择了单级固定大小的池化,作者也通过实验证明,其实选择多级金字塔池化对精度会有一定的提升,但是影响不大,但是会降低速度,所以有点鸡肋。
为什么SPP-Net没有训练全网络,而只是训练了roi-pooling后面的网络呢?
作者给的解释如下:(此处有些没有看懂,为啥感受野大就效率低?)
The root cause is that back-propagation through the SPP layer is highly inefficient when each training sample (i.e.RoI) comes from a different image, which is exactly how R-CNN and SPPnet networks are trained. The inefficiency stems from the fact that each RoI may have a very large receptive field, often spanning the entire input image. Since the forward pass must process the entire receptive field, the training inputs are large (often the entire image).
Fast R-CNN给的方法如下:
作者采用分层SGD训练的方法,默认每次选取2张图像,并在每张图像选取64个roi进行训练
作者说,这种方法有可能导致不收敛,但是实验证明并没有发生不收敛的现象。
Fast R-CNN含有两个输出层,分别用于计算分类结果以及计算检测框的坐标结果。第一个输出层通过softmax计算相应ROI在各个类别中的概率。第二个输出层计算相应ROI的检测框的坐标值。算法采用多任务的损失函数对每个标定的ROI的类型和检测框坐标进行回归计算,损失函数公式如下。其中 Lcls L c l s 用于计算分类概率损失的函数,是一个softmax损失函数, Lloc L l o c 是检测框坐标的损失函数, 定义如下:
简单来说,就是对于每一个mini-batch的ROI区域,如果对应的点被选中为最大值,则对其导数进行累加,得到反向传播的梯度:
In words, for each mini-batch RoI r and for each pooling output unit yrj, the partial derivative ∂L/∂yrj is accumulated if i is the argmax selected for yrj by max pooling.
作者提到,在进行前向传播中,将近一半的时间在全连接层,所以如果可以在此进行加速,将对整个网络的速度提升有较大帮助,因此作者提出可以利用奇异值分解。
看图最清晰了。
作者通过实验证明,训练CNN网络的时候,前面几层训练带来的精度提升不明显,说明前面提取的特征如:边缘等比较固定有效,对于后面几层的训练对于精度提升比较明显。
对于越深的网络越需要训练。