【Deep Learning】R-CNN

来源:互联网 发布:淘宝卖假货没人管吗 编辑:程序博客网 时间:2024/05/20 06:41

  最近看完了有关RCNN这几篇论文,现在将这几篇论文整理一下,这是第一篇,主要内容是对RCNN这一经典网络进行说明。

1. 综述

      自从深度学习在图像分类(识别)领域取得很好的成绩后,自然而然的会想到,能不能利用深度学习来处理 object detection(目标检测)问题呢?

      之后便出现了一系列的针对目标检测的论文与 idea,其中最早的应该是《Deep Neural Networks for Object Detect》。这篇文章的主要思想是使用深度学习来进行目标检测,比后来出现的 R-CNN,SPP-Net,Fast R-CNN 都要早一些。想法主要是将目标检测问题归结为了对目标包围矩形的掩膜的一个回归问题。

      后来最有里程碑式的论文莫过于 R-CNN 的提出,文中提出的思想在如今的目标检测中仍有指导性意义。之后的几篇文章进一步将这种思想进行“发扬光大”,主要是通过引入特殊的 pooling 策略以及对 region proposals 的处理来进一步提升检测的质量和检测的速度。其中,R-CNN,Fast R-CNN与Faster R-CNN 的关系可以引用下面这三句话来概括:

R-CNN 将 CNN 引入目标检测
Fast R-CNN 将 bounding box 和 label 统一到一个网络内
Faster R-CNN 将region proposals 也统一到一个网络内

首先给出要介绍的四篇文章的连接。
1. Rich feature hierarchies for accurate object detection and semantic segmenta
2. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
3. Fast R-CNN
4. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks


2. R-CNN

2.1 主要创新点:

  • 采用了 CNN 来代替传统方法 (SIFT、HOG 等)进行提取特征。
  • 采用了大样本下的有监督训练 + 小样本下的微调 来解决小样本难以训练甚至是容易出现过拟合的问题。

2.2 整体流程:

首先给出文论中的图:
这里写图片描述

从上图中可以看出,论文中的整体流程大致可以分为三个大部分:

  • 找出候选框
  • 利用 CNN 对这些找出的候选框提取出特征向量
  • 利用 SVM 对上述这些提取出来的特征向量进行分类

      具体来说,就是首先同过 Selective Search(下文简称 SS )方法从原图像中选取2000个候选区域,在这些被选出的区域中,有我们需要的目标的 bounding box。
      然后对于每一个通过 SS 方法选取的 region proposal 都先经过一个 warp, 也就是首先将每个选出来的部分经过一个变换,变换到 size 为 227*227大小,目的是为了适应论文中使用的 AlexNet 的输入尺寸。对于每一个经过 warp 的区域,将其送到 CNN (这里是 AlexNet)中进行特征提取,从而得到每个region proposal 的feature map,这些特征用固定长度的特征集合 feature vector 来表示。
      对于每一个类别,都会得到很多的 feature vector,这时再将这些 feature vector 送到 svm 二分类器进行类别判断,以此来判断当前的 region proposal 是背景还是所对应的类别。再对每一类的region proposal 进行非极大值抑制操作,得到这类中得分最高的一些建议框。
      最后使用20个回归其对上面的20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的 bounding box。

2.3 注意点

       1. 在将由 SS 方法提取出来的 region proposal 送入到 CNN 之前,必须先将其进行 warp 操作,也就是必须将图片放缩到 227*227 大小,以此来适应相应网络的输入限制。
      而至于相应的 warp 方法,文中进行了相关实验,最后证实直接采用各向异性直接将相应区域 scale 到相应的size 即可。具体是为了增加相应区域的上下文信息,在变形前先进行 padding=16(像素填充)处理,之后直接简单粗暴的对图像放缩到 227*227的大小。
       2.在训练阶段采用 有监督训练+微调 的方式
       在整个网络的训练阶段,不是采用将所有权重随机初始化的方式进行训练,而是通过一种”pre-trained”的机制,也就是使用之后检测提取特征使用的 CNN 网络在任意的数据集上(文中是 ILSVRC 2012)进行分类任务的训练,主要目的是为了减少检测时的训练时间。
下图即为 pre-trained 流程:
pre-trained
       之后需要做的就是进行 “fine-tuning”,也就是微调,主要目的就是为了适应任务,对上面得到的模型进行小范围的改动。首先改变的是数据集的大小,之前分类使用的数据集是比较大的数据集,主要是适用于分类任务,
这里微调主要是两部分:
 • 将分类数从1000改为21
 • 重新初始化最后一个全连接层
这里写图片描述
接下来使用的是相对较小的,并且使用的是 selective search 之后的 region proposal 作为网络的输入。
这里写图片描述
如果当前的 region proposal 的 IoU 大于 0.5,就将其标为positive,否则标记为 negative,以此来训练整个detection网络。并且对网络中的相应超参数进行相应的小幅度调整。
以对狗分类为例,如下图:
这里写图片描述
       上面的整个过程和迁移学习类似。
       3. IoU - 交并比
       IOU表示了bounding box 与 ground truth 的重叠度,如下图所示:
这里写图片描述
计算公式如下:

IOU=(A∩B)/(A∪B)

       4. bounding-box regression
       使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。具体如下图所示:
这里写图片描述
      所以,如何设计这样的回归器也就成了问题的关键。
      文中做了一个假设,当我们bounding-box 与 ground-truth 比较接近(0.6)时认为可以找到一个线性变换用来近似 ground-truth,
这里写图片描述
      我们用P表示此时的region proposal,G表示实际框,G’ 表示 region proposal 进行回归之后的预测窗口。因此现在的目标就是找到 P 到 G’ 的线性变换,从而使得G’和G越接近,这就相当于一个简单的可以用最小二乘法解决的线性回归问题。具体如下:
      首先定义 P 窗口的数学表达式,这里我们用一个四维坐标表示它的信息,即为:P(i)=(Pix,Piy,Piw,Pih),其中前两个坐标表示第 i 个窗口的中心点坐标,后两个坐标表示第 i 个窗口的宽和高的信息。同理,第 i 个窗口G可以表示为G(i)=(Gix,Giy,Giw,Gih), 第 i 个窗口的 G’ 可以表示为 G(i)=(Gix,Giy,Giw,Gih)。为了表示方便,下面的叙述中均省略上标 i.
       这里我们定义四种变换函数,分别为dx(P),dy(P),dw(P),dh(P),其中,前两个变换函数表示通过平移对 x 和 y 进行变化,后面两个变换函数通过缩放对 w 和 h 进行变化,即可以通过下面这四个式子表示:
Gx=Pwdx(p)+Px
Gy=Phdy(p)+Py
Gw=Pwexp(dw(P))
Gh=Phexp(dh(P))
       上面的式子中,每一个dp(*分别表示x, y,w,h)都是AlexNet 网络中pooling 5层 ϕ5(P)的线性函数,也就是说,有d(P)=ωTϕ5(P),这里 ωT就是回归所需要学习的回归参数。损失函数即为:
Loss=argminNi=0(tiw^TωTϕ5(P))2+λ||ω^||2
在上面的损失函数中加入了正则项是为了避免回归参数 ωT过大。其中,回归目标t由训练输入对(P,G)按照下式进行计算得来:
tx=(GxPx)/Pw
tx=(GyPy)/Ph
log(Gw/Pw)
log(Gh/Ph)
       综上,整个回归过程为:

  • 构造样本对。为了提高每类样本框回归的有效性,对每类样本都仅仅采集与 Ground-truth 相交 IoU最大的 region proposal,并且 IoU>0.6 的region proposal 作为样本对(Pi,Gi),一共产生20个样本对(20个类别)。
  • 每种类型的回归器单独训练,输入该类样本对N个{(Pi,Gi)}i=1N以及Pii=1N所对应的AlexNet网络 pool5层特征ϕ5(Pi)i=1N
  • 利用最后的四个式子和输入样本对{(Pi,Gi)}i=1N计算tii=1N
  • 利用ϕ5(Pi)i=1Ntii=1N,根据损失函数Loss进行回归计算,得到使损失函数最小的参数wT.

      5. 测试时的检测过程
