zoukankan      html  css  js  c++  java
  • 目标检测从入门到精通—R-CNN详细解析(二)

    R-CNN目标检测详细解析

    《Rich feature hierarchies for Accurate Object Detection and Segmentation》

    Author:Mr. Sun

    Date:2019.03.18

    Loacation: DaLian university of technology

    摘要:

      这篇论文是深度学习进行物体检测的鼻祖级论文,Regions with CNN features(R-CNN)也可以说是利用深度学习进行目标检测的开山之作。 R-CNN是将CNN方法应用到目标检测上的一个里程碑,由年轻有为的RBG大神提出,借助CNN良好的特征提取和分类性能,通过Region Proposals方法实现目标检测问题的转化。 

     

    1、研究思路剖析—站在巨人的肩膀上

      在过去的十多年时间里,传统的机器视觉领域,通常采用特征描述算子来应对目标识别任务,这些特征描述算子最常见的就是 SIFT 和 HOG,而 OpenCV 有现成的 API 可供大家实现相关的操作。但是最近SIFT 和 HOG 的王者地位被卷积神经网络撼动。

      2012 年 Krizhevsky 等人在 ImageNet 举办的 ILSVRC 目标识别挑战大赛中一战成名,豪夺当年的第一名,Top5 错误率 15%,而他们团队提出来的网络结构以他们的导师名字命名,它就是 AlexNet,该结构有 5 层卷积层,2 层全连接层。详细结构如图1所示。

     

    图1:AlexNet-8网络结构

      因为 AlexNet 的出现,世人的目光重回神经网络领域,以此为契机,不断涌出各种各样的网络比如 VGG、GoogleNet、ResNet 等等。受 AlexNet 启发,论文作者尝试将 AlexNet 在 ImageNet 目标识别的能力泛化到 PASCAL VOC 目标检测上面来。但一切开始之前,需要解决两个主要的问题。

      (1)如何利用深度的神经网络去做目标的定位?

        借鉴了滑动窗口思想,R-CNN 采用对区域进行识别的方案。具体是:

          (a)给定一张输入图片,从图片中提取 2000 个独立的候选区域。

          (b)对于每个区域利用 CNN 抽取一个固定长度的特征向量。

          (c)再对每个区域利用 SVM 进行目标分类。

      (2)如何在一个小规模的数据集上训练能力强劲的网络模型?

        采用在 ImageNet 上已经训练好的模型,然后在 PASCAL VOC 数据集上进行 fine-tune。因为 ImageNet 的图像高达几百万张,利用卷积神经网络充分学习浅层的特征,然后在小规模数据集做微训练调优,从而可以达到好的效果。现在,我们称之为迁移学习,是必不可少的一种技能。

     

    2、R-CNN模型结构与训练过程详解

    2.1 R-CNN结构分析

    R-CNN的分类器结构如下图2所示

     

    图2:R-CNN模型结构

    R-CNN算法一共分为四个步骤:

    (1)候选区域选择(Region Proposal)

      能够生成候选区域的方法很多,比如:objectness、selective search、category-independen object proposals、constrained parametric min-cuts(CPMC)、multi-scale combinatorial grouping、Ciresan等等。

      Region Proposal就是为了获得候选框的方法,本文作者不具体研究 Region Proposal 的方法而是采用的是 Selective Search,一般Candidate选项为2000个即可,这里不再详述; 根据Proposal提取的目标图像变形为固定尺寸(227*227)然后去均值,作为CNN的标准输入

    (2)CNN特征提取(Feature Extraction )

      标准CNN过程,根据输入进行卷积/池化等操作,得到固定维度的输出。本文在训练SVM分类器时用的是FC7的特征输出作为SVM的训练输入,在训练Bounding-box回归时使用的是conv5之后的pool5(6*6*256)的特征作为输入的。

    (3)分类(Classification)

      对上一步的输出向量进行分类(需要根据输出特征训练分类器),本文使用的是线性的SVM二分类分类器,每一个分类器都需要单独训练。

    (4)边界回归(Bounding-box Regression)

      通过边界回归(bounding-box regression) 得到精确的目标区域,由于实际目标会产生多个子区域,旨在对完成分类的前景目标进行精确的定位与合并,避免多个检出。

     

     R-CNN的整体结构如下图3所示:

     

    图3:R_CNN整体结构

    2.2 R-CNN训练过程分析

     步骤一:有监督分类器预训练 

      ILSVRC样本集上仅有图像类别标签,没有图像物体位置标注;而PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签;但是PASCAL VOC训练样本太少不足以去训练一个大型的神经网络, 因此作者以ILSVRC2012分类数据集(没有约束框数据)作为辅助预训练了CNN。预训练采用了Caffe的CNN库。总体来说,使用的CNN十分接近krizhevsky等人的网络的性能,在ILSVRC2012分类验证集在top-1错误率上比他们高2.2%。差异主要来自于训练过程的简化。
      作者采用AlexNet CNN网络进行有监督训练,学习率=0.01;该网络的输入为227×227的ILSVRC训练集图像,输出最后一层为4096维特征->1000类的映射,训练的是网络参数。然后传入下一步进行迁移学习,也就是特定样本下的 fine-tune ,获得适合该样本下的最优模型。AlexNet网络结构如下图4所示。

    图4:AlexNet网络结构

    步骤二:特定样本下的分类器微调(fine-tune)

      坦率的说,这一步就是我们经常说的迁移学习(Transfer Learning)。加载步骤一中训练好的模型,使用该模型中特征提取的参数来初始化我们这里的CNN的参数。我们将AlexNet的FC7之后的1000-way(ImageNet类别数)换成21-way(PASCAL VOC类别数 + 背景),然后进行softmax回归。这里使用通过SS(Selective Search)算法对图像处理获得2000个左右的候选区域(Region Proposal),然后将候选区域和真实标注区域(Ground Truth)的 IOU>0.5时作为正样本,否则作为负样本进行训练。需要注意的是对于每一个随机梯度(SGD)迭代,我们使用一个mini_batch=128的小批次,其中使用32个当前类的样本(正样本)和96个背景样本作为负样本。这一步的目的就是让模型去学习特定的样本,通过作者的实验发现这一步骤还是很有必要的。作者得出结论是:不针对特定任务进行微调,而将CNN当成特征提取器,pool5层得到的特征是基础特征, 从fc6和fc7等全连接层中所学习到的特征是针对特征任务特定样本的特征,类似于学习到了分类性别分类年龄的个性特征。

      这里的随机梯度处理的是一张图片的候选区域吗?这里的mini_batch=128小批次中的32个正样本和96和负样本均来自哪?这里的正样本中包含多少类别呢?

      这个疑问我一直没搞懂,先简单说一下我的理解:首先,PASCAL VOC数据集标签中应该是有标准矩形框的坐标和所属类别的。我个人觉得这里处理的确实是一张图片的2000个候选区域,然后通过和标准的Ground Truth计算IOU值选出很多正样本和负样本,然后在正样本中随机选出32张、在负样本中选出96张,将它们作为一个批次进行前向传播计算去fine-tune参数。反向传播结束之后,再换下一张图片进行下一轮的Region Proposal,一直到把这个分类模型训练好,训练结束后保存FC7层的特征(权重参数)。

    步骤三:训练SVM分类器

      建立新的SVM的分类器模型,模型的FC7层之后修改为SVM分类器(多个线性二分类SVM)。将步骤二的模型的卷积层参数和FC6、FC7的参数加载到模型中,保持前7层参数不变,其它参数随机初始化,只是让分类器通过学习前面学习到的特征对物体进行分类。训练的样本仍然是来自一张图片的2000个Region Proposal,计算IOU之后筛选出来正负样本用于训练分类器

      针对每个类别训练一个SVM的二分类器。输入是FC7的特征,FC7的输出维度是2000*4096,输出的是是否属于该类别,训练结果是得到SVM的权重矩阵W,W的维度是4096*20。这里负样本的选定和前面的有所不同,将IOU的阈值从0.5改成0.3,即IOU<0.3的是负样本,IOU>0.7是正样本。IOU的阈值选择和前面fine-tuning不一样,主要是因为:前面fine-tuning需要大量的样本,所以设置成0.5会比较宽松。而在SVM阶段是由于SVM适用于小样本,所以设置0.3会更严格一点。

    步骤四:边界框回归(Bounding-box Regression)

      使用conv5之后的pool5的特征6*6*256维(输入特征)和bounding box的ground truth(相当于要回归的值)来训练回归,每种类型的回归器单独训练。输入是pool5的特征,以及每个样本对的坐标和长宽值。另外只对那些跟ground truth的IOU超过某个阈值且IOU最大的Region Proposal回归,其余的region proposal不参与。详细说一下:对于某个region proposal:R,以及其对应的Ground truth:G,我们希望预测结果是:P,那么我们肯定希望P尽可能接近G。这里通过对pool5层的特征X做线性变换WX得到变换函数F(X),这些变换函数作用于R的坐标达到回归的作用(包括对x,y的平移以及对w,h的缩放)。因此损失函数可以表达为:R和G的差距减去P和G的差距要尽可能小。

    R-CNN的训练具体流程:

      (1)准备region proposal对于训练集中的所有图像,采用selective search方式来获取,最后每个图像得到2000个region proposal。

    准备正负样本。如果某个region proposal和当前图像上的所有ground truth(标记)重叠面积最大的那个的IOU大于等于0.5,则该region proposal作为这个ground truth类别的正样本,否则作为负样本。另外正样本还包括了Ground Truth。因为VOC一共包含20个类别,所以这里region proposal的类别为20+1=21类,1表示背景。简单说下IOU的概念,IOU是计算矩形框A、B的重合度的公式:IOU=(A∩B)/(A∪B),重合度越大,说明二者越相近。

      (2)预训练。这一步主要是因为检测问题中带标签的样本数据量比较少,难以进行大规模训练。采用的是Krizhevsky在2012年的著名网络AlexNet来学习特征,包含5个卷积层和2个全连接层,在Caffe框架下利用ILSVRC 2012的数据集进行预训练,其实就是利用大数据集训练一个分类器,这个ILSVRC 2012数据集就是著名的ImageNet比赛的数据集,也是彩色图像分类。

      (3)fine-tuning。将2中得到的样本进行尺寸变换,使得大小一致,这是由于2中得到的region proposal大小不一,所以需要将region proposal变形成227*227。本文中对所有不管什么样大小和横纵比的region proposal都直接拉伸到固定尺寸。然后作为3中预训练好的网络的输入,继续训练网络,继续训练其实就是迁移学习。另外由于ILSVRC 2012是一个1000类的数据集,而本文的数据集是21类(包括20个VOC类别和一个背景类别),迁移的时候要做修改,将最后一个全连接层的输出由1000改成21,其他结构不变。训练结束后保存f7的特征。

      (4)针对每个类别训练一个SVM的二分类器。输入是f7的特征,f7的输出维度是2000*4096,输出的是是否属于该类别,训练结果是得到SVM的权重矩阵W,W的维度是4096*20。这里负样本的选定和前面的有所不同,将IOU的阈值从0.5改成0.3,即IOU<0.3的是负样本,正样本是Ground Truth。IOU的阈值选择和前面fine-tuning不一样,主要是因为:前面fine-tuning需要大量的样本,所以设置成0.5会比较宽松。而在SVM阶段是由于SVM适用于小样本,所以设置0.3会更严格一点。

      (5)回归。用pool5的特征6*6*256维和bounding box的ground truth来训练回归,每种类型的回归器单独训练。输入是pool5的特征,以及每个样本对的坐标和长宽值。另外只对那些跟ground truth的IOU超过某个阈值且IOU最大的proposal回归,其余的region proposal不参与。详细说一下:对于某个region proposal:R,以及其对应的Ground truth:G,我们希望预测结果是:P,那么我们肯定希望P尽可能接近G。这里通过对pool5层的特征X做线性变换WX得到变换函数F(X),这些变换函数作用于R的坐标达到回归的作用(包括对x,y的平移以及对w,h的缩放)。因此损失函数可以表达为:R和G的差距减去P和G的差距要尽可能小。

    3、R-CNN模型的测试过程分析

      (1)输入一张图像,利用Selective Search得到2000个Region Proposal。

      (2)对所有Region Proposal变换到固定尺寸(227*227),然后将所有建议框像素减去该建议框像素平均值后【预处理操作】,并作为已训练好的CNN网络的输入,得到f7层的4096维特征【比以前的人工经验特征低两个数量级】,所以f7层的输出是2000*4096。

      (3)对每个类别,采用已训练好的这个类别的svm分类器对提取到的特征打分(Feature Scores),所以SVM的Weight Matrix是4096*N,N是类别数,这里一共有20个SVM,N=20注意不是21。得分矩阵是2000*20,表示每个Region Proposal属于某一类的得分。

      (4)采用Non-Maximun Suppression(NMS)对得分矩阵中的每一列中的Region Proposal进行剔除,就是去掉重复率比较高的几个Region Proposal,得到该列中得分最高的几个Region Rroposal。NMS的意思是:举个例子,对于2000*20中的某一列得分,找到分数最高的一个Region Proposal,然后只要该列中其他Region Proposal和分数最高的IOU超过某一个阈值,则剔除该Region Proposal。这一轮剔除完后,再从剩下的Region Proposal找到分数最高的,然后计算别的Region Proposal和该分数最高的IOU是否超过阈值,超过的继续剔除,直到没有剩下Region Proposal。对每一列都这样操作,这样最终每一列(即每个类别)都可以得到一些rRegion Proposal。

      (5)用N=20个回归器对第4步得到的20个类别的region proposal进行回归,要用到pool5层的特征。pool5特征的权重W是在训练阶段的结果,测试的时候直接用。最后得到每个类别的修正后的Bounding-box。

    4、R-CNN存在的明显问题(后续网络改进的点)

      (1)每张图像需要提前提取2000个候选区域(Region Proposal),占用较大的磁盘空间(Memory);

      (2)针对传统CNN需要固定尺寸(227*227)的输入图像,crop/warp(归一化)产生物体截断或拉伸,会导致输入CNN的信息丢失;

      (3)每一个Region Proposal都需要进入CNN网络计算,上千个Region存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。

     
    5、关于R-CNN的一些细节性问题

      1)速度问题

        经典的目标检测算法使用滑窗法依次判断所有可能的区域。本文采用选择性搜索(Selective Search)则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断。

      (2)训练集问题

        (a)经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG)。本文则需要训练深度网络进行特征提取。可供使用的有两个数据库: 

        (b)一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。 

        (c)一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
       本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。

      (3)直接使用AlexNet做特征提取,省去fine-tune阶段可以吗?

        这个是可以的,你可以不重新训练CNN,直接采用Alexnet模型,提取出pool5、或者FC6、FC7的特征,作为特征向量,然后进行训练SVM,只不过这样精度会比较低。那么问题又来了,没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?我们有可以选择pool5、FC6、FC7,这三层的神经元个数分别是9216、4096、4096。从pool5(6*6*256)到FC6这层的参数个数是:9216*4096 ,从f6到f7的参数是4096*4096。那么具体是选择p5、还是f6,又或者是f7呢?

        Paper给我们证明了一个结论,如果你不进行fine-tuning,也就是你直接把Alexnet模型当做特征提取器使用,类似于HOG、SIFT一样做特征提取,不针对特定的任务。然后把提取的特征用于分类,结果发现pool5的精度竟然跟FC6、FC7差不多,而且FC6提取到的特征还比FC7的精度略高;如果你进行fine-tuning了,那么FC7、FC6的提取到的特征最后训练出来的svm分类器的精度就会大幅提高。

        鉴于此让我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT提取特征一样,可以用于提取各种图片的基础特征,而FC6、FC7所学习到的特征是用于针对特定任务的特征(高级抽象特征)。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对特殊个体分类的特征了。

       (4)在fine-tune训练的时候最后一层本来就是softmax分类层,那么为什么(闲的蛋疼)作者要利用CNN做特征提取(提取FC7层数据),然后再把提取的特征用于训练SVM分类器呢?

         这个是因为SVM训练和CNN训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用SVM精度低。事情是这样的,CNN在训练的时候,对训练数据做了比较宽松的标注,比如一个Bounding-box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练CNN;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据(不太理解,不是一样使用32个正样本,96个负样本吗?),所以在CNN训练阶段我们是对Bounding-box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);

        然而svm训练的时候,因为SVM适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当Bounding-box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。

  • 相关阅读:
    深度学习面试题27:非对称卷积(Asymmetric Convolutions)
    深度学习面试题26:GoogLeNet(Inception V2)
    深度学习面试题25:分离卷积(separable卷积)
    深度学习面试题24:在每个深度上分别卷积(depthwise卷积)
    深度学习面试题23:批次张量和卷积核的简易定义方式
    深度学习面试题22:批量归一化在实践中的应用
    深度学习面试题21:批量归一化(Batch Normalization,BN)
    Docker安装ElasticSearch 版本7.1.1
    Go语言入门——hello world
    eclipse下配置GO语言的开发环境
  • 原文地址:https://www.cnblogs.com/xiaoboge/p/10552042.html
Copyright © 2011-2022 走看看