RCNN, Fast-RCNN, Faster-RCNN的一些事

一.RCNN -> Fast-RCNN -> Faster-RCNN的发展

在CNN之前,对象检测这一问题基本是遵循着“设计手工特征(Hand-crafted feature)+分类器”的思路,而且由于存在着区域搜索的步骤,所以可以认为是计算机用一个小的矩形窗口不断在图像上滑动、缩放,然后用分类器预测当前滑动窗口所在区域是否存在一个感兴趣的对象。

—> 使用CNN的特征,用深度神经网络做检测
RCNN算法的核心思想就是对每个区域通过CNN提取特征,然后接上一个分类器预测这个区域包含一个感兴趣对象的置信度。神经网络仅仅是一个图片分类的工具而已,只不过不是整图分类,而是ROI区域的分类。
RCNN处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression。

—> 解决RCNN的速度瓶颈(计算机对所有region进行特征提取时会有重复计算),把用selective search等proposal提取算法得到的输入box坐标,放到深度神经网络里然后进行一些优化。
Fast-RCNN提出了一个可以看做单层sppnet的网络层,叫做ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量。对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。
Fast-RCNN处理流程中把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,这两个任务能够共享卷积特征,并相互促进。
Fast-RCNN成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望。

—> 把region proposal部分从网络外边嵌入了网络里边,也放到GPU上
Faster-RCNN出现了一个end-to-end的CNN对象检测模型。作者提出,网络中的各个卷积层特征其实可以用来预测类别相关的region proposal,不需要事先执行诸如selective search之类的算法,把region proposal提取和Fast-RCNN部分融合进了一个网络模型 (区域生成网络 RPN层)。

二、RCNN算法介绍

1. 相关概念介绍

交并化IOU
IOU(intersection-over-union)简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。可以简单的理解为: 检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集,即为检测的准确率 IoU。
这里写图片描述
bounding box的定位精度评价公式IOU:
IOU=(A∩B)/(A∪B)
非极大值抑制
RCNN算法会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率。判别哪些矩形框是没用的方法使用的是非极大值抑制。

如定位一个车辆,先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

2. 总体思路

首先输入一张图片,先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用svm算法对各个候选框中的物体进行分类识别。也就是总个过程分为三个程序:a、找出候选框;b、利用CNN提取特征向量;c、利用SVM进行特征向量分类。
这里写图片描述
两个保证检测速度的关键点:
1.所有类别的分类器共享相同的特征输入;2.与传统特征相比,深度特征维度一般比较低,比如VGG16里的4096维。
缺陷:
存在速度瓶颈,原因就是计算机对所有region进行特征提取时会有重复计算。

3. 算法详解

1. 候选框搜索阶段

实现方式:
对于输入的一张图片,使用selective research搜索出所有可能是物体的区域,搜索出2000个候选框,但是这些矩形框大小各不相同。然而CNN对输入图片的大小是有固定的,因此对于每个输入的候选框都需要缩放到固定的大小。
假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227,paper试验了两种不同的处理方法:
(1)各向异性缩放

这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;

(2)各向同性缩放

因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是也测试了“各向同性缩放”方案。这个有两种办法:
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图(C)所示;
这里写图片描述
文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。
然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此需要用IOU为2000个bounding box打标签,以便下一步CNN训练使用。在CNN阶段,如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么就把这个候选框标注成物体类别,否则就把它当做背景类别。

2. CNN特征提取阶段

直接选用Alexnet及其参数作为初始的参数值,然后再fine-tuning训练。通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。
问题1:直接用Alexnet做特征提取,省去fine-tuning阶段可以吗?
这个是可以的,可以不需重新训练CNN,直接采用Alexnet模型,提取出p5、或者f6、f7的特征,作为特征向量,然后进行训练svm,只不过这样精度会比较低。
问题2:没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?
可以选择p5、f6、f7,这三层的神经元个数分别是9216、4096、4096。从p5到p6这层的参数个数是:4096*9216 ,从f6到f7的参数是4096*4096。
问题3:具体是选择p5、还是f6,又或者是f7呢?
如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。如:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。
问题4: CNN训练最后一层softmax就是分类层,那么为什么要先用CNN做特征提取(提取fc7层数据),再把提取的特征用于训练svm分类器?
因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。

原因是,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么也把它标注为正样本,用于训练cnn;这样做的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);
而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,只有当bounding box把整个物体都包含进去了,才把它标注为物体类别,然后训练svm

3. SVM训练、测试阶段

这是一个二分类问题。测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5,发现选择IOU阈值为0.3效果最好,即当重叠度小于0.3的时候,就把它标注为负样本。一旦CNN f7层特征被提取出来,那么将为每个物体训练一个svm分类器。当用CNN提取2000个候选框,可以得到2000*4096这样的特征向量矩阵,然后只需要把这样的一个矩阵与svm权值矩阵4096*N点乘(N为分类类别数目,因为训练的N个svm,每个svm包好了4096个W),就可以得到结果了。

三、fast-RCNN 算法介绍

这里写图片描述
Fast RCNN提出了一个特殊的层ROI,网络结构和SPP类似,整张图提一次特征,再把候选框映射到conv5上,SPP是pooling成多个固定尺度,而ROI只pooling到一个固定的尺度,另外,Fast RCNN网络结构把pooling5层换成了ROI层,并把最后一层的Softmax换成两个,一个是对区域的分类Softmax(包括背景),另一个是对bounding box的微调。这个网络有两个输入,一个是整张图片,一个是候选proposals算法产生的可能proposals的坐标。另外,训练方式是把同张图片的prososals作为一批进行学习,而proposals的坐标直接映射到conv5层上,这样相当于一个batch一张图片的所以训练样本只卷积了一次。

1. 加速方法

把原始图片一整张都扔进 CNN 中,进行特征提取得到 conv5 的 feature map ;然后再根据 conv5 的 feature map 与原始图片的比例关系、bbox 的映射关系,把从原始图片 selective search 到的 2000 个 bbox 映射到 conv5的 feature map,再从 feature map 中裁剪出相应的 ROI ,最后在进行 ROI Pooling +分类、回归。
这里写图片描述

2. ROI Pooling

数据输入和SPPNet有点类似,并不对图片大小限制,实现的关键就是ROI Pooling网络层,它可以在任意大小的图片feature map上针对输入的每一个ROI区域提取出固定维度的特征表示,保证后续对每个区域的后续分类能够正常进行。ROI Pooling的具体实现可以看做是针对ROI区域的普通整个图像feature map的Pooling。
sPPnet 之空间金字塔池化层:
空间金子塔池化,来自于 sppnet:
这里写图片描述
ROI 池化层,是空间金字塔池化层的简化版,在上面的空间金字塔池化层示例图片中,金字塔有 3 层;然而 Rol 池化层,其实就仅仅只有一层。
假设ROI区域定义为(x1,y1,x2,y2) ,那么bbox的尺寸大小为h*w = (y2-y1)*(x2-x1) ,若H*W表示经过池化后输出ROI的大小,那么也就是把h*w大小的ROI区域截取下来,然后进行均匀分块,每个块大小为(h/H,w/W),然后对每个块进行最大池化,最后ROI区域的输出大小就是H*W大小的图片。

3. 缺陷

  • 需要用 selective search 等相关算法,先搜索出 2000 个物体框,也就意味看算法不是端到端的训练;
  • selective search 算法速度也很慢,这样一来会严重施慢一张图片的检浏速度。

四、faster R-CNN 算法介绍

faster R-CNN 的最大目标就是要实现端到端训练:引入局部网络 RPN ,用 RPN 网络进行提取物体框,然后把物体框扔进后面的 Rol Pooling 、分类、精回归网络层。
faster RCNN可以大致看做“区域生成网络+fast RCNN“的系统,用区域生成网络代替fast RCNN中的Selective Search方法

1. 区域生成网络 ( Region Proposal Networks )

