R-CNN流程介绍

7 篇文章 0 订阅
7 篇文章 0 订阅

创新点

1、R-CNN采用Selective Search算法预先提取出可能包含目标的 Region Proposal(候选区域),替代传统算法(DPM等)的滑动窗口法,提高速度。

2、使用CNN提取Region Proposal的特征。从经验驱动特征(SIFT、HOG)到数据驱动特征(CNN feature map),提高特征对样本的表示能力。

3、采用大数据集下(ImageNet ILSVC 2012)有监督预训练和小数据集下(PASCAL VOC 2007)微调(fine-tuning)的方法解决小样本难以训练甚至过拟合等问题。

【网络结构】

在这里插入图片描述

  1. Extract Region Proposal,使用Selective Search的方法提取2000个候选区域
  2. Compute CNN features,使用CNN网络计算每个Region Proposal的feature map
  3. Classify regions,将提取到的feature输入到SVM中进行分类
  4. Non-maximum suppression,去除掉重复的box
  5. Bounding box regression,位置精修,使用回归器精细修正候选框的位置

【流程详解】

1.Extract region proposal

首先使用Selective Search算法从输入图像中提取2000个Region Proposal,Selective Search算法主要步骤:

  1. 使用一种过分割手段,将图像分割成小区域
  2. 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
  3. 将相似度比较高的区域合并到一起
  4. 计算合并区域和临近区域的相似度
  5. 重复3、4过程,直到整个图片变成一个区域

在每次迭代中,形成更大的区域并将其添加到区域提议列表中。这种自下而上的方式可以创建从小到大的不同scale的Region Proposal,如图所示。

在这里插入图片描述

2.Compute CNN features

2.1 Warp region

由于文中使用的CNN中包含有全连接层,这就需要输入神经网络的图片有相同的size,但是Selective Search提取的Region Proposal都是不同size的,所以需要对每个Region Proposal都缩放到固定的大小(227*227)。paper试验了两种不同的处理方法:

(1)各向异性缩放

这种方法比较简单暴力,不考虑图片的长宽比例,不考虑图片是否扭曲,直接缩放到CNN输入的大小227*227。不过这种方法容易导致图片中目标发生严重形变,如下图D所示。

在这里插入图片描述

(2)各向同性缩放
  • 先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪。如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充。如上图(B)所示。
  • 先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图©所示。

注:对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。

2.2 Train CNN

利用Selective Search提取Region Proposal并resize后,接下来使用CNN(AlexNet、VGG)从每个Region Proposal提取特征。本文训练CNN的方法,主要包括以下两步:

(1)Pre-training阶段:由于物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法是不足以从零开始训练出一个好的CNN模型。基于此,本文采用的是有监督的预训练,使用一个大的数据集(ImageNet ILSVC 2012)来训练AlexNet,得到一个分类的预训练(Pre-trained)模型。
在这里插入图片描述(2)Fine-tuning阶段:使用Region Proposal(PASCAL VOC)对Pre-trained模型进行fine-tuning。首先将原来预训练模型最后的1000-way的全连接层(分类层)换成21-way的分类层(20类物体+背景),然后计算每个region proposal和ground truth 的IoU,对于IoU>0.5的region proposal被视为正样本,否则为负样本(即背景)。在每次迭代的过程中,选取32个正样本和96个负样本组成一个mini-batch(128,正负比:1:3)。我们使用0.001的学习率和SGD来进行训练。
在这里插入图片描述

(备注: 如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了)

2.3 Save features

虽然文中训练了CNN网络对region proposal进行分类,但是实际中,这个CNN的作用只是提取每个region proposal的feature。因此,我们输入region proposal进行前向传播,然后保存AlexNet的FC7层features,以供后续的SVM分类使用。

3.Classify regions

本文使用SVM进行分类对于每一类都会训练一个SVM分类器,所以共有N(20)个分类器,我们来看一下是如何训练和使用SVM分类器的。

3.1 Training

如下图所示,在训练过程中,SVM的输入包括两部分:
在这里插入图片描述
(1) CNN feature:这个便是CNN网络为每个region proposal提取的feature,共2000*4096。

(2) Ground truth labels: 在训练时,会为每个region proposal附上一个label(标注好的labels称为Ground truth labels)。

在SVM分类过程中,当IoU<0.3时,为负样本,正样本便是ground truth box。然后SVM分类器也会输出一个预测的labels,然后用labels和ground truth labels计算loss,然后训练SVM。