大致过程如下:
- 输入一张目标图像,采用SS策略提取大约2000个建议框。
- 先在每个框周围加上16个像素值为建议框像素平均值的边框。在直接变形为227*227大小的图片。
- 先将所有建议框像素减去该建议框像素平均值后(预处理),在以此将每个227*227的建议框输入AlexNet 网络获取到4096维的特征,2000个建议框的CNN特征组合成2000*4096 的矩阵;
- 2000*4096维特征与20个SVM组成的权值矩阵4096*20相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000*20维矩阵表示每个建议框是某个物体类别的得分。
- 分别对上述2000*20维矩阵中每一列也就是每一类进行非极大值抑制以此来剔除重叠建议框,得到该列即类中得分最高的一些建议框;
- 分别用20个回归器对上述20各类别中剩余的建议框进行回归操作,最终得到的每个类别的修正后的得分最高的bounding box.
下面引用 Alanyannick 博客中的两段话

测试阶段的检测:
测试阶段,使用 selective search的方法在测试图片上提取2000个region proposals归一化到227*227,然后在CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值一直去除相交的多余的框。非极大值抑制(NMS)首先计算出每一个 bounding box 的面积,然后分局score进行排序,把score最大的bounding box 作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定阈值的 bounding box。然后重复上面的过程,直到候选bounding box为空,然后再将 score小于一定阈值的选定框删除得到一类的结果。

总之,整个网络需要首先在AlexNet 上进行分类的训练model,得到AlexNet之后才能进行分类。分类之后再盖一下AlexNet model(fc:1000->21)得到detection model(training->test).然后在上面利用SVM进行二分类判断当前的region 有没有我们需要的物体(对结果进行排序,取前面的IoU最大的那几个),再对这些进行canny边缘检测,才可以得到bounding-box。(then B-Box regression)。
简单地说,RCNN需要两次进行跑CNN model,第一次得到 classification的结果,第二次才能得到(nms+b-box regression)bounding box.

个人总结:
因为我还没有看这篇论文的源码,因此整体流程和具体实现细节上可能理解的还不能足够到位,后期看过源码后会将源码列出然后再对整体流程和局部细节进行说明。
这里写图片描述
就我目前的理解来说,RCNN的训练流程为:
a.首先pre-trained出一个CNN model,将其权重和参数保留
b.使用SS方法从每张图片中提取出2000个region proposals并进行归一化(227*227),将这些region proposals 输入到预训练好的网络中,但是将网络的最后一个全连接层的权重重新进行初始化,并将softmax 改为20+1类的线性SVM进行分类。
c.对每一个region proposal进行特征提取并利用SVM进行分类训练,分类后进行NMS去除IoU小于阈值的框,其中这里涉及到SVM正负样本的选择问题,具体可以查看上面的内容。

这里写图片描述

d.为了对最后得到的精细的框,在pool5层输出特征后对每一类训练一个bounding box regression,训练的具体方法上面已经叙述过。需要注意的是,这一步和上一步在训练过程中是并行的,我们要为每一类的框训练一个线性回归器,用来对最后的位置进行精修

RCNN的test的流程为:
a.首先使用SS方法在测试图片上提取2000个region proposal,并进行归一化.
b.在CNN中进行正向传播,将最后一层得到的特征提取出来。
c.对于每一个类别,使用为这一类训练的SVM匪类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,在使用非极大值抑制去除多余的框。
d.将score小于一定阈值的选定框删除得到一类的结果。

3.优缺点

优点:

  • 作为这个系列的开篇之作,最大的意义就在于提出了将region proposal 与 用在分类任务上的 CNN 模型结合,为之后的想法与检测目标提出了指导性的意义。

缺点:

  • 训练步骤过于繁琐(微调网络+训练SVM+训练b-box regression)
  • 由于采用SS方法用来region proposal再进行训练和测试,导致二者的速度都过于缓慢
  • region proposal 与后面的网络以及分类(回归)均不在一个pipeline中,也就是说,这个框架并不是一个整体,而是由几个部分共同组成。
  • 训练过程占用大量存储空间

参考内容

1.基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
2.RCNN学习笔记(1)
3.RCNN学习笔记(1)

原创粉丝点击