部分博客内容引用:
https://alvinzhu.xyz/2017/10/10/fast-r-cnn/
https://blog.csdn.net/shenxiaolu1984/article/details/51036677
首先讲一下前作rcnn的缺点,有关rcnn,可以参考博客https://blog.csdn.net/zlrai5895/article/details/80724284。
rcnn缺点有三个:
- 训练过程是多级流水线。分为三个阶段训练:CNN的训练、SVM的训练、检测框回归线性模型的训练。
- 训练在时间和空间上是的开销很大。对于一张图像,图像和上面大量重叠的候选框都要经过CNN提取特征,并写入磁盘。时间和存储空间成本都很高。
- 目标检测速度很慢。原因同上。
fast rcnn的改善:
- 比R-CNN具有更高的目标检测精度(mAP)。rcnn在voc2012 map 62%,fast rcnn 在voc2012 map 66%
- 训练是使用多任务损失的单阶段训练。
- 训练可以更新所有网络层参数。
- 不需要磁盘空间缓存特征。
网络结构:
输入完整图像
|
CNN(VGG等)
|
最后一个最大池化层替换为ROI池化层(在特征图上提取候选区域,每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。 )
|
-------------------------------
| |
全连接层 输出k个类别加上1个 全连接层输出
K个类别的每一 背景类别的Softmax概率估计 每组4个值,表示检测框位置的修正检测框位置的修正。
训练:
首先是预训练
网络除去末尾部分如下图,在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。
然后是微调
如上面所说,用ROI替换最后的pool,然后,网络的最后一格全连接层和Softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(全连接层和K+1个类别的Softmax以及类别特定的检测框回归)。
微调策略
每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128。
训练数据构成
N张完整图片以50%概率水平翻转。
R个候选框的构成方式如下:
类别 | 比例 | 方式 |
---|---|---|
前景 | 25% | 与某个真值重叠在[0.5,1]的候选框 |
背景 | 75% | 与真值重叠的最大值在[0.1,0.5)的候选框 |
训练时候的损失函数:
loss_cls层评估分类代价。由真实分类uu对应的概率决定:
Lcls=−logpu
loss_bbox评估检测框定位代价。比较真实分类对应的预测参数tutu和真实平移缩放参数为vv的差别:
Lloc=Σ4i=1g(tui−vi)
g为Smooth L1误差,对outlier不敏感:
g(x)={0.5x2|x|−0.5|x|<1otherwise
总代价为两者加权和,如果分类为背景则不考虑定位代价:
L={Lcls+λLlocLclsu为前景u为背景
计算全连接层的加速策略:
分类和位置调整都是通过全连接层(fc)实现的,设前一级数据为xx后一级为yy,全连接层参数为WW,尺寸u×vu×v。一次前向传播(forward)即为:
y=Wx
计算复杂度为u×v。
将WW进行SVD分解,并用前t个特征值近似:
W=UΣVT≈U(:,1:t)⋅Σ(1:t,1:t)⋅V(:,1:t)T
原来的前向传播分解成两步:
y=Wx=U⋅(Σ⋅VT)⋅x=U⋅z
计算复杂度变为u×t+v×t。
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。