本文记录的目的是方便自己学习和复习,有误之处请谅解,欢迎指出。
Fast R-CNN建立在R-CNN和SPP的工作基础之上,使用了多种创新方法提升检测速度和准确率。
1、首先基础卷积神经网络使用更优秀的CNN模型VGG16
2、不单独对候选区图像进行卷积,直接对整张图像卷积,避免重复卷积计算
3、不单独训练SVM分类器,使用Softmax
4、候选区坐标回归模型训练嵌入网络
5、将整个框架整合到一个网络中,进行端对端(end-to-end)的训练
一、基本流程
(1)使用选择性搜索(SS)为图像搜索候选框,与R-CNN一致
(2)输入图像至VGG16提取整个图像的 feature map,将原图候选框映射至对应 feature map
(3)通过ROI pooling,将候选框 feature map 转成需要的固定大小
(4)输出候选框的类别概率
(5)bounding box坐标修正
二、ROI pooling
ROI pooling解决了R-CNN重复卷积的工作,直接将候选区域坐标映射至 feature map对应区域,然后经过ROI后,不同大小尺寸的候选区输出得到固定大小feature map。怎么将不同尺寸的候选区转换为相同大小呢?下面具体介绍。
假设某个ROI pooling的大小为,我们需要输出的特征图尺度为,需要解决的问题是怎么划分原特征图区域得到。
1)输出特征图中的每一小块占原特征图多大区域?这里就需要计算,ROI pooling使用平均分块策略,每块大小为,除不尽怎么办,向下取整。
2)现在获得了每小块区域的大小,再进行最大池化。
具体例子:
假设:某层整图卷积特征图大小为,经过投影,将候选区区域投射至该层特征图后大小为,需要输出后大小变为。
某层整图卷积特征图
某候选区投影后,位置信息(左上角(0,3),右下角坐标(7,8)),大小为
开始计算输出特征图每小块占多大区域。平均每块大小为,,向下取整。第一块位置(0,0)大小,第二块位置(0,1)大小,第三块位置(1,0),第四块位置(1,1)。具体如下图
最后max pooling得到
三、多任务损失(分类损失与坐标回归损失)
R-CNN分类损失与回归损失是分开单独训练,Fast R-CNN将其一起整合至网络训练,进行加权组合训练多任务损失。分类损失和回归损失均有些许区别,后面介绍。具体公式如下:
R-CNN采用SVM二分类合页损失,Fast R-CNN为对数损失函数。表示分类损失,对于K+1类(包括背景),,。公式如下
回归损失与R-CNN基本一致,主要在外面改成一个平滑函数。公式如下
关于不做详细解释,R-CNN中有过讲解,其实就是回归候选框的偏移量和缩放量,使得预测框、候选框据离与真实框、候选框据离之间的差距尽可能小,让预测框与真实框更接近。
为什么增加一个平滑函数?主要为了限制梯度变化,当预测框与真实框差距较大时,梯度值不会过大。先看下L2与smooth L1的函数图像与导数形式
观察L2损失可以看到,当增大时,导数也随之增大。在训练初期,预测框与真实框差距过大时,导师梯度较大,训练不稳定。
观察smooth L1导数,在较小时,对的梯度也会变小,当很大时,对梯度绝对值上线为1,不至于破坏网络参数。
四、SVD全连接层加速
另外一个改进点是在全连接层,使用奇异值分解(SVD)加快计算。学过矩阵论的应该有所了解,SVD就是矩阵论中的重要知识点。公式,图解如下