(faster-rcnn原理)
R-CNN
(1)输入测试图像;
(2)利用selective search 算法在图像中从上到下提取2000个左右的Region Proposal(候选区域);
(3)将每个Region Proposal缩放(warp)成227*227的大小并输入到CNN,将CNN的fc7层的输出作为特征;
(4)将每个Region Proposal提取的CNN特征输入到SVM进行分类;
(5)对于SVM分好类的Region Proposal做边框回归,用Bounding box回归值校正原来的建议窗口,生成预测窗口坐标.
faster-rcnn学习理解
缺陷:
(1) 训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;
(2) 训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;
(3) 速度慢:使用GPU,VGG16模型处理一张图像需要47s;
(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算;
(5) SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.
FAST-RCNN
(1)输入测试图像;
(2)利用selective search 算法在图像中从上到下提取2000个左右的建议窗口(Region Proposal);
(3)将整张图片输入CNN,进行特征提取;
(4)把建议窗口映射到CNN的最后一层卷积feature map上;
(5)通过RoI pooling层使每个建议窗口生成固定尺寸的feature map;
(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.
faster-rcnn学习理解
相比R-CNN,主要两处不同:
(1)最后一层卷积层后加了一个ROI pooling layer;
(2)损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练
改进:
(1) 测试时速度慢:R-CNN把一张图像分解成大量的建议框,每个建议框拉伸形成的图像都会单独通过CNN提取特征.实际上这些建议框之间大量重叠,特征值之间完全可以共享,造成了运算能力的浪费.
FAST-RCNN将整张图像归一化后直接送入CNN,在最后的卷积层输出的feature map上,加入建议框信息,使得在此之前的CNN运算得以共享.
(2)训练时速度慢:R-CNN在训练时,是在采用SVM分类之前,把通过CNN提取的特征存储在硬盘上.这种方法造成了训练性能低下,因为在硬盘上大量的读写数据会造成训练速度缓慢.
FAST-RCNN在训练时,只需要将一张图像送入网络,每张图像一次性地提取CNN特征和建议区域,训练数据在GPU内存里直接进Loss层,这样候选区域的前几层特征不需要再重复计算且不再需要把大量数据存储在硬盘上.
(3)训练所需空间大:R-CNN中独立的SVM分类器和回归器需要大量特征作为训练样本,需要大量的硬盘空间.FAST-RCNN把类别判断和位置回归统一用深度网络实现,不再需要额外存储.
FASTER -RCNN
(1)输入测试图像,将整张图片输入CNN,进行特征提取,得到特征图;
(2)用RPN生成候选框(proposals),每张图片生成300个候选框,把候选框映射到CNN的最后一层卷积feature map上;
(3)通过RoI pooling层使每个RoI生成固定尺寸的feature map;利用Softmax Loss(探测分类概率)和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.
RPN + FAST-RCNN
相比FAST-RCNN,主要两处不同:
(1)使用RPN(Region Proposal Network)代替原来的Selective Search方法产生候选框
(2)产生候选框的CNN和目标检测的CNN共享

一、RPN

1.框架结构
ZF:256 channel VGG16:512
faster-rcnn学习理解
Sliding window:33
步骤:
第一步:输入:256
wh的特征图 卷积大小:33 卷积核个数:256 zero-padding:1 stride:1 输出:256wh的特征图
第二步:A:输入:256wh的特征图 卷积大小:11 卷积核个数:2k stride;1 输出:2kwh
B: 输入:256
wh的特征图 卷积大小:11 卷积核个数:4k stride;1 输出:4kwh
结果:
reg-layer:用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h;(对应原图)
cls-layer:用于判定该proposal是前景还是背景.sliding window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间.事实上,作者用全连接层实现方式介绍RPN层实现容易帮助我们理解这一过程,但在实现时作者选用了卷积层实现全连接层的功能.

2.Anchor box
faster-rcnn学习理解
Anchors:字面上可以理解为锚点,位于之前提到的nn的sliding window的中心处。对于一个sliding window,我们可以同时预测多个proposal,假定有k个,那么就有k个proposal,k个anchor box。.对于一幅WH的feature map,对应WHk个锚点。3种尺度和3种比例确定出当前sliding window(每个位置)处对应的9个reference boxes。所有的锚点都具有尺度不变性。
Anchor box 的中心坐标指的是对应原图的坐标:
x = x_fearure*(原图宽/特征图宽)
y = y_feature*(原图高/特征图高)
faster-rcnn学习理解
3.A Loss Function for Learning Region Proposals
softmax-loss:
softmax的输出向量是该样本属于各个类的概率。
softmax 计算公式:
faster-rcnn学习理解

L是损失。yj前面有个求和符号,j的范围也是1到类别数T,因此y是一个1*T的向量,里面的T个值,而且只有1个值是1,其他T-1个值都是0。真实标签对应的位置的那个值是1,其他都是0。根据公式可以看出,预测错的损失比预测对的损失要大,损失减小即预测越接近正确。
IOU:
faster-rcnn学习理解
Bounding-box regression
(1)为什么要做bouding box regression?
faster-rcnn学习理解
如上图所示,绿色的框为飞机的Ground Truth,红色的框是提取的Region Proposal.那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5),那么这张图相当于没有正确的检测出飞机。如果我们能对红色的框进行微调,使得经过微调后的窗口跟Ground Truth更接近,这样岂不是定位会更准确。Bounding-box regression 就是用来微调这个窗口的。
(2)Bounding box regression:
对于窗口一般使用四维向量(x,y,w,h) 来表示,分别表示窗口的中心点坐标和宽高。下图中红色的框P代表原始的Proposal,绿色的框G代表目标的 Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口P经过映射得到一个跟真实窗口 G 更接近的回归窗口G。边框回归的目的是:给定(Px,Py,Pw,Ph)寻找一种映射f,使得f(Px,Py,Pw,Ph)=(Gx,Gy,Gw,Gh),(Gx,Gy,Gw,Gh^)≈(Gx,Gy,Gw,Gh)
faster-rcnn学习理解
(3)实现:平移+尺度放缩
faster-rcnn学习理解

从上面4个公式可以看出,我们需要学习这4个变换。
Bounding box的输入是什么?
faster-rcnn学习理解
faster-rcnn学习理解
Loss Function
在计算Loss值之前,作者设置了anchors的标定方法.正样本标定规则:

  1. 如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;
  2. 如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本.事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与groud truth的IoU不大于0.7,可以采用第一种规则生成.
  3. 负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本.
  4. 剩下的既不是正样本也不是负样本,不用于最终训练.
  5. 训练RPN的Loss是有classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重组成的.计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:
    i. 预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;
    ii. 锚点reference box:之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a;
    iii. ground truth:标定的框也对应一个中心点位置坐标x*,y和宽高w,h*.因此计算regression loss和总Loss方式如下:
    faster-rcnn学习理解
    faster-rcnn学习理解
    faster-rcnn学习理解
    i是一个小批量锚的索引,pi是锚i作为对象的预测概率。如果锚定为正,则地面真值标签pi为1;如果锚定为负,则地面真值标签pi为0。ti是表示预测边界框的4个参数化坐标的向量,ti是与正锚关联的地面真值框的向量。对于回归损失,使用Lreg(t i,ti)=R(ti-ti),其中R是鲁棒损失函数(平滑L1)。piLreg是指回归损失仅对正锚(pi=1)**,否则禁用(pi=0)。
    4.RPN训练设置:
    (1)在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1.
    (2)如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然.
    (3)训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化.
    5.RPN总结
    对于一张10006003的图像,大约有60409(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。anchor box 通过RPN训练逐步调整成为候选框。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IOU设为0.7,这样每张图片只剩2k个候选框。

二、Fast-RCNN

1.Conv layer
在input-data层时,作者把原图都reshape成M×N大小的图片。conv layer中包含了conv、 relu、 pooling三种层,就VGG16而言,就有13个conv层,13个relu层,4个pooling层。在conv layer中:
(1)所有的conv层都是kernel_size=3,pad=1
(2)所有的pooling层都是kernel_size=2,stride=2
faster-rcnn学习理解
在整个Conv layers中,conv和relu层不改变输入输出大小,pooling层kernel_size=2,stride=2,使输出长宽都变为输入的1/2。那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)。这样Conv layers生成的featuure map中都可以和原图对应起来。
2.RoI pooling
为什么要做ROI POOLING处理?
对于传统的CNN(如alexnxt,VGG),当网络训练好后输入的图像尺寸必须是固定的,同时网络输出也是固定大小的vctor 或matrix。因此,需要对输入的候选框做ROI POOLING 处理,从而能够适应网络。
ROI Pooling layerl forward过程:
[1]由RPN得到的候选框的大小是不同的,首先将其映射回(M/16)x(N/16)大小的feature map尺度;
[2]将每个proposal水平方向和竖直方向都分成7份,对每一份都进行max pooling处理,这样处理后,即使大小不同的proposal,输出的结果都是77大小的,实现了fixed-length output(固定长度输出)。
faster-rcnn学习理解
3.Classification
classification部分利用已经获得的proposal featuer map,通过全连接层与softmax计算每个proposal具体属于哪个类别(如车,人等),输出cls_prob概率向量;同时再次利用Bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。classification部分网络结构如下:
faster-rcnn学习理解
从RIO Pooling获取到7
7=49大小的proposal feature maps后,送入后续的网络,可以看到做了如下2件事:
1:通过全连接层和softmax对候选框进行分类
2:再次对proposals进行bounding box regression,获取更高精度的目标检测框。

相关文章: