个人的理解,Object detection就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。Object detection要解决的问题就是物体在哪里,是什么这整个流程的问题。然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。

Object detection技术的演进:
RCNN->SppNET->Fast-RCNN->Faster-RCNN,再到SSD, R-FCN, FPN, RetinaNet和YOLOv1, YOLOv2, YOLOv3.
这篇文章这一系列论文中的第一篇。
论文地址:https://arxiv.org/pdf/1311.2524v4.pdf
这里也借鉴了前辈 hjimce 的博客:http://blog.csdn.net/hjimce/article/details/50187029

基础知识

有监督预训练与无监督预训练

  • 无监督预训练(unsupervised pre-training):无监督预训练这个名词我们比较熟悉,栈式自编码、DBM采用的都是采用无监督预训练。因为预训练阶段的样本不需要人工标注数据,所以就叫做无监督预训练。
  • 有监督预训练(supervised pre-training): 所谓的有监督预训练,我们也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务是:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇paper采用了迁移学习的思想。文献就先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络的图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段cnn模型的输出是1000个神经元,或者我们也直接可以采用Alexnet训练好的模型参数。

IoU的定义

物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。对于bounding box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IoU(intersection over union)。

R-CNN论文学习
IoU定义了两个bounding box的重叠度,如下图所示:
R-CNN论文学习

矩形框A和B重合度IoU表示为:IoU=ABAB.IoU = \frac{A \cap B}{A \cup B}.

就是矩形重合部分面积占A与B的比例,即:IoU=SiSA+SBSi.IoU = \frac{S_i}{S_A + S_B - S_i}.

Non-maximum suppression(非极大值抑制)

因为一会儿讲R-CNN算法,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:

R-CNN论文学习
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有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是我们保留下来的第二个矩形框。

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

算法总体思路

图片分类与物体检测不同,物体检测需要定位出物体的位置,这种就相当于回归问题,求解一个包含物体的方框。而图片分类其实是逻辑回归。这种方法对于单物体检测还不错,但是对于多物体检测就作用不大了。

因此论文采用的方法是:首先输入一张图片,我们先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用svm算法对各个候选框中的物体进行分类识别。也就是总个过程分为三个程序:

  • 找出候选框;
  • 利用CNN提取特征向量;
  • 利用SVM进行特征向量分类。

以下为论文内容:

Abstract

论文的方法源于两个方面的思考,(1)我们可以通过CNNs自下而上地构建region proposals来定位并分割对象;(2)当标记好的数据比较少时,可通过fine-tune在其他任务上已训练好的模型来提升表现。之所以叫R-CNN,因为它是结合了CNN和region proposals, regions with CNN features.

1. Introduction

特征很重要。之前的视觉识别任务都基于SIFT和HOG特征的使用,但是在PASCAL VOC目标检测上表现都不太令人满意。这篇论文关注在两个问题上:通过深度网络来定位目标,利用小数量标注好的检测数据来训练高性能的模型。

不像图像分类,检测需要在一幅图像中定位目标。第一种方法是把定位当作回归问题处理,第二种就是建立一个滑动窗口检测器(CNN采用的方式)。

此论文通过操作“recognition using regions”来解决CNN定位问题。首先对输入图像生成2000个与类别无关的region proposals,用CNN从每一个proposal中提取固定长度的特征向量,再通过具体类别的线性SVM对每一个region进行分类。在每一个region proposal上,作者使用affine image warping来计算固定长度的CNN输入(特征向量)。流程图如下:

R-CNN论文学习

另一个问题就是标注好的数据少,不足以训练大型CNN。传统方法就是先unsupervised pre-train, 再supervised fine-tune. 这篇论文采用的方法是,supervised pre-train, 再在小数据集上domain specific fine-tune. 这种方法表现优异。

因为R-CNN操作在region上,它也很自然地拓展到了语义分割任务上,在PASCAL VOC分割任务上表现不错。

2. Object detection with R-CNN

本文的检测系统包含三个模块。第一个模块生成类别无关的region proposals,它们为检测器定义候选检测的集合。第二个模块是CNN,用于从每个region中提取固定长度的特征向量。第三个模块是一个集合,包含着若干个具体类别的线性SVM。

2.1 Module design

  • Feature extraction:网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中pool5pool_5层神经元个数为9216,fc6、fc7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。

2.2 Test-time detection

测试时,在测试图像上通过选择性搜索来提取约2000个region proposal。Warp每一个proposal,并且将它前向传播进CNN以计算特征向量。然后,针对每一个类别,利用针对该类训练好的SVM来计算特征向量的分数。最后就有了每一张图像所有打了分的regions,再应用greedy non-maximum suppression,如果一个region与一个更高分数的region有IoU (Intersection-over-union)重合,并且超过某个阈值,就丢弃它。

Run-time analysis

两个特性使得检测效率高。其一,所有的CNN参数在所有的类别之间共享;其二,与其他常用的方法相比,CNN计算出来的特征向量维度低。

2.3 Training

  • Supervised pre-training:先在一个大的辅助性数据集(ILSVRC2012)上pre-train CNN。
  • Domain-specific fine-tuning:为了使CNN适应新的任务和新数据集(warped proposal windows),继续使用随机梯度下降(SGD)来训练CNN参数。CNN结构基本不变,除了把ImageNet CNN中1000类分类层替换为(N+1)类分类层,N是目标类别数,1是背景。对于与ground-truth box有0.5\geq 0.5 IoU的重合的region proposals,视其为正,否则为负。SGD学习率开始设为0.001,batch size为128.
  • Object category classifiers:选取IoU重合阈值很重要,低于此阈值的region设为负。重合阈值0.3是在validation set上,在{0, 0.1, …, 0.5}中使用grid search选取的。正样本就被设定为该类的ground-truth bounding boxes.
    一旦有了特征向量和标签,我们就可以优化每一类的线性SVM了。因为训练数据太大,采用标准的hard negative mining method(收敛很快)。

在PASCAL VOC 2010-12 和 ILSVRC2013检测结果如下图:

R-CNN论文学习

Appendix

A. Object proposal transformation

当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这个采用的方法是传统文献的算法:《selective search for object recognition》,通过这个算法我们搜索出2000个候选框。然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search 得到的是矩形框,paper试验了两种不同的处理方法:

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

  2. 各向同性缩放
    因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法。

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

  • 先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图( C)所示;

R-CNN论文学习

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

OK,上面处理完后,可以得到指定大小的图片,因为我们后面还要继续用这2000个候选框图片,继续训练CNN、SVM。然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此我们需要用IOU为2000个bounding box打标签,以便下一步CNN训练使用。在CNN阶段,如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。SVM阶段的正负样本标签问题,等到了svm讲解阶段我再具体讲解。

B. Positive vs. negative examples and softmax

这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包好物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后我们通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。一旦CNN f7层特征被提取出来,那么我们将为每个物体类训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到2000×40962000 \times 4096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096×N4096 \times N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包好了4096个W),就可以得到结果了。

C. Bounding-box regression

作者使用了一个简易的bounding-box回归来提升定位准确性。在SVM给每个search proposal打分后,再使用一个具体类别的bounding-box回归器来预测bounding box。
此训练算法的输入是一个包含N个训练对{(Pi,Gi)}i=1, ,N\{(P^i, G^i)\}_{i=1,\cdots,N}的集合,Pi=(Pxi,Pyi,Pwi,Phi)P^i=(P^i_x, P^i_y, P^i_w, P^i_h)代表着proposal PiP^i的中心点的像素坐标,以及PiP^i的宽度和高度。每一个ground-truth bounding box G也有同样的:G=(Gx,Gy,Gw,Gh)G=(G_x, G_y, G_w, G_h)。目的是学习如何映射一个proposed box P 到一个ground-truth box G.
由此映射可得,
G^x=Pwdx(P)+Px,\hat G_x=P_w d_x (P) + P_x,
G^y=Phdy(P)+Py,\hat G_y=P_h d_y (P) + P_y,
G^w=Pwedw(P),\hat G_w=P_w e^{d_w(P)},
G^h=Phedh(P),\hat G_h=P_h e^{d_h(P)},
每一个函数d(P)d_*(P)都是proposal P在pool5pool_5层特征的线性函数,用ϕ5(P)\phi_5(P)表示。因此我们就有d(P)=wTϕ5(P).d_*(P)=w^T_* \phi_5(P).,其中ww_*是模型参数。通过以下等式来学习ww_*:
w=argminw^iN(tiw^Tϕ5(Pi))2+λw^2.w_*=\mathop{\arg\min}_{\hat w_*} \sum_{i}^N (t_*^i-\hat w^T_* \phi_5(P^i))^2+\lambda ||\hat w_*||^2.

对于训练对(P,G)的回归目标tt_*定义为:
tx=(GxPx)/Pw,t_x = (G_x - P_x)/P_w,
ty=(GyPy)/Ph,t_y = (G_y - P_y)/P_h,
tw=log(Gw/Pw),t_w = log(G_w / P_w),
th=log(Gh/Ph).t_h = log(G_h / P_h).
在训练bounding-box回归过程中,有两个问题。一个是正则化很重要,作者设λ=1000\lambda=1000,第二个是选择训练对(P,G)很重要,P如果离ground-truth boxes太远,则从P映射到G就没有任何意义。

相关文章: