Ross Cirshick针对R-CNN的改进
发表于2015年的ICCV
作者给出的代码:有python和C++语言,基于caffe,
工程地址 https://guthub.com/rbgirshick/fast-rcnn.
R-CNN的缺点:
1,是一个多级的pipeline,它有几个单独的流程:1,训练CNN;2训练SVM;3训练bbox。
2,训练太过耗费时间与空间(CNN训练好的特征都要保存在磁盘中给SVM用)
3,测试也很耗时
Fast R-CNN的贡献:
1,精度(mAP)提升.
2,训练是一个整体的流程,通过使用多任务的回归
3,不需要耗费磁盘空间保存特征
Fast R-CNN的结构:
此结构相对于传统DCNN的主要特点在于:
1,输入为一系列的图片与每张图片上的感兴趣区域ROI(其实这些ROI也是通过selective search)
2,将传统DCNN最后一个max-pooling层替换为ROI-pooling 层,即对Conv feature map中的感兴趣区域
逐一进行max-pooling(先归一化)。
3,将最后两层替换为两个并行的回归组合:一个是FC+softmax,负责分类;另一个是FC+bbox regresor,负责修正位置。
Fast R-CNN为什么能提速:
1,因为对于同一张图片上的所有ROI,它们使用的是同一个Conv feature map,因此大大节省了计算量和空间。
(RCNN中每一个ROI都要将整个卷积过程计算一遍)。
2,在detection过程中使用了SVD加速。
多任务损失
Fast R-CNN网络有两个同级输出层(cls score和bbox_prdict层),都是全连接层,称为multi-task。
① clsscore层:用于分类,输出k+1维数组p,表示属于k类和背景的概率。对每个RoI(Region of Interesting)输出离散型概率分布
通常,p由k+1类的全连接层利用softmax计算得出。
② bbox_prdict层:用于调整候选区域位置,输出bounding box回归的位移,输出4*K维数组t,表示分别属于k类时,应该平移缩放的参数。
k表示类别的索引,是指相对于objectproposal尺度不变的平移,是指对数空间中相对于objectproposal的高与宽。
loss_cls层评估分类损失函数。由真实分类u对应的概率决定:
loss_bbox评估检测框定位的损失函数。比较真实分类对应的预测平移缩放参数和
真实平移缩放参数为的差别:
其中,smooth L1损失函数为:
smooth L1损失函数曲线如下图9所示,作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞,使用L2必须要小心地设置学习率,防止遇到异常点发生梯度爆炸(RCNN中使用的是L2,我认为这是因为在RCNN中bbox是单独训练的,而在fast-rcnn中bbox的损失是总损失的一部分,如果这一部分反向传播的梯度特别大,会对分类部分造成影响)。
最后总损失为(两者加权和,如果分类为背景则不考虑定位损失):
规定u=0为背景类(也就是负标签),那么艾弗森括号指数函数[u≥1]表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作。λ控制分类损失和回归损失的平衡。Fast R-CNN论文中,所有实验λ=1。
艾弗森括号指数函数为: