前面我们学习了
这篇文章我们来介绍下Fast R-CNN.
Fast R-CNN是一种用于目标检测的快速的基于区域的卷积网络方法。它参考了SPP-Net的一些思想,对R-CNN算法进行了进一步的改进优化。
作者论文中提到,Fast R-CNN通过VGG16的训练结果,比R-CNN快9倍,比SPP-Net快3倍,测试时间上,比R-CNN快213倍,比SPP-Net快10倍,并且在PASCAL VOC上得到了更高的精度。
一、RCNN算法存在问题
首先,我们再次说明下R-CNN算法中的缺点
-
候选框选择算法严重耗时
-
对于每个候选框都需要输入到CNN网络中进行特征提取,存在大量重复操作,不能共享计算
-
训练过程是多级流水线。从而使一些步骤后的输出结果需要先写入磁盘,然后再作为下一步的输入,空间开销大
-
进行特征提取时需要固定输入图像尺寸,从而导致一些特征的丢失,改变。
上述问题使得R-CNN在训练时,时间和空间上的开销都很大,并且目标检测的速度也很慢。
二、Fast R-CNN的改进点
针对R-CNN的上述缺点,Fast R-CNN做了如下改进:
1、特征提取时的参数共享
2、引入ROI pooling层来提取固定长度的特征向量
3、将特征提取、目标分类与Bounding-box回归使用同一个CNN网络,采用多任务的方式来同时进行目标类别分类与窗口位置回归。从而实现了端到端的多任务训练(这块除过候选框的提取)
4、使用SVD对网络末尾中并行的全连接层进行分解,减少计算复杂度,提高检测速度
三、Fast R-CNN整体步骤
Fast R-CNN的整体框架如下图:
1、预训练CNN网络模型
和R-CNN一样,在ImageNet数据集上预训练CNN网络模型,作者训练了多个网络模型,这块我们使用VGG16模型。
2、候选区域提取
Fast R-CNN同样使用选择性搜索算法来提取出2000个候选框。具体如何提取,之前R-CNN中有介绍(【目标检测算法系列】一、R-CNN算法)
3、使用一个完整的CNN网络模型来进行特征提取,目标分类以及Bounding-box回归
相对于R-CNN使用流水线的模式, Fast R-CNN则使用了一个完整的CNN网络模型来进行特征提取,目标分类以及Bounding-box回归,从而实现了端到端的过程。具体模型内部流程图如下:
首先,看下这个CNN模型的构造,在VGG16的基础上,将卷积模块的最后一层最大池化层去掉,替换为一个ROI池化层。将原始VGG16网络最后一个全连接层与softmax层替换为两个同级层(全连接层和K+1个类别的softmax以及类别特定的Bounding-box回归)。
四、具体细节实现
接下来,看下具体实现细节:
-
首先,模型接收两个输入,原始图像与对应所有的候选框。先将原始图片经过多个卷积层和池化层后,提取出feature map。
-
通过映射关系,找到对应候选框在feature map中映射的区域。
-
将每一个候选框所对应的feature map经过ROI池化层提取出固定长度的特征向量。
我们这块看下ROI池化层的具体实现,ROI池化层,其实就是SPPNet中的空间金字塔池化层的简化版。在ROI池化层中,将输入的不同ROI(候选框所对应的feature map)划分为H*W的块,然后在每个块中使用最大池化层提取出一个特征,对应池化操作独立于每个feature map通道,最终输出H*W*c(c为通道数)的特征。将输入的特征转换为特征向量喂给后面的全连接层。(对于使用的VGG16为基础模型来说,这块H*W为7*7)
-
在进行全连接层时通过SVD分解来降低计算复杂度。
在图像分类任务中,主要的计算量是在卷积模块中,而在目标检测模块中,对于一张图片来说,特征提取只需要进行一次,但是需要针对每个候选框所对应的feature map,分别进行后续的全连接操作(2000次),从而导致近乎一半的前向计算时间被用于全连接层。所以Fast R-CNN中在进行全连接层时通过SVD分解来降低计算复杂度。具体如何操作?
设某个全连接层的参数为u*v的矩阵W,将W进行SVD分解,并用前t个特征值来近似代替,如下:
从而使计算复杂度变为u*t+v*t,如果t<min(u,v),则这种分解会减少计算量。这个实际意义,相当于把一个参数量比较大的全连接层拆分为两个参数量比较小的全连接层,如下图所示:
论文中作者通过实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作
5. 损失函数的构建
因为有目标分类和候选框回归两个同级任务,所以对应损失函数也应有分类任务的损失函数和回归任务的损失函数构成。
首先看分类任务,设 u 为真实的类别标签,u属于(0,1,...K),背景类别标签为0,为Softmax层对应的K+1个输出,为K+1个类别的预测概率。最终,分类任务的损失函数为:
再看下回归任务,回归任务的输出为
,预测的bounding box的中心位置,宽度,高度的转换值(和R-CNN相同),真实bounding box中心位置,宽度,高度的转换值(和R-CNN相同)。最终,回归任务的损失函数为:
smooth L1损失函数曲线如下图所示,相比于L2损失函数,其对离群点、异常值不敏感
所以最终Fast R-CNN的损失函数为:
约定u=0为背景分类,那么u>=1函数表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作; λ控制分类损失和回归损失的平衡,文中所有实验λ=1.
这就Fast R-CNN模型的整个流程,虽然,Fast R-CNN改进了R-CNN的一些问题,将检测速度和精度都得到和很大的提高,但是,Fast R-CNN中,还是有一个可以改进的地方,那就是候选框的提取这块,不管是R-CNN,SPP-Net,还是Fast R-CNN都是采用的传统的selective search算法,而selective search算法中因为用到图像分割和大量的贪心算法,导致候选框的提取很耗时,另外,因为候选框的提取是独立于CNN网络的一个模块,所以导致Fast R-CNN并不是真正意义上的端到端的训练模式。
所以,我们很自然的会想到,能不能将候选框的提取也加入到CNN网络中,使用一个CNN网络来进行候选框的提取,分类,以及回归操作,从而实现真正意义上的端到端的学习过程,这就是Faster R-CNN的思想,我们下次介绍。
欢迎关注我的个人公众号 AI计算机视觉工坊,本公众号不定期推送机器学习,深度学 习,计算机视觉等相关文章,欢迎大家和我一起学习,交流。