3.2 Testing

Testing的过程就是输入经过之前的步骤得到test image的Region Proposal的feature,然后输出对2000个proposal的类别预测值。

4. Non-maximum suppression

经过SVM之后,我们会得到2000个region proposal的class probability,然后我们可以根据‘有无物体’这一类过滤掉一大批region proposal,然后如果某个候选框的最大class probability<阀值,那也可以过滤掉这些region proposal,那剩下的可能如下左图所示,就是有多个box相互重叠,但是我们目标检测的目标是一个物体有一个box即可,那这个时候就需要用到非极大值抑制(NMS)了,经过NMS之后,最终的检测结果如下右图所示:
在这里插入图片描述

5. Bounding box regression

目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要Bounding box regression步骤。如下图,绿色的框表示Ground Truth Box, 红色的框为我们预测得到的region proposal 。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5), 那么这张图相当于没有正确的检测出飞机。所以需要对红色的框进行微调,使得经过微调后的窗口跟Ground Truth Box更接近,这样就可以更准确的定位。Bounding box regression算法参考这里。
在这里插入图片描述
最后,用一张图表示R-CNN整个过程。
在这里插入图片描述

【R-CNN不足】

1、训练时间长:主要原因是分阶段多次训练,而且对于每个region proposal都要单独计算一次feature map,导致整体的时间变长。

2、占用空间大:主要原因是每个region proposal的feature map都要写入硬盘中保存,以供后续的步骤使用。

3、multi-stage:文章中提出的模型包括多个模块,每个模块都是相互独立的,训练也是分开的。

4、测试时间长,由于不共享计算,所以对于test image,也要为每个proposal单独计算一次feature map,因此测试时间也很长。

SPPNet

在这里插入图片描述
spp-net是目标检测较早的一篇论文,它的存在使得目标检测能够更加顺畅快速的发展。这个网络主要是与R-CNN做对比,其精髓亮点有两处:

1.它解决了深度卷积神经网络(CNNs)的输入必须要求固定图像尺寸(例如224*224)的限制。

2.在目标检测领域它提高了提取特征的效率,速度相比R-CNN提升24-102倍。

spp-net如何解决输入固定图像尺寸的限制?

一.空间金字塔池化(Spatial Pyramid Pooling)实现原理

在这里插入图片描述
黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4×4,2×2,1×1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。

从整体过程来看,就是如下图所示:
在这里插入图片描述
输出向量大小为Mk,M=#bins, k=#filters,作为全连接层的输入。

例如上图,所以Conv5计算出的feature map也是任意大小的,现在经过SPP之后,就可以变成固定大小的输出了,以上图为例,一共可以输出(16+4+1)*256的特征。

二.SPP-Net是如何调整网络结构的?

在这里插入图片描述
深度卷积神经网络的基础结构分为:卷积层(conv layers)->池化层(pooling layers)->全连接层(fc layers)。我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如224 * 224(ImageNet)、32 * 32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。

对此SPPnet提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。

总结而言,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。

spp-net如何提高特征计算的速度?

在这里插入图片描述

一.R-CNN特征计算为何低效

首先大家要知道此阶段提高特征计算的速度都是与R-CNN相比较而进行的。利用R-CNN进行目标检测,虽然在VOC和ImageNet上都表现了出色的检测精度,但是R-CNN提取特征的计算非常耗时,主要因为在对每张图片中的多达2000个的候选区域的像素反复调用CNN进行提取特征。其中的候选区域存在大量重叠的部分,这种设计明显造成了大量的计算浪费。

对于R-CNN,整个过程是:

1.首先通过选择性搜索,对待检测的图片进行搜索出~2000个候选窗口。

2.把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个proposal提取出一个特征向量,也就是说利用CNN对每个proposal进行提取特征向量。

3.把上面每个候选窗口的对应特征向量,利用SVM算法进行分类识别。

可以看出R-CNN的计算量是非常大的,因为2k个候选窗口都要输入到CNN中,分别进行特征提取。

二.sppnet如何提高特征计算速度

SPPnet的做法是首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。然后把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中通过映射关系找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。

对于SPP-Net,整个过程是:

1、首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。

2、特征提取阶段。这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。

3、最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。

三.如何在特征图上找到原图上对应的候选区域

论文中给出一个公式:

假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关: (x,y)=(Sx’,Sy’)

反过来,我们希望通过(x,y)坐标求解(x’,y’),那么计算公式如下:
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值