Rich feature hierarchies for accurate object detection and semantic segmentation
个人的理解,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)。
矩形框A和B重合度IoU表示为:
就是矩形重合部分面积占A与B的比例,即:
Non-maximum suppression(非极大值抑制)
因为一会儿讲R-CNN算法,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
(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输入(特征向量)。流程图如下:
另一个问题就是标注好的数据少,不足以训练大型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中层神经元个数为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有 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检测结果如下图:
Appendix
A. Object proposal transformation
当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这个采用的方法是传统文献的算法:《selective search for object recognition》,通过这个算法我们搜索出2000个候选框。然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search 得到的是矩形框,paper试验了两种不同的处理方法:
-
各向异性缩放
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示; -
各向同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法。
-
直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
-
先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图( C)所示;
对于上面的异性、同性缩放,文献还有个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个候选框,可以得到这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包好了4096个W),就可以得到结果了。
C. Bounding-box regression
作者使用了一个简易的bounding-box回归来提升定位准确性。在SVM给每个search proposal打分后,再使用一个具体类别的bounding-box回归器来预测bounding box。
此训练算法的输入是一个包含N个训练对的集合,代表着proposal 的中心点的像素坐标,以及的宽度和高度。每一个ground-truth bounding box G也有同样的:。目的是学习如何映射一个proposed box P 到一个ground-truth box G.
由此映射可得,
每一个函数都是proposal P在层特征的线性函数,用表示。因此我们就有,其中是模型参数。通过以下等式来学习:
对于训练对(P,G)的回归目标定义为:
在训练bounding-box回归过程中,有两个问题。一个是正则化很重要,作者设,第二个是选择训练对(P,G)很重要,P如果离ground-truth boxes太远,则从P映射到G就没有任何意义。