前言
fast-RCNN是建立在前面的RCNN和SPPNet的基础之上的,虽然RCNN和SPPNet使得深度神经网络在目标检测领域有了一些新的技术突破,但是还远远没有达到真正的实时检测、端到端的出结果的程度,于是诞生了fast-RCNN,虽然在目前,已经明确有说明fast-RCNN是deprecate(贬低,贬损)的,但是从它里面所诞生的一些创新方法为后面的目标检测算法建立了一个很好的基础。小草收集了大量文献,整理了fast-RCNN的四大核心点。
由于region proposal的尺度各不相同,而期望提取出来的特征向量维度相同,因此需要某种特殊的技术来做保证。ROIPooling的提出便是为了解决这一问题的。其思路如下:
(1)将region proposal划分为H×W大小的网格;
(2)对每一个网格做MaxPooling(即每一个网格对应一个输出值);
(3)将所有输出值组合起来便形成固定大小为H×W的feature map;
ROI Pooling层其实是SPP金字塔层的一个特例,可以说是一个浓缩版的SPP目的同样是为了兼容不同的输入尺寸,得到统一的输出,但是不同的是他不想金字塔层那样堆叠出多层金字塔,后续证明了“使用多尺度的金字塔堆叠,性能几乎没有提高”。
备注:如果不明白什么是SPP空间金字塔模型,可以参考我的另一篇文章:
02 全连接层的改进(SVD奇异值分解)
图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多【约2k个】,几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次【每个建议框都要计算】,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算,在使用SVD之前,计算复杂度为uxv,(这里u,v指的是全连接层的矩阵行和列),而在使用了SVD奇异值分解之后,计算复杂度为u×t+v×t,若t<min(u,v),则这种分解会大大减少计算量;
在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。
image
由于卷积层计算针对的是一整张图片,而全连接层需要对每一个region proposal都作用一次,所以全连接层的计算占网络计算的将近一半(如下图)。作者采用SVD来简化全连接层计算。
从上面的结论可知,在只牺牲了mAP值0.3%的前提下,运算速度却提升了三分之一,这是非常高效的。
备注:如果看不懂什么是奇异值分解,可以参考这篇文章:
https://blog.csdn.net/u013108511/article/details/79016939
03 多任务损失函数的拼接
在fast-RCNN之前的RCNN和SPPNet都不是端到端的训练,因为最后的类别分类和边框回归是分开进行的,而fast-RCNN做出了一系列的改进。
fast-RCNN的一般模型为:
将后面的全连接层放大之后为:
cls_score层用于分类,输出K+1维数组p,表示属于K类和背景的概率。
bbox_prdict层用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数。
代价函数
(1)loss_cls层评估分类代价,即为交叉熵损失函数,用L_class表示
(2)loss_bbox评估检测框定位代价。比较真实分类对应的预测的平移缩放参数t和真实平移缩放参数为v的差别:
但是fast-RCNN并不是直接使用的这个L_Loc损失,而是使用的smooth_L1损失函数,如果不清楚这个损失函数什么意思,或者是有什么优点,可以参见我的另一片文章:
备注:
所以有:
Smooth_L1误差,对outlier不敏感,而smooth_L1的定义如下:
总代价Loss为两者加权和,如果分类为背景则不考虑定位代价:
04 图像中心化采样(image central sampling)
(1)R-CNN和SPPnet中采用RoI-centric sampling
从所有图片的所有候选区域中均匀取样,这样每个SGD的mini-batch中包含了不同图像的样本,不同图像之间不能共享卷积计算和内存,运算开销大。
(2)Fast R-CNN中采用image-centric sampling
mini-batch采用层次采样,即先对图像采样【N个】,再在采样到的图像中对候选区域采样【每个图像中采样R/N个,一个mini-batch共计R个候选区域样本】,同一图像的候选区域卷积共享计算和内存,降低了运算开销。
image-centric sampling方式采样的候选区域来自于同一图像,相互之间存在相关性,可能会减慢训练收敛的速度,但是作者在实际实验中并没有出现这样的担忧,反而使用N=2,R=128的image-centric sampling方式比R-CNN收敛更快。
补充:
这里解释一下为什么SPPnet不能更新spatial pyramid pooling层前面的卷积层,而只能更新后面的全连接层? 一种说法解释卷积特征是线下计算的,从而无法在微调阶段反向传播误差;另一种解释是,反向传播需要计算每一个RoI感受野的卷积层梯度,通常所有RoI会覆盖整个图像,如果用RoI-centric sampling方式会由于计算too much整幅图像梯度而变得又慢又耗内存。
05 fast-RCNN的优缺点
(1)优点
如上所示的几点改进措施。Fast R-CNN融合了R-CNN和SPP-NET的精髓,并且引入多任务损失函数,使整个网络的训练和测试变得十分方便。在Pascal VOC2007训练集上训练,在VOC2007测试的结果为66.9%(mAP),如果使用VOC2007+2012训练集训练,在VOC2007上测试结果为70%(数据集的扩充能大幅提高目标检测性能)。使用VGG16每张图像总共需要3s左右。
(2)缺点
RP的提取很耗时。region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),无法满足实时应用;
伪端到端。而且并没有实现真正意义上的端到端训练测试(region proposal使用selective search先提取处来)。那么有没有可能直接使用CNN直接产生region proposal并对其分类?Faster R-CNN框架就是符合这样需要的目标检测框架。
06 fast-RCNN的基本结论
实验过程不再详述,只记录结论
- 网络末端同步训练的分类和位置调整,提升准确度
- 使用多尺度的图像金字塔,性能几乎没有提高
- 倍增训练数据,能够有2%-3%的准确度提升
- 网络直接输出各类概率(softmax),比SVM分类器性能略好
- 更多候选窗不能提升性能
另外,
同年作者团队又推出了Faster RCNN,进一步把检测速度提高到准实时。
本文分享自 机器学习与python集中营 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!