Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)

R-CNN系列作为目标检测领域的大师之作,对了解目标检测领域有着非常重要的意义。

Title:R-CNN:Rice feature hierarchies for accurate object detection and semantic segmentation

         fast-RCNN 

         Faster-RCNN:Towards Real-Time Object Detection with Region Proposal Networks
Note data:2019/05/21
Abstract:作为计算机视觉三大问题之一,检测问题是相对较为复杂的任务。不仅需要知道是什么,还需要知道在哪里,分别是什么的问题,这正是我们目标检测需要做的东西。

Code:pytorch


目录

R-CNN论文解读

1 Abstract

2 Introduction

3 Architecture

3.1 找出图片中可能存在目标的侯选区域

3.2 通过CNN对候选区域提取特征向量

3.3 网络的训练


R-CNN论文解读

1 Abstract

论文提出一种基于CNN的Object Detectino模型R-CNN

网络结构:将region proposal与CNN结合

创新:

  • 在候选区域上自下而上使用大型卷积神经网络(CNNs),用以定位和分割物体。
  • 当带标签的训练数据不足时,先针对辅助任务进行有监督预训练,再进行特定任务的调优,就可以产生明显的性能提升。

动机:使得目标检测网络更加简单效果更佳

在R-CNN之前用于目标检测的方法最好是融合了多种低维图像特征和高维上下文环境的复杂融合系统。在这篇开山之作中,提出的R-CNN在VOC2012上达到了53.3%的mAP,网络主要结合了两个关键因素我们在网络创新中提到的。另一个将深度学习网络应用于目标检测的网络是overfeat,其主要改进了Alex-Net,将图像缩放和滑窗的方法应用在测试数据集上测试网络,提出了一种图像定位的方法,最后通过一个卷积网络来进行分类,定位,检测等任务!


2 Introduction

在之前的论文解读中也谈到过过去的一些方法主要是利用传统的机器学习的手段(如sift,hog等)提取特征,特征对于目标检测来说极为重要。由于CNN在ImageNet上的优异表现就有人提出是否可以将分类任务中优异表现的CNN应用在目标检测任务中。本论文是第一个实现此想法的论文,主要在使用深度网络定位物体和小规模的标注数据集上进行大型网络的训练。

与分类任务不同的是检测需要定位一个图像中的多个目标,那么锚框的定位问题就成了新的麻烦。主要有两种思路,一是将框的定位问题看作是一类回归问题,但后期的相关工作表明并没有很好的效果;另一种方法是使用滑动窗口探测器。论文中也尝试使用这种方法,但是随着网络的加深,感受野很大,使得效果并不理想。

于是论文提出了recognition using region范式,解决了CNN的定位问题。对这每张图片,产生了接近2000个与类别无关的region proposal,对每个CNN抽取了一个固定长度的特征向量,然后借助专门针对特定类别数据的线性SVM对每个区域进行分类。我们不考虑region的大小,使用放射图像变形的方法来对每个不同形状的region proposal产生一个固定长度的作为CNN输入的特征向量(也就是把不同大小的proposal放到同一个大小)。图1展示了我们方法的全貌并突出展示了一些实验结果。由于我们结合了Region proposals和CNNs,所以起名R-CNN:Regions with CNN features。                                                                                                                                                                                        Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第1张图片

                          Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第2张图片

检测中面对的第二个挑战是标签数据太少,现在可获得的数据远远不够用来训练一个大型卷积网络。传统方法多是采用无监督与训练,再进行有监督调优。本文的第二个核心贡献是在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优。这是在训练数据稀少的情况下一个非常有效的训练大型卷积神经网络的方法。我们的实验中,针对检测的调优将mAP提高了8个百分点。调优后,我们的系统在VOC2010上达到了54%的mAP,远远超过高度优化的基于HOG的可变性部件模型(deformable part model,DPM)


3 Architecture

我们的物体检测系统有三个模块构成:

  1. 找出图片中可能存在目标的侯选区域;
  2. 通过CNN对候选区域提取特征向量;
  3. 在候选区域的特征向量上训练分类器,分类器用于判别物体并得到bbox;
  4. 修正bbox,对bbox做回归微调

3.1 找出图片中可能存在目标的侯选区域

论文中经过一系列的尝试最终使用selective search(选择性搜索)。下图是selective search在图片上提取侯选区域的过程:

     Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第3张图片

Selective Search在一张图片上提取出来大概2000个侯选区域,然后变形每一个推荐区域,再通过CNN前向传播计算出特征。然后我们使用对每个类别训练出的SVM给整个特征向量中的每个类别单独打分。然后变形每一个推荐区域,再通过CNN前向传播计算出特征。然后我们使用对每个类别训练出的SVM给整个特征向量中的每个类别单独打分。需要注意的是这些候选区域的长宽不固定。而在下一层使用CNN提取特征向量时,需要接受固定长度的输入,故我们需要对候选区域做一些长度上的修改。

论文对图片做了两种方法的比较:

  • 各向异性缩放,即直接缩放到指定大小,这可能会造成不必要的图像失真
  • 各向同性缩放,在原图上出裁剪侯选区域,在边界用固定的背景颜色(采用侯选区域的像素颜色均值)填充到指定大小

           Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第4张图片

3.2 通过CNN对候选区域提取特征向量

我们使用Krizhevsky等人所描述的CNN的一个Caffe实现版本对每个推荐区域抽取一个4096维度的特征向量把一个输入为277*277大小的图片,通过五个卷积层和两个全连接层进行前向传播,最终得到一个4096-D的特征向量。 
为了计算region proposal的特征,我们首先要对图像进行转换,使得它符合CNNC的输入(架构中的CNNC只能接受固定大小:277*277)。这个变换有很多办法,我们使用了最简单的一种。无论候选区域是什么尺寸和宽高比,我们都把候选框变形成想要的尺寸。具体的,变形之前,我们现在候选框周围加上16的padding,再进行各向异性缩放。 这种形变使得mAp提高了3到5个百分点。在补充材料中,作者对比了各向异性和各向同性缩放缩放方法。

用CNN的作用是在侯选区域的基础上提取出更高级、更抽象的特征,高级特征的作用是为下一步的分类器作为输入数据,分类器依据高级特征回归出物品的位置和种类。

在讲到CNN用作分类问题时,CNN的多个卷积层可以宽泛的认为是对原图像的特征提取,并且这样的特征提取具有平移不变性。我们把CNN当做特征提取的模板,把需要提取特征的图片塞给它,训练好我们需要的CNN,就可以获取到我们想要的特征向量。

3.3 网络的训练

有监督的预训练

在大型辅助训练集ILSVRC2012分类数据集(没有约束框数据)上预训练了CNN。预训练采用了Caffe的CNN库。总体来说,我们的CNN十分接近krizhevsky等人的网络的性能,在ILSVRC2012分类验证集在top-1错误率上比他们高2.2%。差异主要来自于训练过程的简化。

         Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第5张图片

fine-tuning 
AlexNet是针对ImageNet训练出来的模型,AlexNet的卷积部分可以作为一个好的特征提取器,后面的全连接层可以理解为一个好的分类器。这里把AlexNet的softmax层替换为一个N+1神经元的输出层(N为存在物体的种类,即正样本;1为背景,即负样本)。然后做微调训练。为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口)。我们只使用变形后的推荐区域对CNN参数进行SGD训练。我们替换掉了ImageNet专用的1000-way分类层,换成了一个随机初始化的21-way分类层,(其中20是VOC的类别数,1代表背景)而卷积部分都没有改变。我们对待所有的推荐区域,如果其和真实标注的框的IoU>= 0.5就认为是正例,否则就是负例。SGD开始的learning_rate为0.001(是初始化预训练时的十分之一),这使得调优得以有效进行而不会破坏初始化的成果。每轮SGD迭代,我们统一使用32个正例窗口(跨所有类别)和96个背景窗口,即每个mini-batch的大小是128。另外我们倾向于采样正例窗口,因为和背景相比他们很稀少。

(fine-tunning阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松: IoU>0.5的建议框为正样本,否则为负样本; SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本)
 

       Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第6张图片

需要注意的是,我们在训练CNN的时候会在网络的后面加上一个分类层,在训练完毕后,我们会移除最后的分类层,直接提取到前面的FC层,AlexNet的FC层为4096维。

       Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第7张图片

在候选区域的特征向量上训练分类器

前面的CNN在侯选区域上提取出了特征向量,例如2000个侯选区域,那么提取出来的就是2000*4096这样的特征向量(AlexNet的第一个FC层维度为4096,故pool5的输出为4096)。用这些特征向量训练同时训练N个二分类的SVM,SVM的权重矩阵为4096xN(N为分类种类)。

这里你可能会问什么要使用SVM?而不是CNN过FC层直接softmax出来得了?

作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度。

Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第8张图片

在经过SVM分类后,会输出一堆的候选框得分(是一个2000x20的得分矩阵),这时候我们需要用的非极大值抑制得到想要的候选框了.大概步骤如下:

  • 对矩阵按列从大到小排序
  • 每列的最大值向下做非极大值抑制,遍历完所有列
  • 依据阈值,得到候选区域的类型

注意到这里,我们得到的是一组预测好类别的候选区域了。

修正bbox,对bbox做回归微调

我们使用一个简单的bounding-box回归用于提高定位的表现。这个bbox回归应用在SVM分类器给每个候选区域打分后,bbox回归认为候选区域和ground-truth之间是线性关系(因为在最后从SVM内确定出来的区域比较接近ground-truth,这里近似认为可以线性关系)
Object Detection---R-CNN / fast-RCNN / faster-RCNN (论文解读七)_第9张图片

 

你可能感兴趣的:(论文解读,Segmentation,and,Detection)