概览R-CNN
一. RCNN
算法概要:首先输入一张图片,我们先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用svm算法对各个候选框中的物体进行分类识别。也就是总个过程分为三个程序:
a、找出候选框;
b、利用CNN提取特征向量;
c、利用SVM进行特征向量分类。具体的流程如下图片所示:
在CNN阶段,如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。
二. Fast RCNN
引入原因:FRCNN针对RCNN在训练时是multi-stage pipeline和训练的过程中很耗费时间空间的问题进行改进。它主要是将深度网络和后面的SVM分类两个阶段整合到一起,使用一个新的网络直接做分类和回归。
改进:最后一个卷积层后加了一个ROI pooling layer。ROI pooling layer首先可以将image中的ROI定位到feature map,然后是用一个单层的SPP layer将这个feature map patch池化为固定大小的feature之后再传入全连接层。
损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。
图中省略了通过ss获得proposal的过程,第一张图中红框里的内容即为通过ss提取到的proposal,中间的一块是经过深度卷积之后得到的conv feature map,图中灰色的部分就是我们红框中的proposal对应于conv feature map中的位置,之后对这个特征经过ROI pooling layer处理,之后进行全连接。在这里得到的ROI feature vector最终被分享,一个进行全连接之后用来做softmax回归,用来进行分类,另一个经过全连接之后用来做bbox回归。
注意: 对中间的Conv feature map进行特征提取。每一个区域经过RoI pooling layer和FC layers得到一个 固定长度 的feature vector(这里需要注意的是,输入到后面RoI pooling layer的feature map是在Conv feature map上提取的,故整个特征提取过程,只计算了一次卷积。虽然在最开始也提取出了大量的RoI,但他们还是作为整体输入进卷积网络的,最开始提取出的RoI区域只是为了最后的Bounding box 回归时使用,用来输出原图中的位置)。
SPP网络
何恺明研究员于14年撰写的论文,主要是把经典的Spatial Pyramid Pooling结构引入CNN中,从而使CNN可以处理任意size和scale的图片;这中方法不仅提升了分类的准确率,而且还非常适合Detection,比经典的RNN快速准确。
SPP layer
根据pooling规则,每个pooling bin(window)对应一个输出,所以最终pooling后特征输出由bin的个数来决定。本文就是分级固定bin的个数,调整bin的尺寸来实现多级pooling固定输出。
通过融合各级bin的输出,最终每一个unpooled FM经过SPP处理后,得到了1+4+16维的SPPed FM输出特征,经过融合后输入分类器。
这样就可以在任意输入size和scale下获得固定的输出;不同scale下网络可以提取不同尺度的特征,有利于分类。
RoI pooling layer
每一个RoI都有一个四元组(r,c,h,w)表示,其中(r,c)表示左上角,而(h,w)则代表高度和宽度。这一层使用最大池化(max pooling)来将RoI区域转化成固定大小的HW的特征图。假设一个RoI的窗口大小为hw,则转换成HW之后,每一个网格都是一个h/H * w/W大小的子网,利用最大池化将这个子网中的值映射到HW窗口即可。Pooling对每一个特征图通道都是独立的,这是SPP layer的特例,即只有一层的空间金字塔。
从预训练的网络中初始化数据
有三种预训练的网络:CaffeNet,VGG_CNN_M_1024,VGG-16,他们都有5个最大池化层和5到13个不等的卷积层。用他们来初始化Fast R-CNN时,需要修改三处:
①最后一个池化层被RoI pooling layer取代
②最后一个全连接层和softmax被替换成之前介绍过的两个兄弟并列层
③网络输入两组数据:一组图片和那些图片的一组RoIs
算法特点
1 通过Spatial Pyramid Pooling解决了深度网络固定输入层尺寸的这个限制,使得网络可以享受不限制输入尺寸带来的好处。
2 解决了RCNN速度慢的问题,不需要对每个Proposal(2000个左右)进行Wrap或Crop输入CNN提取Feature Map,只需要对整图提一次Feature Map,然后将Proposal区域映射到卷积特征层得到全链接层的输入特征。
三. Faster RCNN
在Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,这个也非常耗时。那我们有没有一个更加高效的方法来求出这些候选框呢?
在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。如下图所示:
Faster R-CNN统一的网络结构如下图所示,可以简单看作RPN (Region Proposal Network)网络+Fast R-CNN网络。
原理步骤如下:
首先向CNN网络【ZF或VGG-16】输入任意大小图片;
经过CNN网络前向传播至最后共享的卷积层,一方面得到供RPN网络输入的特征图,另一方面继续前向传播至特有卷积层,产生更高维特征图;
供RPN网络输入的特征图经过RPN网络得到区域建议和区域得分,并对区域得分采用非极大值抑制【阈值为0.7】,输出其Top-N【文中为300】得分的区域建议给RoI池化层;
第2步得到的高维特征图和第3步输出的区域建议同时输入RoI池化层,提取对应区域建议的特征;
第4步得到的区域建议特征通过全连接层后,输出该区域的分类得分以及回归后的bounding-box。
Region Proposal Network(RPN)的核心思想是使用卷积神经网络直接产生Region Proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,借助Anchor机制和边框回归可以得到多尺度多长宽比的Region Proposal。
单个RPN网络结构如下:
在ZF网络模型下,给定输入图像(假设分辨率为600x1000),经过卷积操作得到最后一层的卷积特征图(大小约为40x60)。在这个特征图上使用3x3的卷积核(滑动窗口)与特征图进行卷积,最后一层卷积层共有256个Feature Map,那么这个3x3的区域卷积后可以获得一个256维的特征向量,后边接Cls Layer和Reg Layer分别用于分类和边框回归(跟Fast RCNN类似,只不过这里的类别只有目标和背景两个类别)。3x3滑窗对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的Region Proposal,这种映射的机制称为Anchor。所以对于这个40x60的Feature Map,总共有约20000(40x60x9)个Anchor,也就是预测20000个Region Proposal。下图是51x39个Anchor中心,以及9种Anchor示例。
这样设计的好处是什么?虽然现在也是用的滑动窗口策略,但是,滑动窗口操作是在卷积层特征图上进行的,维度较原始图像降低了16x16倍(16如何得到的可参见前文);多尺度采用了9种Anchor,对应了三种尺度和三种长宽比,加上后边接了边框回归,所以即便是这9种Anchor外的窗口也能得到一个跟目标比较接近的Region Proposal
RPN层的具体流程
首先套用ImageNet上常用的图像分类网络,本文中试验了两种网络:ZF或VGG-16,利用这两种网络的部分卷积层产生原始图像的特征图;
对于1中特征图,用n×n【论文中设计为3×3,n=3看起来很小,但是要考虑到这是非常高层的feature map,其size本身也没有多大,因此9个矩形中,每个矩形窗框都是可以感知到很大范围的】的滑动窗口在特征图上滑动扫描【代替了从原始图滑窗获取特征】,每个滑窗位置通过卷积层1映射到一个低维的特征向量【ZF网络:256维;VGG-16网络:512维,低维是相对于特征图大小W×H,typically~60×40=2400】后采用ReLU,并为每个滑窗位置考虑k种【论文中k=9】可能的参考窗口【论文中称为anchors,见下解释】,这就意味着每个滑窗位置会同时预测最多9个区域建议【超出边界的不考虑】,对于一个W×H的特征图,就会产生W×H×k个区域建议;
步骤2中的低维特征向量输入两个并行连接的卷积层2:reg窗口回归层【位置精修】和cls窗口分类层,分别用于回归区域建议产生bounding-box【超出图像边界的裁剪到图像边缘位置】和对区域建议是否为前景或背景打分,这里由于每个滑窗位置产生k个区域建议,所以reg层有4k个输出来编码【平移缩放参数】k个区域建议的坐标,cls层有2k个得分估计k个区域建议为前景或者背景的概率。
算法特点
1 提出了Region Proposal Network(RPN),将Proposal阶段和CNN分类融到了一起,实现了一个完全的End-To-End的CNN目标检测模型。RPN可以快速提取高质量的Proposal,不仅加快了目标检测速度,还提高了目标检测性能。
2 将Fast-RCNN和RPN放在同一个网络结构中训练,共享网络参数。