Fast R-CNN 简单梳理

来源:互联网 发布:录音频的软件 编辑:程序博客网 时间:2024/05/21 10:32

Fast R-CNN 简单梳理

作者:xg123321123

出处:http://blog.csdn.net/xg123321123/article/details/53067518

声明:版权所有,转载请联系作者并注明出处

Fast R-CNN是R-CNN的改进版。

1 亮点

  • Fast R-CNN将整张整张图片归一化之后直接送入深度网络,邻接时才加入候选框信息,只有末尾的少数几层才处理每个候选框;相比之下,R-CNN框架中,一张图像内候选框之间大量重叠,需要重复地提取特征,耗时间。

  • Fast R-CNN把类别判断和位置精修统一到一个深度网络中,不需要额外存储;相比之下,RCNN中独立的分类器和回归器需要大量特征作为训练样本,耗空间。

2 大致流程

  • Selective Search在一张图片中得到约2k个候选框(这里称为RoI);
  • 使用卷积网络提取图片特征;
  • 在conv5出来的feature map上,根据之前RoI框crop出对应的patch(也就是所谓的映射回了原图),再用Rol pooling layer(好像也就是一个单层的SPP layer)来统一到一样的尺度;
  • 继续经过两个全连接层得到特征,然后分别经过一个新的全连接层,最后连接上各自的损失函数:
    • 一个是分类,使用softmax函数;
    • 一个是回归,使用smooth的L1-loss范式。
      这里写图片描述

3 RoI Pooling操作

做图片分类时,一般都是先将图片crop和resize到固定尺寸,然后输入网络,提取特征,最后进行分类。
对于检测来说,这个方法不太适合,因为原始图像如果缩小到224这种分辨率,那么感兴趣对象可能都会变的太小无法辨认。
而Fast R-CNN的数据输入并不对图片大小进行限制,实现这一点的关键所在,就是ROI Pooling层,它可以在任意大小的图片feature map上针对输入的每一个ROI区域提取出固定维度的特征表示,保证后续对每个区域的后续分类能够正常进行。

作用

  • 将原图中的RoI定位到feature map中对应的patch;
  • 将这个feature map中的patch下采样为大小固定的feature,方便传入后面的全连接层。

RoI Pooling层的测试(forward)

RoI Pooling层将每个候选区域均匀分成M×N块,对每块进行max pooling,这样一来将feature map上大小不一的候选区域转变为了大小统一的特征向量,然后送入下一层。
尽管ROI Pooling可以看做是针对ROI区域的feature map的Pooling操作,但因为不是固定尺寸的输入,因此每次的pooling网格大小得手动计算。
举例来说,某个ROI区域坐标为 (x1,y1,x2,y2) ,那么输入size为 (y2−y1)∗(x2−x1) ;如果pooling后输出的size为pooledheightpooledwidth ,那么每个网格的size为y2y1pooledheightx2x1pooledwidth
这里写图片描述

RoI Pooling层的训练(backward)

考虑普通max pooling层:设xi为输入层的节点,yj为输出层的节点。

Lxi=0,δ(i,j)=falseLyj,δ(i,j)=true

其中判决函数δ(i,j)表示i节点是否被j节点选为最大值输出。
不被选中有两种可能:xi不在yj范围内,或者xi不是最大值。

对于RoI max Pooling,一个输入节点可能和多个输出节点相连。
xi为输入层的节点,yrj为第r个候选区域的第j个输出节点。

Lxi=r,jδ(i,r,j)Lyrj

判决函数δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。
也就是说,代价对于xi的梯度等于所有相关的后一层梯度之和。

另外,实际实现时采用的是Max Pooling,具体每个网格中哪个点的值最大,在Forward过程中就已经记录,存储在了argmax_data变量里。
这里写图片描述

4 Regression操作

ROI Pooling层的横空出世,已经可以完成比较简陋的检测了。
先用Selective Search等proposal提取算法得到一批候选框坐标,然后输入网络对每个候选框包含的对象进行预测。
以上,神经网络仍然仅仅是图片分类的工具,只不过不是整图分类,而是ROI区域的分类。

如果能让神经网络完成回归的操作,那样不仅显得优雅,同时可能也会提升效果。

所以经过大神们的努力,有了回归层:输出为4*K维数组t,表示当属于K类时,应该平移缩放的参数,这是针对每个ROI区域坐标的偏移优化,tk=(tkx,tky,tkw,tkh)0kK是多类检测的类别序号。

假设对于类别k,在图片中标注了一个Ground Truth坐标:

t=(tx,ty,tw,th)

而预测值为
t=(tx,ty,tw,th)

这二者理论上越接近越好,这里定义损失函数:
Lloc(t,t)=ix,y,w,hsmoothL1(ti,ti)

其中

smoothL1(x)=(0.5x2,|x|1|x|0.5,|x|>1)

这里smoothL1(x)中的xtiti,即对应坐标的差距。
该函数在 (−1,1) 之间为二次函数,而其他区域为线性函数,据说这种形式可以增强模型对异常数据的鲁棒性,函数曲线如下。
这里写图片描述

注意
这里的回归操作和R-CNN里一样,也是只对特定的候选框(即和Ground Truth的IoU大于特定thresh)进行。

5 classification操作

不再像R-CNN需要通过SVM等分类器来分类,Fast R-CNN使用神经网络来进行分类操作:输出K+1维数组p,表示属于K类和背景的概率,这是针对每个ROI区域的分类概率预测,p=(p0,p1,,pK)

分类代价由真实分类u对应的概率决定,损失函数定义如下:

Lcls=log(pu)


本篇博客主要参考自

《Fast RCNN算法详解 》
《RCNN,Fast-RCNN,Faster-RCNN》
《RCNN, Fast-RCNN, Faster-RCNN的一些事》

1 0