1.概述
- fast RCNN基于RCNN,对RCNN存在的问题进行了改进,同时借鉴了SPPnet的思想。
2.RCNN存在的问题
- RCNN的训练过程是multi-stage。先预训练,再finetune,还要训练用于完成特征向量分类的若干个SVM,也要单独训练边框回归
- 训练时时间开销和空间开销都很大
- 目标检测过程很慢(每张图片需要47秒)
3.SPPnet
- RCNN训练效率低的原因是,对每张图片生成的每个proposal,都使用卷积神经网络提取特征向量,在计算过程中,存在大量冗余
- 相比于RCNN,SPPnet对每个输入图像,只进行一次卷积计算,得到feature maps(最后一个卷积层的输出)。对原输入图像应用selective search算法,得到若干个proposal,每个proposal在得到的feature maps上都有个对应区域,将该对应区域送入后面的全连接层,最终得到该proposal的分类结果。这种过程实现了computation sharing,因而速度很快。
- SPPnet网络中最重要的结构为空间金字塔池化(spatial pyramid pooling),通过这种结构,使得SPPnet对任意尺寸的输入图像,都能生成一个确定大小的一维向量。然而,这种结构的缺点是没有利用feature map的空间信息,因为它将feature map通过池化操作直接拉成了一个一维向量。
- SPPnet的训练也是multi-stage的(①提取特征、fine tune网络②训练SVM③训练边界回归器),也占用大量存储空间。另外一个重要的缺点是,在训练阶段,SPPnet无法有效更新空间金字塔池化层之前的卷积层的参数,这意味着SPPnet的网络不能太深
注1:对上述加黑处存在疑问,为什么SPPnet在训练时无法更新空间金字塔池化之前的卷积层的参数?
- proposal与feature maps上的对应关系可参见
http://keep.01ue.com/?pi=329213&_a=app&_c=index&_m=p
基于上述RCNN和SPPnet的优缺点,作者提出了fast RCNN网络
4.fast RCNN
(1)贡献
- 相比RCNN和SPPnet,更高的检测准确率
- 通过使用multi-task loss,完成single-stage的训练过程
- 相比SPPnet,训练时可更新网络的所有参数
- 占用存储资源小
(2)网络结构
- 网络结构借鉴了SPPnet的思想,通过卷积神经网络,得到输入图像对应的feature map,对proposal对应于feature map上的区域,应用RoI pooling layer,得到该proposal对应的feature map
- 将得到的feature map作为全连接层的输入,经过两层全连接层,得到对应的RoI feature vector,使用该vector同时训练分类器和边界回归器
(3)RoI pooling layer
- 该层将proposal对应的feature map进行池化,生成特定尺寸的feature map
- 其池化方式非常简单,对[CxWxH]尺寸的输入feature map,在每一层上画[AxB]个网格,在每个网格中取最大值,最终得到[CxAxB]的feature map
(4)网络的预训练
- 作者在三个不同规模的卷积神经网络上进行实验,这三个卷积神经网络都经过ImageNet的预训练
- 作者对这三个卷积神经网络进行了如下的更改:①将第一层全连接层前的max pooling layer替换为RoI pooling layer,池化预先规定为适配于后面全连接层的尺寸(对VGG16,H=W=7)②去掉输出层,新添加两个分支,分别完成K+1的分类和边界框的回归③修改网络输入,可以输入图片和对应的RoI列表(proposal列表)
(5)网络的fine-tuning
- RCNN和SPPnet的fine tuning策略都是每个batch中的proposal(不论是positive proposal还是negative proposal)均来自不同的图像,作者认为这种训练策略效率非常低(个人理解:考虑线性回归,当样本数据已经近似服从线性变化时,参数的一点点改变都会让loss立刻减小,若样本数据分布杂乱时,参数的变化并不会让loss立刻减小。对RCNN和SPPnet的训练过程也是一样,当每个batch的每个proposal都来自不同的image时,输入数据非常杂乱,因此训练时收敛很慢)
注2:作者在文章开始时说SPPnet在训练时无法更新空间金字塔池化层之前的卷积神经网络的参数,此处又说训练SPPnet时参数更新效率很低。个人认为,作者想要表达的意思是:RCNN和SPPnet采用了相同fine tuning策略,这种策略带来的影响是训练效率极低,但是就这二者的训练效率而言,SPPnet比RCNN低的多。
- 为了解决fine tuning时训练效率非常低的问题,作者在fast RCNN中采取了下述训练策略:每个batch中包含R个proposal,这R个proposal来自N个图像(每个图像产生R/N个proposal),来自同一图像的proposal共享计算资源和存储
注3:对上述加粗字体有疑问,要如何共享计算资源和存储?作者又说,这种fine tuning的训练策略,会导致loss收敛变慢,但是实际中并未出现这样的问题,令人费解……
- loss function如下: 其中,(1)式第一项为分类损失,第二项为边框回归损失;参数lamda表示权重,实验时其值取为1,[u>=1]表示只计算非背景的proposal
- 训练时,每个batch包含分别从两张图片中取得的128个proposal,这其中有25%的positive proposal(与ground truth的IoU大于0.5),剩下的75%为negative proposal(IoU大于0.1小于0.5),数据增强为proposal随机翻转180度
- RoI layer的反向传播 这里,x_i代表池化前特征图上的像素点;y_rj代表池化后的第r个候选区域的第j个点;i*(r,j)代表点yrj像素值的来源(最大池化的时候选出的最大像素值所在点的坐标)。由上式可以看出,只有当池化后某一个点的像素值在池化过程中采用了当前点Xi的像素值(即满足i=i*(r,j)),才在xi处回传梯度。
注4:参考连接:https://www.jianshu.com/p/2a5ffca8b861
注5:至于上述公式里为何对梯度进行累加操作,这是由网络的训练方式决定的,该网络采用mini-batch训练方式,每个batch训练结束后才反向传播并更新一次参数。反向传播时,需要计算出池化前的特征图上每个像素点处的梯度。若像素点x_i前向传播时通过池化传递至y_rj,则反向传播时将对应位置的梯度直接传回。x_i可能传递至多个不同的y_rj,对其进行累加。对没有传递至后面的像素点,其反向传播时得到的梯度为零
神经网络的不同训练方式区别(batch,iteration,epoch)请参见:https://blog.csdn.net/qq_18668137/article/details/80883350
反向传播算法讲解(斯坦福大学cs231n课程):https://www.bilibili.com/video/av19161412?from=search&seid=6452011326295692786
5.实验
- fast RCNN在不同数据集上与其他算法的对比
- fast RCNN与RCNN、SPPnet在训练时间和测试时间上的对比
- fast RCNN在全连接层采用了奇异值分解,作者验证了奇异值分解的有效性
- SPPnet作者认为,仅对SPPnet的全连接层进行fine tuning就已经可以取得很好的效果了,无需fine tuning卷积层,fast RCNN作者认为,对于较深的网络,fine tuning卷积层依旧有效,并进行了验证
- fast RCNN在训练时采用了多任务学习的方式,作者验证了该种学习方式的有效性
- 赋予网络尺度不变性的方法有两种,一种是将输入图像调整成相似的大小,一种是选用不同尺度的输入图像,作者分别对这两种方法进行了实验,结果表明,仅仅采用前者,就可以达到很好的效果
- 作者认可一个观点:对于一个优秀的目标检测器,随着样本数量的增加,其性能也应该增加,作者针对这个问题,在fast RCNN上进行了相关实验
- 常见分类器有SVM,softmax,作者对这两个分类器分别进行了实验,实验显示,softmax性能更好