概述

Ross Girshick在2014年的CVPR上发表论文-《Rich
feature hierarchies for accurate oject detection and semantic segmentation》,首次提出R-CNN算法(可用于目标检测(要识别类别和位置)和语义分割)。可以说改变了目标检测领域的主要研究思路,紧随其后的系列文章:Fast-RCNN ,Faster-RCNN都沿袭R-CNN的思路。

在RCNN之前,overfeat已经是用深度学习的方法做目标检测,但RCNN是第一个可以真正可以工业级应用的解决方案。在 Pascal VOC 2012 的数据集上,能够将目标检测的验证指标 mAP 提升到 53.3%,这相对于之前最好的结果提升了整整 30%。

基础

SS算法(selective search算法)

用于解决数据量少的问题,主要是对一张图片预先提取1k~2k个较可能是物体的候选区域。

实现步骤:

  1. 使用基于图的图像分割方法进行过分割,将图片分割为很多小区域R(我理解的其中会有重合)。
  2. 初始化一个相似集合为空集:S 。
  3. 计算所有相邻区域(挨着或者有重合都算是相邻)之间的相似度(相似度函数如何构造之后会解释),放入集合 S 中,集合S保存的其实是一个区域对以及它们之间的相似度。
  4. 找出 S 中相似度最高的区域对,将它们合并,并将这个新合并的区域放入集合 R 中(每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框),并从 S 中删除与它们相关的所有相似度和区域对。
  5. 重新计算这个新区域与周围区域的相似度,放入集合 S 中。
  6. 重复第3、4、5步骤直到 S 为空。
  7. 从 R 中找出所有区域的 bounding box(外切矩形),这些 box 就是物体可能的候选区域。
    在ILSVRC13 的数据上,SS得到的region中,相对ground-truth的bbox来说,有91.6%的召回率;而对PASCAL VOC的数据,则有98%。

非极大值抑制(non-maximun suppression,NMS。论文只用于测试阶段)

通过算法我们可以找到一系列可能是物体的矩形框,这时需要非极大值抑制操作去除得分较低的候选框以减少重叠框。。

下面举一个例子

rcnn 是预训练模型吗_rcnn 是预训练模型吗

对于上图,假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值。

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

IOU值

定位精度评价公式

rcnn 是预训练模型吗_缩放_02

回归器

首先要明确目标检测不仅是要对目标进行识别,还要完成定位任务,所以最终获得的bounding-box也决定了目标检测的精度。

如下图所示,绿色框为实际标准的卡宴车辆框,即Ground Truth;黄色框为selective search算法得出的建议框,即Region Proposal。即使黄色框中物体被分类器识别为卡宴车辆,但是由于绿色框和黄色框IOU值并不大,所以最后的目标检测精度并不高。采用回归器是为了对建议框进行校正,使得校正后的Region Proposal与selective search更接近, 以提高最终的检测精度。论文中采用bounding-box回归使mAP提高了3~4%。

rcnn 是预训练模型吗_rcnn 是预训练模型吗_03

下面进行回归器设计

rcnn 是预训练模型吗_相似度_04

如上图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框GroundTruth,红色窗口表示Region Proposal进行回归后的预测窗口。现在的目标是找到P到的线性变换【当Region Proposal与Ground Truth的IoU>0.6时可以认为是线性变换】,使得与G越相近,这就相当于一个简单的可以用最小二乘法解决的线性回归问题。

具体定义符号和公式,如下:

rcnn 是预训练模型吗_计算机视觉_05

大致脉络

下面先大致讲述一下R-CNN的整体思路。

数据库

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

一个较小的检测库(PASCAL VOC 2007):标定每张图片中,含有物体的类别标签和位置标签。一万图像,20类。

本文使用识别库进行预训练,而后使用检测库调优参数,最后在检测库上评测。

