微信公众号:AI那点小事 知乎专栏:AI那点小事 CSDN博客:https://daipuweiai.blog.csdn.net/ 作者:戴璞微 原文链接:https://zhuanlan.zhihu.com/p/78572627 https://daipuweiai.blog.csdn.net/article/details/99692210
又有一周没更新了,不知道进入研究生阶段写博客时间为什么这么上。上周四接到自己第一本书的三审意见需要进行修改。本想着慢慢修改的,结果上周五晚上接到通知北京印刷厂为迎国庆9月开始停业直至10月下旬。没办法必须为新书修改让路,像赶在8月末上式,虽然不知道能不能在8月末把书印出来。这也导致本应该周末整理完Fast R-CNN的笔记有拖了一周。
在2014年与人合作提出了效果惊人的R-CNN之后,Ross Girshick在2015年单枪匹马将R-CNN升级为Fast R-CNN,将分类与定位两大任务融入一个网络中来,获得了比R-CNN快的训练测试速度,将R-CNN的84小时的训练时间降低至9.5小时,测试时间从47秒将降低至0.32秒。并且性能相差无几,两者的mAP性能都稳定在66%-67%。
接下来,我们对Fast R-CNN进行详细解析,并与R-CNN进行对比。在这篇这篇笔记中,我们将从RoI池化层、多任务损失、小批量采样等方面进行详细讲解。
首先回归下R-CNN的整体框架:
显然R-CNN存在如下几个缺点:
那么做为R-CNN的改改进版本,Fast R-CNN吸取了SPPNet中的空间金字塔池化层对上述R-CNN的相关缺点进行改进。接下来我们对Fast R-CNN进行详细介绍。
其实RoI池化层并非Fast R-CNN首创,在Fast R-CNN提出之前,何恺明等人就在SPPNet这篇论文中提出了与RoI池化层类似的空间金字塔池化层,该层将任意大小的特征图首先分成16、4、1个块,然后在每个块上最大池化,池化后的特征拼接得到一个固定维度的输出。在Fast R-CNN中,将SPPNet中的空间金字塔池化层进行简化,将任意尺寸的特征图视为一整块进行最大池化,输出固定尺寸的推荐区域对应的特征图。
接下来我们来分析下RoI池化层反向传播。我们假设每个批次只有一张图像。假设
为第
个RoI池化层的激活输入,
为从第
个RoI在RoI池化层的第
个输出。那么RoI池化层的计算公式如下:
其中 ,
,
在最大池化层中各个子窗口的输入的下标集合。一个
可能映射出多个不同
。那么在反向传播过程中通过遵循argmax开关,损失函数相对于每个RoI池化层输入变量
的偏导数计算公式如下:
其中,
指示函数。其函数表达是如下:
换句话说,对于每个小批量RoI
和每个池化输出单元
,如果是通过最大池化选择出的最大的那个,那么偏导数
就会被积累。
从前文表述中可以看出,Fast R-CNN网络主要有两个网络分支,一个网络分支负责输出推荐区域的分类概率
共K+1个类别,其中
代表背景的分类概率。另一个网络分支负责输出每个推荐区域位置信息偏移
,其中
代表分类标签下标。
在训练过程中,每个训练RoI(推荐区域)都与一个真实框(ground truth)相对应,假设真实框类别为
,真实框位置信息
。那么Fast R-CNN的多任务损失函数定义如下:
其中,
,
是前文提到的指示函数,对于上述式
被定义成推荐区域预测位置其中偏移量与对应真实框的位置偏移量之间的损失。其定义式为:
相比于R-CNN中和SPPNet中提到的L2损失函数,在上述式中的
是一种对异常值更不敏感的鲁棒性的L1损失函数。当边界框回归目标无界时,利用L2损失函数进行训练必须谨慎微调学习率防止梯度爆炸。
也就是说L2损失函数对误差较大的样本惩罚较大,因此我们可以选用稍微缓和一点的L1损失函数进行替代,但是绝对值损失函数
是随着误差线性增长,不是平方增长,同时该函数在
处不可导,这显然也不利于网络的反向传播计算的连贯性,影响网络收敛。因此,常见的处理手段是使用分段函数进行平滑处理,使得
时能够平滑,并且可导,这就是使用
的原因。
在Fast R-CNN的微调阶段,每个小批量样本随机从训练集中抽取两张图片,之后从每张图片中抽取64个RoI即推荐区域,总共包含128个推荐区域。其中25%的推荐区域与真实框之间的IoU要大于等于0.5,这25%的样本属于前景。其余的75%,与真实框之间的IoU必须在
区间内,即这些样本属于背景。在训练区间,训练图像会以0.5的概率水平翻转。微调过程使用SGD优化Fast R-CNN的参数。
首先给出Fast R-CNN的模型架构图,如下图所示。
在这里插入图片描述从图1可以看出,Fast R-CNN的主要流程是首先仍然是利用选择性搜索获取图像中的推荐区域,之后将原始图片利用VGG16网络进行提取特征,之后把图像尺寸、推荐区域位置信息和特区得到的特征图送入RoI池化层,进而获取每个推荐区域对应的特征图。接着网络分成两个并行分支,一个对推荐区域进行分类,一个对推荐区域的位置信息做预测。 首先,Fast R-CNN使用VGG16网络作为基础特征提取网络,这是得益于VGG16网络是当时ImageNet竞赛亚军,特征提取能力比较强大。
接着,RoI池化层使得Fast R-CNN不需要像R-CNN在训练出测试时将所有推荐区域送入CNN中提取特征,而是利用CNN的尺度不变性,首先将原始图像送入CNN提取特征,然后将推荐区域尺寸及其位置信息、特征图及其尺寸与最终的固定的输出尺寸送入RoI池化层得到所有推荐区域对应的特征图,这样加快Fast R-CNN的训练和测试速度,减少大量重复计算。同时引入RoI池化层也是的无论输入特征图尺度如何,池化之后的特征图尺寸是固定的,这也使得Fast R-CNN的不受输入图像的限制。
最后,多任务损失帮助Fast R-CNN解决了R-CNN多阶段训练与权重无法共享的难题。Fast R-CNN采用多任务训练损失,利用softmax层代替R-CNN中的SVM分类来完成分类任务,定位任务还是使用边界框回归。但是与R-CNN不同的是,Fast R-CNN将两个任务融合到了一个网络,使得将分类和定位两个任务能够同时进行,不必项R-CNN一样分别处理,极大加快的训练和测试速度。同时,Fast R-CNN使得分类和定位两大任务能够共享特征提取网络的权重这,减少了内存开销。
在Fast R-CNN论文中,作者利用了SVD来分解全连接层的网络权重,使得网络权重维度降低,进而减小网络前向传播过程中矩阵乘法的时间复杂度,加快网络训练与测试。
下面也简单给SVD分解的具体公式。在网络中每层的权重 可以利用SVD分解近似表示成如下等式:
其中,
是前
大奇异值组成的对角矩阵,
为
对应前
个特征向量组成的左奇异向量组,维度为
,
为
前
个右奇异向量组,维度为
。当
时,截断SVD分解可以使得网络权重的维度从
下降至
。因此,利用SVD压缩网络使得一个全连接层被两个全连接层近似代替。第一个全连接层的网络权重为
,不需要加上偏置,第二个全连接层的网络权重为
,且使用原来全连接层的偏置。当RoI数量较多时,SVD分解压缩能够给Fast R-CNN带来较大的加速。
总体来看,Fast R-CNN解决了R-CNN存在的2个问题:
虽然Fast R-CNN解决R-CNN的两大缺点,加快的网络训练和测试速度,并且获得与R-CNN基本相当的检测性能,但是仍未解决如下几个问题: