Faster-RCNN的原理及演变

由于在2017年第一次接触到faster-rcnn模型到在已经有2年多时间,准备今天稍微回忆总结下。首先分别介绍一下faster-rcnn演变历史以及其具体原理。其运行速度为GPU上的帧率为5fps。

Faster-RCNN演变历史


我们按照RCNN -> Fast RCNN -> SPP net -> Faster RCNN流程来回顾和总结其演变历史

1. RCNN(Region-CNN)

Faster-RCNN的原理及演变_第1张图片
RCNN.png
1.1 步骤

这里进行训练方式分成以下3个步骤:

|
Faster-RCNN的原理及演变_第2张图片
步骤1

Faster-RCNN的原理及演变_第3张图片
步骤2

Faster-RCNN的原理及演变_第4张图片
步骤3

Faster-RCNN的原理及演变_第5张图片
步骤4

Faster-RCNN的原理及演变_第6张图片
步骤5
步骤 示例
一、 训练(或者下载)一个分类模型(比如AlexNet) 步骤1
二、对该模型做fine-tuning: 1. 将分类数从1000改为20  2. 去掉最后一个全连接层 步骤2
三、特征提取 1. 提取图像的所有候选框(选择性搜索) 利用选择性搜索(利用图像中的纹理、边缘、颜色等信息)或者EdgeBoxes在输入图像中选取ROI(regions of Interest)即候选框,这些框之间是可以互相重叠互相包含的,比如选取2000个候选框,避免暴力枚举所有框。 2. 对于每一个区域:修正区域大小(因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的大小)以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘 步骤3
四、训练一个SVM分类器(二分类)来判断这个候选框里物体的类别每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative 比如右图,就是狗分类的SVM 步骤4
五、使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。 步骤5
1.2 缺点:
  1. 利用selective search 提取候选框都是在CPU上进行,速度是比较慢。并且得到2000左右的候选框在进行CNN+SVM分类计算量大速度慢,一张图达到47秒。

  2. 卷积核没有共享。即在每个框之间很难通过权重信息共享。所以计算量依然很大,其中有不少其实是重复计算

  3. 通过warped对选取出来的图像统一大小对信息也是一种失真。

  4. 训练耗时,占用磁盘空间大:卷积出来的特征数据还需要单独保存

2. SPP Net(Spatial Pyramid Pooling空间金字塔池化)

SPP Net其实就是在RCNN中CNN网络的卷积层和全连接层之间加上了ROI池化操作。
因为我们知道卷积层不需要固定固定输入,而全连接是需要固定输入。这就要求对输入数据crop或warp等操作使网络输入大小固定,RCNN利用这些操作在进行图片分类。

那我们ROI pooling是如何操作的呢?我们可以通过如下图来理解。
Faster-RCNN的原理及演变_第7张图片
ROI polling
2.1 SPP 网络特点
  1. 从中可以看出无论卷积层输出大小是多少,SPP layer中每一个pooling的filter 会更具输入调整大小。所以SPP的输出始终是固定大小的。
  2. 在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。如上图,SPP使用空间金字塔采样(spatial pyramid pooling)将每个window划分为的块,然后每个块使用max-pooling下采样,这样对于每个window经过SPP层之后都得到了一个长度为维度的特征向量,将这个作为全连接层的输入进行后续操作。SPP针对同一个输入使用了多个不同尺寸的池化操作,把不同尺度的结果拼接作为输出;而ROI Pooling可看作单尺度的SPP,对于一个输入只进行一次池化操作。(具体理解可以结合这篇文章一文读懂Faster RCNN文字描述的很清楚)
    Faster-RCNN的原理及演变_第8张图片
    image.png
  3. 我们知道RCNN中显示对每一个候选框resize统一大小再进行CNN得到统一大小的feature map。这种效率很低。所以SPP net就是将原图进行卷积操作得到feature map, 之后找到候选框在feature map映射的patch(可以形象理解为不同候选框在feature map上的表达,这里可以理解为通过特征图上的感受野找到原始图像对应的特征框),之后将词patch作为每个候选框的特征输入到SPP layter之后的层。节省时间,比RCNN快100倍左右。我们可以通过下面的图看出SPPnet的改进思路。


    Faster-RCNN的原理及演变_第9张图片
    SPP net

2.2 SPP网络的优缺点

优点 缺点
实现CNN多尺度输入, 使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的速度瓶颈
只对原图提取一次卷积特征,提升速度(共享卷积),

3. Fast RCNN

Faster-RCNN的原理及演变_第10张图片
Fast RCNN

说到Fast RCNN 其实就是在SPP Net基础上稍微有两点进行了修改。

  • 用softmax替代SVM分类
  • 同时利用Multi-task Loss(多任务损失函数)将边框回归和分类一起进行如下图所示。


    Faster-RCNN的原理及演变_第11张图片
3.1 步骤
Faster-RCNN的原理及演变_第12张图片
Fast-RCNN流程图

好了我们总结下Fast RCNN的步骤吧

Fast RCNN 步骤
1. 特征提取:以整张图片为输入利用CNN得到图片的特征层;
2. region proposal:通过Selective Search等方法从原始图片提取区域候选框,并把这些候选框一一投影到最后的特征层;
3.区域归一化:针对特征层上的每个区域候选框进行RoI Pooling操作,得到固定大小的特征表示; ROI pooling可以 speed up both train and test time
4. 分类与回归:然后再通过两个全连接层,分别用softmax做多目标分类,用回归模型进行边框位置与大小微调。
3.2 优缺点
缺点 使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但是RCNN仍会有严重的速度瓶颈
优点 我们使用 ROI 池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。因为 Fast-RCNN 不会重复提取特征,因此它能显著地减少处理时间。

4. Faster RCNN

说到这里我强烈推荐这篇文章一文读懂Faster RCNN),第一次学习这个模型我通过这篇文章很轻松的了解里面的原理及内容。当然肯定少不了阅读原论文Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks。在这里我也推荐关于Faster RCNN的github代码,同时也推荐一篇博客专门对重要代码进行了详解。

Faster-RCNN的原理及演变_第13张图片
Faster RCNN

其实Faster RCNN就是在Fast RCNN基础上添加了RPN网络。一下给一个详细的流程图我们可以根据这个流程图详细介绍一下Faster RCNN.

4.1 步骤
Faster-RCNN的原理及演变_第14张图片
Faster RCNN流程图

在这里我们可以将其分成4个部分:

步骤 内容 图示
1.Feature Extraction 卷积层(conv layers),用于提取图片的特征,输入为整张图片, 输出为提取出的特征称为feature maps
2. Region Proposal Network RPN网络(Region Proposal Network),用于推荐候选区域,这个网络是用来代替之前的search selective的。输入为图片(因为这里RPN网络和Fast R-CNN共用同一个CNN,所以这里输入也可以认为是featrue maps),输出为多个候选区域,这里的细节会在后面详细介绍
Faster-RCNN的原理及演变_第15张图片
3. ROI Polling RoI pooling,和Fast R-CNN一样,将不同大小的输入转换为固定长度的输出,输入输出和Faste R-CNN中RoI pooling一样
4.Classification and Regression 分类和回归,这一层的输出是最终目的,输出候选区域所属的类,和候选区域在图像中的精确位置。
Faster-RCNN的原理及演变_第16张图片
4.2 步骤详解
  1. Conv Layer
    Faster RCNN首先是支持输入任意大小的图片的,比如上图中输入的PQ,进入网络之前对图片进行了规整化尺度的设定,如可设定图像短边不超过600,图像长边不超过1000,我们可以假定MN=1000600(如果图片少于该尺寸,可以边缘补0,即图像会有黑色边缘)
    ① 13个conv层:kernel_size=3,pad=1,stride=1;
    卷积公式:


    所以,conv层不会改变图片大小(即:输入的图片大小=输出的图片大小)
    ② 13个relu层:激活函数,不改变图片大小
    ③ 4个pooling层:kernel_size=2,stride=2;pooling层会让输出图片是输入图片的1/2
    经过Conv layers,图片大小变成(M/16)
    (N/16),即:6040(1000/16≈60,600/16≈40);则,Feature Map就是6040512-d(注:VGG16是512-d,ZF是256-d),表示特征图的大小为6040,数量为512

  2. RPN (Region Proposal Network)
    这里与Fast RCNN区别在于通过RPN网络来替代原来的Selective Search选取候选框。


    Faster-RCNN的原理及演变_第17张图片
    RPN
  • Anchor
    说到这里之前我们先介绍下PRN网络是用什么方法选取候选框的呢?其实才用了anchor的机制。下面在介绍RPN网络之前让我们先了解下anchor。
    其实anchor就是我们在feature map上预先生成的候选框。让我们看一下anchor究竟长什么样子。
[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

Faster-RCNN的原理及演变_第18张图片
anchor

Faster-RCNN的原理及演变_第19张图片
generate anchor

这个矩阵即是我们的anchor表示。从横向来看对于每一行总共有4个值分别表示()表示候选框左上和右下角的坐标。但是为什么大小都是这么大呢?这是因为输入的如下我们都会统一将其reshape成为800x600, anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。从纵向来看总共有9个anchor,为什么是9个anchor。这是因为在feature map上每一个像素点会生成大小不同的的3个框选择(, 以及),而每一个大小不同的候选框又会有3个不同宽高比例(1:1,1:2,2:1)的候选框。因此我们会生成9个不同大小的anchor。现在我们来看看一个feature map 我们能产生多少个anchors呢?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以: ceil(800/16)x ceil(600/16)x9 = 50 x 38 x 9 = 17100(其中ceil()表示向上取整,是因为VGG输出的feature map size= 50 38)。一般会产生17100个anchor,这么多anchor我们全部都利用上吗?其实不然我们会进行筛选,我们后面将会介绍到。每一个anchor在feature map上映射到原图其实就是一个候选框,可以理解为这就是一个个感受野。源码中,通过width:(0~60)16,height(0~40)*16建立shift偏移量数组,再和base_ancho基准坐标数组累加,得到特征图上所有像素对应的Anchors的坐标值,是一个[216000,4]的数组.

2.1 RPN 网络流程


3*3 conv
  • 我们看出来生成出来的feature map上有许许多多的anchors, 我们筛选出来的anchor 需要先进行33卷积,这里33卷积这里应该是增加感受野的范围。顺便插一句现在为什么很多卷积喜欢用多个3*3卷积核替换大卷积核呢?有两点原因:1.网络层数增加了,这增加了网络的非线性表达能力。2.参数减少。
1*1 conv
  • 这里用1*1卷积分别走了两个分支上面分支生成了,上面这一条分支生成18个通道,而下一条分支生成了36个分支。这是因为对于上面一条路径来说是用来做前景分类, 下面一条路径是用来做前景回归前景bounding box。对于feature map每一个像素点有9个anchor,在分类中有2个分类(前景/背景),对于回归有4个坐标点(x,y,w,h)所以上面一条有2x9个通道数,而下面一条有4x9个通道数。
reshape
  • 对于这里进行两次的reshape具体原因这就要从caffe的实现形式说起了。在caffe基本数据结构blob中以如下形式保存数据:blob=[batch_size, channel,height,width]对应至上面的保存positive/negative anchors的矩阵,其在caffe blob中的存储形式为[1, 2x9, H, W]。而在softmax分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1, 2, 9xH, W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。
  1. Proposal Layer.
  • anchors 定义正负样本准则:
准则
1. 对每个标定的ground truth,与其重叠比例IoU最大的anchor记为正样本,这样可以保证每个ground truth至少对应一个正样本anchor
2. 对每个anchors,如果其与某个ground truth的重叠比例IoU大于0.7,则记为正样本(目标);如果小于0.3,则记为负样本(背景)
3. 剩下的既不是正样本也不是负样本,不用于最终训练.
  • 保留anchor原则:
顺序 操作 anchors 大致数量
1. 生成anchors, 利用[, , ,]对所有的anchors做bounding box regression回归,这里的anchors生成和训练完全一致
2. 按照输入的foreground softmax score由大到小排序anchors,提取前TopN(6000)个,即提取修正位置后的foreground anchors 6000
3. 只保留图像内部的anchors ≈5000
4. 剔除非常小的foreground anchor
5. NMS(按照softmax score进行从大到小排序,提取前2000个预proposal,对这个2000个进行NMS(非极大值抑制)) ≈2000
6. 随机选取正负样本个128个(也可以选择正负样本1:4选取) 256
  • 非极大抑制(NMS)


    Faster-RCNN的原理及演变_第20张图片
    NMS
  • Proposal Loss
    论文中proposal loss 表示为

    Faster-RCNN的原理及演变_第21张图片
    Loss 表示

    上述公式表示anchor index, 表示positive softmax probability, 代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,;反之IoU<0.3时,认为是该anchor是negative,;至于那些0.3

  1. cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
  2. reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了,相当于只关心positive anchors的回归(其实在回归中也完全没必要去关心negative)。
    Faster-RCNN的原理及演变_第22张图片

为什么Faster-rcnn中使用Smooth L1 Loss 而不用Smooth L2 Loss。 smooth L1损失函数曲线如下图9所示,作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。


Faster-RCNN的原理及演变_第23张图片
Smooth L1 Loss
Faster-RCNN的原理及演变_第24张图片
  • RPN bounding box regression

提取的过程也是个训练的过程,前面的RPN classification给所有的anchor打上label后,我们需用一个表达式来建立anchor与ground truth的关系,假设anchor中心位置坐标是[, ],长高为Aw和Ah,对应ground truth的4个值为[Gx,Gy,Gw,Gh],他们间的关系可以用公式1来表示。[, , ,]就是anchor与ground truth之间的偏移量,由公式1可以推导出公式2,这里用对数来表示长宽的差别,是为了在差别大时能快速收敛,差别小时能较慢收敛来保证精度

Faster-RCNN的原理及演变_第25张图片
公式1

Faster-RCNN的原理及演变_第26张图片
公式2

有了这4个偏移量,你就可以拿他们去训练图2 RPN中下面一个分支的输出。完成训练后RPN就具备识别每一个anchor到与之对应的最优proposal偏移量的能力([, ,, ]),换个角度看就是得到了所有proposal的位置和尺寸。要注意的是如果一个feature map中有多个ground truth,每个anchor只会选择和它重叠度最高的ground truth来计算偏移量。
Faster-RCNN的原理及演变_第27张图片
image.png

  1. Classification and Regression
    在前面RPN网络相当于得到前/背景的分类,以及前景大致的回归框。在Classification and Regression 上面会对前景框进行进一步分类以及回归,我们能得知前景究竟属于哪一类,以及对应的精准回归框。

有关于faster-RCNN方面的改进在日后会继续更新,敬请期待。。。。

参考:

  1. RCNN,fast RCNN,faster RCNN区别
  2. 一文读懂Faster RCNN
  3. 目标检测学习总结之RCNN、SPP-net、Fast RCNN、Faster RCNN、YOLO、SSD的区别
  4. Faster R-CNN文章详细解读
  5. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks。
  6. Faster R-CNN 源码解析(Tensorflow版)
  7. Faster RCNN学习笔记
  8. 非极大抑制
  9. 为什么Faster-rcnn、SSD中使用Smooth L1 Loss 而不用Smooth L2 Loss
  10. 从结构、原理到实现,Faster R-CNN全解析(原创)

你可能感兴趣的:(Faster-RCNN的原理及演变)