训练阶段

  1. 首先对于PASCAL VOC 2007数据库中的图片,利用SS算法,提取出候选区域,并且将各个区域扩展到固定尺寸227*227。
  2. 其次,在特征提取阶段,选取AlexNet网络,分为预训练阶段、微调阶段。在预训练阶段,首先利用ImageNet ILSVC 2012数据,对AlexNet网络模型参数进行预训练;在微调阶段,首先将AlexNet网络的softmax个数由1000变为21,该层参数初始化,其余层参数保留,然后利用候选区域数据进行参数微调。
  3. 其次,在分类阶段,提取出4096维特征向量,利用SVM进行分类。每一类训练一个SVM分类器,进行分类识别。
  4. 最后,在位置精修阶段。每一类训练一个线性脊回归线,对候选框位置进行精修。

整体流程如下图:

rcnn 是预训练模型吗_特征提取_06

在测试阶段

  1. 对于PASCAL VOC 2007数据库中的图片,利用SS算法,提取出候选区域,并且将各个区域扩展到固定尺寸227*227。
  2. 其次通过训练好的AlexNet网络进行特征提取,即选取fc7的4096维特征向量。
  3. 其次将特征向量输入到SVM中,得到每一类的概率。
  4. 其次利用非极大值抑制(NMS),再排除一些候选框。
  5. 最后,对于剩下的候选框,利用训练好的线性脊回归器进行位置精修。

细节部分

下面详细叙述算法

数据

可供使用的有两个数据库:

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

一个较小的检测库(PASCAL VOC 2007):标定每张图片中,含有物体的类别标签和位置标签。一万图像,20类(用于微调)。

训练

一.候选区域生成(一张图片大约生成1k~2k个候选区域)

  1. 使用基于图的图像分割方法,将图片分割为很多小区域R,就是进行过分割(我理解的其中会有重合,大约1k~2k)
  2. 初始化一个相似集合为空集:S 。
  3. 计算所有相邻区域(挨着或者有重合都算是相邻)之间的相似度(相似度函数之后会重点分析),放入集合 S 中,集合S保存的其实是一个区域对以及它们之间的相似度。其中相似度作者考虑了颜色、纹理、尺寸(保证尺寸相近的区域融合)、空间重叠度(保证融合后区域形状规则)四个特征,然后将其进行融合。
  4. 找出 S 中相似度最高的区域对,将它们合并,并将这个新合并的区域放入集合 R 中(每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框),并从 S 中删除与它们相关的所有相似度和区域对。
  5. 重新计算这个新区域与周围区域的相似度,放入集合 S 中。
  6. 重复第3、4、5步骤直到 S 为空。
  7. 从 R 中找出所有区域的 bounding box(外切矩形),这些 box 就是物体可能的候选区域。

二. 图片缩放

由于特征提取阶段为非全卷积网络,所以输入图片尺寸固定-22*227,而候选框尺寸大小不一,所以需要进行图片缩放。论文作者进行了两种不同的处理方式:

(1) 各向异性缩放

这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;

rcnn 是预训练模型吗_计算机视觉_07

(2)
各向同性缩放。主要采取两种方法:

其一:先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如上图(B)所示;

其二:先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图©所示。

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

CNN特征提取

主要分为预训练和微调两个阶段

网络架构设计

可选择AlexNet(准确率58.8%)或VGG16(准确率66%)。这里为了叙述简单,选取AlexNet架构。

rcnn 是预训练模型吗_缩放_08

预训练阶段

数据选取-ImageNet ILSVC 2012,包含一千万张图像,1000类。

rcnn 是预训练模型吗_特征提取_09

此时进行简单的图片分类任务,对网络参数进行预训练。在Alexnet中p5层神经元个数为9216, fc6、fc7的神经元个数都是4096。

微调阶段
  1. 数据处理-对原数据PASCAL VOC 2007(包含物体的类别和位置。一万图像,20类)通过SS算法提取出来候选框,再进行尺寸缩放到227*227。对这些缩放完的候选框,ground-truth bbox本身及和ground-truth bbox的IOU>=0.5则被认为是该ground-truth bbox对应类别的正样本,而其余的IOU < 0.5都被视作负样本,即代表background的样本。
  2. rcnn 是预训练模型吗_相似度_10

  3. 网络框架调整

由于预训练阶段,类别为1000,而此时类别为20类,加上背景,此时为21类。所以需要将softmax层的输出由1000变为21,参数初始化;其余层参数保留预训练的结果。

  1. 输入,设置为batch_size=128,正样本32,负样本96。
  2. 输出,21维向量(每一维代表该候选框属于该类别的概率)

最后,当网络训练完毕后,需要提取特征,即每个输入候选框图片于fc7层输出的一个4096维的特征向量。

四.分类判别

训练样本

提取网络中fc7层的输出(4096维)向量,其中ground-truth bbox是该ground-truth bbox对应类别的正样本,而和ground-truth bbox的IOU<0.3都被视作负样本,即代表background的样本。论文中作者尝试了阈值0.1、0.2、0.3、0.4、0.5,发现0.3效果最优。

rcnn 是预训练模型吗_rcnn 是预训练模型吗_11

模型

由于SVM是二分类器,需要为每个类别训练单独的SVM;SVM训练时输入正负样本在AlexNet CNN网络计算下fc7层的4096维特征,输出为该类的得分,训练的是SVM权重向量;由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。

假设有N个类别,则训练N个SVM二分类器。这里训练20个SVM二分类器。

举例:假若我们数据量为2000,则输入维度为20004096,然后与SVM权值矩阵4096N相乘,得到结果。如下示意图:

rcnn 是预训练模型吗_相似度_12

五.位置精修

由于许多候选框位置并不精准,所以需要通过线性脊回归器进行位置精修。

训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框。

rcnn 是预训练模型吗_特征提取_13

回归器:对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。 输入为深度网络pool5层的特征,输出为xy方向的缩放和平移。

rcnn 是预训练模型吗_特征提取_14

测试

  1. 使用selective search的方法在测试图片上提取2000个region propasals ,将每个region
    proposals归一化到227x227。
  2. 然后再在CNN中正向传播,将最后一层得到的特征提取出来,维度为2000*4096。
  3. 将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵(行:表示某个候选框,每一类别的得分; 列:表示某一类中,候选框的得分)。
  4. 分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框;,这里的阈值IOU自己设定。
    ① 对2000×20维矩阵中每列按从大到小进行排序;
    ② 从每列最大的得分建议框开始,分别与该列后面的得分建议框进行IoU计算,若IoU>阈值,则剔除得分较小的建议框,否则认为图像中存在多个同一类物体;
    ③ 从每列次大的得分建议框开始,重复步骤②;
    ④ 重复步骤③直到遍历完该列所有建议框;
    ⑤ 遍历完2000×20维矩阵所有列,即所有物体种类都做一遍非极大值抑制;
    ⑥ 最后剔除各个类别中剩余建议框得分少于该类别阈值的建议框。
  5. 分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。

解释分析

什么叫有监督预训练?为什么要进行有监督预训练?

有监督预训练也称之为迁移学习,举例说明:若有大量标注信息的人脸年龄分类的正负样本图片,利用样本训练了CNN网络用于人脸年龄识别;现在要通过人脸进行性别识别,那么就可以去掉已经训练好的人脸年龄识别网络CNN的最后一层或几层,换成所需要的分类层,前面层的网络参数直接使用为初始化参数,修改层的网络参数随机初始化,再利用人脸性别分类的正负样本图片进行训练,得到人脸性别识别网络,这种方法就叫做有监督预训练。这种方式可以很好地解决小样本数据无法训练深层CNN网络的问题,我们都知道小样本数据训练很容易造成网络过拟合,但是在大样本训练后利用其参数初始化网络可以很好地训练小样本,这解决了小样本训练的难题。

这篇文章最大的亮点就是采用了这种思想,ILSVRC样本集上用于图片分类的含标注类别的训练集有1millon之多,总共含有1000类;而PASCAL
VOC 2007样本集上用于物体检测的含标注类别和位置信息的训练集只有10k,总共含有20类,直接用这部分数据训练容易造成过拟合,因此文中利用ILSVRC2012的训练集先进行有监督预训练。

ILSVRC 2012与PASCAL VOC 2007数据集有冗余吗?

即使图像分类与目标检测任务本质上是不同的,理论上应该不会出现数据集冗余问题,但是作者还是通过两种方式测试了PASCAL 2007测试集和ILSVRC 2012训练集、验证集的重合度:第一种方式是检查网络相册IDs,4952个PASCAL 2007测试集一共出现了31张重复图片,0.63%重复率;第二种方式是用GIST描述器匹配的方法,4952个PASCAL 2007测试集一共出现了38张重复图片【包含前面31张图片】,0.77%重复率,这说明PASCAL
2007测试集和ILSVRC 2012训练集、验证集基本上不重合,没有数据冗余问题存在。

