R-CNN详解
文章目录
- R-CNN:Regions + CNN
- 创新点
- 网络结构
- 网络结构详解
- 1.特征区域抽取(Extract region proposal)
- 2.计算CNN特征(Compute CNN features)
- 3.区域分类(Classify regions)
- 4.非极大值抑制(Non-maximum suppression)
- 5.边界框回归(Bounding box regression)
R-CNN:Regions + CNN
《Rich feature hierarchies for accurate object detection and semantic segmentation》
论文地址:https://arxiv.org/pdf/1311.2524v3.pdf
代码地址:https://github.com/rbgirshick/r
创新点
- R-CNN采用Selective Search算法预先提取出可能包含目标的 Region Proposal(候选区域),替代传统算法(DPM等)的滑动窗口法,提高速度。
- 使用CNN提取Region Proposal的特征。从经验驱动特征(SIFT、HOG)到数据驱动特征(CNN feature map),提高特征对样本的表示能力。
- 采用大数据集下(ImageNet ILSVC 2012)有监督预训练和小数据集下(PASCAL VOC 2007)微调(fine-tuning)的方法解决小样本难以训练甚至过拟合等问题。
网络结构
- 过程
- Extract Region Proposal,使用Selective Search的方法提取2000个候选区域
- Compute CNN features,使用CNN网络计算每个Region Proposal的feature map
- Classify regions,将提取到的feature输入到SVM中进行分类
- Non-maximum suppression,去除掉重复的box
- Bounding box regression,位置精修,使用回归器精细修正候选框的位置
网络结构详解
1.特征区域抽取(Extract region proposal)
首先使用Selective Search算法从输入图像中提取2000个Region Proposal,Selective Search算法主要步骤:1. 使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
2. 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
3. 将相似度比较高的区域合并到一起
4. 计算合并区域和临近区域的相似度
5. 重复3、4过程,直到整个图片变成一个区域在每次迭代中,形成更大的区域并将其添加到区域提议列表中。这种自下而上的方式可以创建从小到大的不同scale的Region Proposal,如图所示。
2.计算CNN特征(Compute CNN features)
2.1 缩放区域(Warp region)
由于文中使用的CNN中包含有全连接层,这就需要输入神经网络的图片有相同的size,但是Selective Search提取的Region Proposal都是不同size的,所以需要对每个Region Proposal都缩放到固定的大小(227227)。paper试验了两种不同的处理方法:
(1)各向异性缩放
这种方法比较简单暴力,不考虑图片的长宽比例,不考虑图片是否扭曲,直接缩放到CNN输入的大小227227。不过这种方法容易导致图片中目标发生严重形变,如下图D所示。
(2)各向同性缩放
-
先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪。如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充。如上图(B)所示。
-
先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图©所示。
注:对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
2.2 CNN网络训练(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(21)个分类器,我们来看一下是如何训练和使用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不足】
- 训练时间长:主要原因是分阶段多次训练,而且对于每个region proposal都要单独计算一次feature map,导致整体的时间变长。
- 占用空间大:主要原因是每个region proposal的feature map都要写入硬盘中保存,以供后续的步骤使用。
multi-stage:文章中提出的模型包括多个模块,每个模块都是相互独立的,训练也是分开的。
3. 测试时间长,由于不共享计算,所以对于test image,也要为每个proposal单独计算一次feature map,因此测试时间也很长。