CVPR
之前刚开始接触目标检测算法的时候,老是分不清deep learning中,物体检测和图片分类算法上的区别,弄得我头好晕,终于在这篇paper上,看到了解释。物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点物体检测是要把所有图片中的物体都识别定位出来。
文章目录
1 Motivation2 Innovation3 思想4 Method4.1 候选区域生成4.1.1 合并规则4.1.2 多样化与后处理4.1.3 缩放4.2 特征提取4.3 线性分类器4.4 位置精修5 RCNN训练5.1 训练CNN5.2 训练SVM5.3 训练Bounding box回归模型6 测试7 总结8 问题解答补充知识1 非极大值抑制2 VOC物体检测任务Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作。作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,更带领团队获得终身成就奖,如今供职于Facebook旗下的FAIR。 这篇文章思路简洁,在DPM方法多年平台期后,效果提高显著。包括本文在内的一系列目标检测算法:RCNN, Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码。
1 Motivation
传统方法(SIFT、HOG)在PASCAL VOC 上达到稳定,都是基于ensemble systems that typically combine multiple low-level image features with high-level context
-都是对SIFT HOG 的组合和修改,都是基于皮质区(cortical area)V1的特征,其实有更高层的结构,新感知机(neocognitron)用到了这种分层的思想,但是缺乏监督训练的算法,1998年LeCun的LeNet-5(stochastic gradient descent via backpropagation)优越的表现让人看到了希望,不过被SVM抢了头条,AlexNet 在(ImageNet Large Scale Visual Recognition Challenge(ILSVRC))中让CNN焕发新春
To what extent do the CNNclassificationresults on ImageNet generalize toobject detectionresults on the PASCAL VOC Challenge?
2 Innovation
one can apply high-capacity convolutional neural networks (CNNs) to bottom-up region proposals in order to localize and segment objects
作者提出 R-CNN: Regions with CNN features,提升mAP 30%(53.3%) in VOC
when labeled training data is scarce, supervised pre-training for an auxiliary task(ILSVRC), followed by domain-specific fine-tuning(PASCAL), yields a significant performance boost.
3 思想
本文解决了目标检测中的两个关键问题。
问题一:速度
经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断。
问题二:训练集
经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG)。本文则需要训练深度网络进行特征提取。可供使用的有两个数据库:
一个较大的识别库(ImageNet ILSVC ):标定每张图片中物体的类别。一千万图像,1000类。
一个较小的检测库(PASCAL VOC ):标定每张图片中,物体的类别和位置。一万图像,20类。
本文使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
4 Method
RCNN 主要作用就是用于物体检测,就是首先通过selective search 选择2000个候选区域,这些区域中有我们需要的所对应的物体的bounding-box,然后对于每一个region proposal 都wrap到固定的大小的scale,227*227(AlexNet Input),对于每一个处理之后的图片,把他都放到CNN上去进行特征提取,得到每个region proposal的feature map,这些特征用固定长度的特征集合feature vector来表示。
it is natural to extend RCNN to the task ofsemantic segmentation.
system consists of three(four) modules (加一个bbox regression)
generates category-independent region proposals (selective search,一张图像生成1K~2K个候选区域 )CNN(对每个候选区域,使用深度网络提取特征 )classspecific linear SVMs(特征送入每一类的SVM 分类器,判别是否属于该类 )bbox regression(使用回归器精细修正候选框位置)
4.1 候选区域生成
使用了Selective Search方法从一张图像生成约2000-3000个候选区域。基本思路如下:
使用一种过分割手段,将图像分割成小区域 查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置输出所有曾经存在过的区域,所谓候选区域
候选区域生成和后续步骤相对独立,实际可以使用任意算法进行。
4.1.1 合并规则
优先合并以下四种区域:
颜色(颜色直方图)相近的纹理(梯度直方图)相近的合并后总面积小的合并后,总面积在其BBOX中所占比例大的
第三条,保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。
例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。
不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。
第四条,保证合并后形状规则。
例:左图适于合并,右图不适于合并。
上述四条规则只涉及区域的颜色直方图、纹理直方图、面积和位置。合并后的区域特征可以直接由子区域特征计算而来,速度较快。
4.1.2 多样化与后处理
为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。
作者提供了Selective Search的源码,内含较多.p文件和.mex文件,难以细查具体实现。
4.1.3 缩放
然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search得到的是矩形框,paper试验了两种不同的处理方法:
(1) 各向异性缩放
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;
(2) 各向同性缩放
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图©所示;
对于上面的异性、同性缩放,文献还有个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讲解阶段我再具体讲解。
4.2 特征提取
这里的特征提取算法其实就是卷积神经网络,R-CNN中使用的是AlexNet,Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
但是作者(Ross)并没有把AlexNet当做分类器来使用,而是只用了网络的特征层做 ss 算法输出的图像的特征提取工作,然后第7层特征给了SVM分类器,第5层特征给了Bounding Box回归模型。
简化图。
4.3 线性分类器
R-CNN使用了线性SVM分类器,需要说明的是,目标检测任务是有分类的功能的,比如一个任务是检测猫和狗,那么除了要框出猫和狗的位置之外,也需要判断是猫还是狗,这也是SVM在R-CNN中的作用。所以待检测物体有几类,那么就应该有几个二分类的SVM分类器,在上面的例子中,就需要两个二分类分类器了,分别是“猫-非猫”模型和“狗-非狗”模型,在R-CNN中,分类器有20个,它的输入特征是AlexNet提取到的 fc7 层特征。
正样本
本类的真值标定框。
负样本
考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本,由于负样本很多,使用hard negative mining方法。
4.4 位置精修
目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
回归器
对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。 输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
Bounding box也 是个古老的话题了,计算机视觉常见任务中,在分类与检测之间还有一个定位任务,在一副图像中只有一个目标,然后把这个目标框出来,用到的就是Bounding box回归模型。
在R-CNN中,Bounding box regression 的作用是修正 ss 推荐的区域的边界,输入的特征是 AlexNet的第五层特征,与SVM分类器一样,它也是每一个类别都有一个模型,一共20个。
我们分别介绍了R-CNN的四个部分和他们的作用,可以看到,其实都是之前的东西,但是R-CNN的成功之处在于找到一种训练与测试的方法,把这四个部分结合了起来,而准确率大幅提升的原因在于CNN的引入。我们参考下 HOG+SVM做行人检测的方法,HOG就是一种手工特征,而在R-CNN中换成了CNN提取特征
5 RCNN训练
R-CNN训练了CNN,SVM与Bounding box三个模型,因为ss算法用不着训练,哈哈^.^ 。ss在生成了1000-2000个推荐区域之后,就和训练任务没啥关系了,训练样本是由ss区域生成出来的子图构建起来的。 而且三个部分的训练时独立的,并没有整合在一起。
5.1 训练CNN
CNN是在ImageNet上pre-train的AlexNet模型,在R-CNN中进行fine-tune,fine-tune的过程是将AlexNet的Softmax改为任务需要的类别数,然后还是当做一个分类模型来训练,训练样本的构建使用ss生成的子图,当这些图与实际样本的框(Ground-truth)的IoU大于等于0.5时,认为是某一个类的正样本,这样的类一共有20个;IoU小于0.5时,认为是负样本。然后就可以AlexNet做pre-train了,pre-train之后AlexNet的Softmax层就被扔掉了,只剩下训练后的参数,这套参数就用来做特征提取。
a、网络有监督预训练阶段
参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这边文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。
网络优化求解:采用随机梯度下降法,学习速率大小为0.001;
b、fine-tuning阶段
“fine-runing”,主要就是对上面得到的model进行稍微的改动。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个是正样本、96个是负样本(正负样本的定义前面已经提过,不再解释)。
5.2 训练SVM
之前提到了,SVM的输入特征是AlexNet fc7的输出,然后SVM做二分类,一个有20个SVM模型。那么对于其中某一个分类器来说,它的正样本是所有Ground-truth区域经过AlexNet后输出的特征,负样本是与Ground-truth区域重合IoU小于0.3的区域经过AlexNet后输出的特征,特征和标签确定了,就可以训练SVM了。
5.3 训练Bounding box回归模型
Bounding box回归模型也是20个,还是拿其中一个来说,它的输入是AlexNet conv5的特征,注意这里的20指的是类的个数,但是对一个Bounding box来说,它有4套参数,因为一个Bounding box回归模型分别对4个数做回归,这4个数是表征边界框的四个值,模型的损失函数如下:
i 是样本个数,*就是4个数,他们分别是x,y,w,h,其中(x,y)是中心位置,(w,h)是宽和高;P是ss给出来的区域,它由Px,Py,Pw,Ph四个数决定,这个区域经过AlexNet后再第五层输出特征,然后在特征每一个维度前都训练一个参数w,一组特征就有一组w,随4组做回归就有4组w;最后一个数就是 t,它同样有4个数 tx,ty,tw,th,是这样计算出来的:
而G就是经过修正后的边界框,它还是4个数Gx,Gy,Gw,Gh。通过上面的公式可以看到,t是边界框的偏差。 最后就是到底什么样的ss区域能够作为输入,在这里是IoU大于0.6的。 用一句话总结Bounding box回归模型就是:对于某一个类的回归模型而言,用IoU>0.6的 ss 区域经过卷积后作为输入特征,用同一组特征分别训练4组权值与之对应,对边界框四个属性值分别做回归。
如何根据Bounding box模型的输出做出修正:
模型输出是四个值的偏差(比例),那么根据如下公式就能够得到最后的位置 :
经过上面三个独立的部分,R-CNN的训练就完成了,可以看到,确实是非常麻烦,这不仅仅体现在速度慢上,过程也及其繁琐,因为每一步都需要重新构建样本。
6 测试
ss算法提取1000-2000个区域;对所有的区域做尺寸统一,为了CNN网络能接受;用AlexNet网络提出两套特征,一个是fc7层的,一个是con5层的;对于一个fc7区域的特征,分别过20个分类器,看看哪个分类器给的分数最高,以确定区域的类别,并把所有的区域一次操作;对上述所有打好label的区域使用非极大值抑制操作,以获取没有冗余(重叠)的区域子集,经过非极大值抑制之后,就认为剩下的所有的区域都是最后要框出来的;重新拿回第5步剩下的区域con5层的特征,送入Bounding box模型,根据模型的输出做出一次修正;根据SVM的结果打标签,根据修正的结果画框;结束!!!!!!7 总结
论文发表的,DPM已经进入瓶颈期,即使使用复杂的特征和结构得到的提升也十分有限。本文将深度学习引入检测领域,一举将PASCAL VOC上的检测率从35.1%提升到53.7%。
本文的前两个步骤(候选区域提取+特征提取)与待检测类别无关,可以在不同类之间共用。这两步在GPU上约需13秒。
同时检测多类时,需要倍增的只有后两步骤(判别+精修),都是简单的线性运算,速度很快。这两步对于100K类别只需10秒。以本论文为基础,后续的fast RCNN和faster RCNN在速度上有突飞猛进的发展,基本解决了PASCAL VOC上的目标检测问题。
总之感觉:r-cnn有点麻烦,他要先过一次classification得到分类的model,继而在得到的model上进行适当的改变又得到了detection的model,最后才开始在detection model cnn上进行边界检测。
好麻烦,因为rcnn首先需要在AlexNet上进行分类的训练model,得到AlexNet之后才能进行分类(Pretrained procedure->SoftMax2SVM)。分类之后在改一下AxlexNet model (fc: 1000->21)得到detection model(training)->(testing)
然后在上面利用SVM进行二分类判断当前的region有没有包含我们需要的物体(对结果进行排序,取前面的IOU最大的那几个(nms)),在对这些进行canny边缘检测,才可以得到bounding-box(then B-BoxRegression)。
nms——非极大值抑制
迭代-抑制-消除 的过程
第一步,对所有的框根据置信度进行排序,从低到高放到一个列表里面,从列表中取出当前置信度最高的,作为目标,把还在列表内的框与目标框进行比较,如果重合度大于阈值,就将该框从列表内删去,遍历整个列表。然后再取出当前置信度最高的,重复上述操作,知道这个列表最终变空。
简单地说:
就是r-cnn需要两次进行跑cnn model,第一次得到classification的结果,第二次才能得到(nms+b-box regression)bounding-box。
但是r-cnn也不是一事无成,人家还是有自己的特点嘛,就提在原来的架构上提出为啥不用CNN来进行特征提取,而是用那些老套的sift,hog呢?当然科研界的大牛还是很厉害的啦,在r-cnn的基础上就提出了fast-rcnn,它解决了rcnn中跑了两次cnn才分别得到classification和bounding-box,牛掰之处在于ROI层的提出.
8 问题解答
OK,看完上面的CNN过程后,我们会有一些细节方面的疑问。首先,反正CNN都是用于提取特征,那么我直接用Alexnet做特征提取,省去fine-tuning阶段可以吗?这个是可以的,你可以不需重新训练CNN,直接采用Alexnet模型,提取出p5、或者f6、f7的特征,作为特征向量,然后进行训练svm,只不过这样精度会比较低。那么问题又来了,没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?我们有可以选择p5、f6、f7,这三层的神经元个数分别是9216、4096、4096。从 p5 到 p6 这层的参数个数是:4096*9216 ,从 f6 到 f7 的参数是 4096∗40964096*40964096∗4096。那么具体是选择 p5、还是 f6,又或者是 f7 呢?
文献paper给我们证明了一个理论,如果你不进行fine-tuning,也就是你直接把Alexnet模型当做万金油使用,类似于 HOG、SIFT一样做特征提取,不针对特定的任务。然后把提取的特征用于分类,结果发现p5的精度竟然跟f6、f7差不多,而且f6提取到的特征还比 f7 的精度略高;如果你进行fine-tuning 了,那么 f7、f6 的提取到的特征最会训练的 svm 分类器的精度就会飙涨。
据此我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而 f6、f7 所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。
还有另外一个疑问:CNN 训练的时候,本来就是对 bounding box 的物体进行识别分类训练,是一个端到端的任务,在训练的时候最后一层softmax就是分类层,那么为什么作者闲着没事干要先用 CNN 做特征提取(提取fc7层数据),然后再把提取的特征用于训练 svm 分类器?这个是因为svm 训练和 cnn 训练过程的正负样本定义方式各有不同,导致最后采用 CNN softmax 输出比采用 svm 精度还低。
事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN 容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);
然而svm训练的时候,因为 svm 适用于少样本训练,所以对于训练样本数据的 IOU 要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm,具体请看下文。
补充知识
1 非极大值抑制
因为一会儿讲RCNN算法,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有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是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
2 VOC物体检测任务
这就相当于一个竞赛,包含了20个物体类别
http://host.robots.ox.ac.uk/pascal/VOC/voc/examples/index.html (PASCAL VOC)还有一个背景,总共就相当于21个类别,具体类别如下。
Aeroplanes
Bicycles
Birds
Boats
Bottles
Buses
Cars
Cats
Chairs
Cows
Dining tables
Dogs
Horses
Motorbikes
People
Potted plants
Sheep
Sofas
Trains
TV/Monitors
+
background
因此一会设计fine-tuning CNN的时候,我们softmax分类输出层为21个神经元。
转载
【目标检测】RCNN算法详解
RCNN学习笔记(1):Rich feature hierarchies for accurate object detection and semantic segmentation
Rich feature hierarchies for accurate object detection and semantic segmentation
Object Detection R-CNN