可以不进行特定样本下的微调吗?可以直接采用AlexNet CNN网络的特征进行SVM训练吗?

文中设计了没有进行微调的对比实验,分别就AlexNet CNN网络的pool5、fc6、fc7层进行特征提取,输入SVM进行训练,这相当于把AlexNet CNN网络当做万精油使用,类似HOG、SIFT等做特征提取一样,不针对特征任务。实验结果发现f6层提取的特征比f7层的mAP还高,pool5层提取的特征与f6、f7层相比mAP差不多;

在PASCAL VOC 2007数据集上采取了微调后fc6、fc7层特征较pool5层特征用于SVM训练提升mAP十分明显;

由此作者得出结论:不针对特定任务进行微调,而将CNN当成特征提取器,pool5层得到的特征是基础特征,类似于HOG、SIFT,类似于只学习到了人脸共性特征;从fc6和fc7等全连接层中所学习到的特征是针对特征任务特定样本的特征,类似于学习到了分类性别分类年龄的个性特征。

为什么微调时和训练SVM时所采用的正负样本阈值【0.5和0.3】不一致?

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

为什么不直接采用微调后的AlexNet CNN网络最后一层SoftMax进行21分类【20类+背景】?

因为微调时和训练SVM时所采用的正负样本阈值不同,微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;并且微调阶段的负样本是随机抽样的,而SVM的负样本是经过hard negative mining方法筛选的;导致在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。

&结果怎么样

PASCAL VOC 2010测试集上实现了53.7%的mAP;
PASCAL VOC 2012测试集上实现了53.3%的mAP;
计算Region Proposals和features平均所花时间:13s/image on a GPU;53s/image on a CPU。

&还存在什么问题

很明显,最大的缺点是对一张图片的处理速度慢,这是由于一张图片中由selective
search算法得出的约2k个建议框都需要经过变形处理后由CNN前向网络计算一次特征,这其中涵盖了对一张图片中多个重复区域的重复计算,很累赘;

知乎上有人说R-CNN网络需要两次CNN前向计算,第一次得到建议框特征给SVM分类识别,第二次对非极大值抑制后的建议框再次进行CNN前向计算获得Pool5特征,以便对建议框进行回归得到更精确的bounding-box,这里文中并没有说是怎么做的,我认为也可能在计算2k个建议框的CNN特征时,在硬盘上保留了2k个建议框的Pool5特征,虽然这样做只需要一次CNN前向网络运算,但是耗费大量磁盘空间;

训练时间长,虽然文中没有明确指出具体训练时间,但由于采用RoI-centric
sampling【从所有图片的所有建议框中均匀取样】进行训练,那么每次都需要计算不同图片中不同建议框CNN特征,无法共享同一张图的CNN特征,训练速度很慢;

整个测试过程很复杂,要先提取建议框,之后提取每个建议框CNN特征,再用SVM分类,做非极大值抑制,最后做bounding-box回归才能得到图片中物体的种类以及位置信息;同样训练过程也很复杂,ILSVRC 2012上预训练CNN,PASCAL VOC
2007上微调CNN,做20类SVM分类器的训练和20类bounding-box回归器的训练;这些不连续过程必然涉及到特征存储、浪费磁盘空间等问题。

再补充自己几点总结:(1)数据总共有三个训练用途:CNN
fine-tune、SVM training、bounding-box
regression training;(2)文中作者还分析了几种可能会对实验结果产生影响的因素,建议看一看,对以后自己想问题很有帮助:三种训练集数量、数据集选择、BB、RP这几种影响因素;(3)文中作者还考虑了R-CNN和Overfeat算法的关系,并留下了如何提速R-CNN这一悬念;(4)用R-CNN来做语义分割,计算features的两种策略:fg和full以及它们如何选择;(5)发现卷积层是一个相对通用的特征提取器,而fc层更多的是针对task和数据集的不同进行自适应调整。