图片在输入网络后,依次经过一些卷积、池化层,然后得到的feature map,在feature map中提取proposal。先通过对应关系把feature map的点映射回原图,在每一个对应的原图设计不同的固定尺度窗口(bbox),根据该窗口与ground truth的IOU给它正负标签,让它学习里面是否有object,这样就训练一个网络(Region Proposal Network)。
这里写图片描述

具体过程:
a、得到最终用来预测的feature map
b、把每个特征点映射回映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同scale、aspect ratio的anchor,在feature map上的每个特征点预测多个region proposals。首先在后面接上一个二分类softmax,有2个score输出用以表示其是一个物体的概率与不是一个物体的概率,然后再接上一个bounding box的regressor,以及4个坐标输出代表这个anchor的坐标位置。
注:此处对bbox做了三个固定:固定scale变化(三种尺度),固定aspect ratio变化(三种ratio),固定采样方式(只在feature map的每个点在原图中的对应ROI上采样,反正后面的工作能进行调整) 。如此就可以降低任务复杂度。(三种面积{ 128^2, 256^2, 521^2 }),3个aspect ratio( {1:1,1:2,2:1} )
c、在特征图上提取proposal之后,网络前面就可以共享卷积计算结果。RPN网络与检测网络的卷积层是参数共享的,由于卷积层与原来的物体分类的CNN 卷积层参数共享,因此在测试阶段的proposals计算时间就大大减少。这个网络的结果就是卷积层的每个点都有有关于k个achor boxes的输出,包括是不是物体,调整box相应的位置。
说明:
1.在到达全连接层之前,卷积层和Pooling层对图片输入大小其实没有size的限制,因此RCNN系列的网络模型是不需要实现把图片resize到固定大小的;
2.得到的feature map被手动划分为 n×n 个矩形窗口(论文中n=3),n=3看起来很小,但是考虑到这是非常高层的feature map,其size本身也没有多大,因此 3×3 的9个矩形中,每个矩形窗框都是可以感知到很大范围的。

2. 精回归

在经过roi ,获得裁剪出 bbox 内的 feature map 之后,把它扔进网络,然后输出两个分支:一部分是 softmax 层,用于判断 roi 内的物体类别;另一个分支用于输出roi 内的物体精坐标位置(bbox ) ,具体的回归损失函数的定义可以看 RCNN 的定义。

3. 共享卷积层参数训练方法

训练提取proposal用RPN,分类采用Fast R-CNN,如何把这两者放在同一个网络结构中训练出一个共享卷积的Multi-task网络模型?
( 1 ) 交替训练
首先独立训练 RPN 网络,用这个RPN的网络权重对Fast-RCNN网络进行初始化并且用之前RPN输出proposal作为此时Fast-RCNN的输入,训练Fast R-CNN;然后用训练好的Fast R-CNN的网络参数去初始化RPN。继续 RPN训练,如此交替迭代。每一轮训练,都是两个网络交替迭代共享层参数,有两个不同的损失函数。
这里写图片描述
( 2 ) 近似联合训练
尝试把RPN和Fast-RCNN二者融入到一个网络内。也就是把RPN的损失函数和 Fast RCNN 的损失函数,根据一定的比例相加在一起,然后进行整体的 SGD训练。这种方法,直接用 RPN 提取的 bbox ,作为后续 ROI 网络层的输入。proposals是由中间的RPN层输出的,而不是从网络外部得到。

五、R-CNN、Fast R-CNN、Faster R-CNN三者关系

这里写图片描述

Fast R-CNN框架与R-CNN不同:
① 最后一个卷积层后加了一个ROI pooling layer;
② 损失函数使用了multi-task loss(多任务损失)函数,将边框回归直接加到CNN网络中训练。分类Fast R-CNN直接用softmax替代R-CNN用的SVM进行分类。

Faster R-CNN可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法。

参考文档:https://blog.csdn.net/xiaoye5606/article/details/71191429
https://blog.csdn.net/u014696921/article/details/52703760
https://blog.csdn.net/xyy19920105/article/details/50817725

猜你喜欢

转载自blog.csdn.net/daydayup_668819/article/details/80022107