目标检测论文解读1:(RCNN解读)Rich feature hierarchies for accurate object detection...

一、番外说明

大家好,我是小P,今天和大家一起学习目标检测领域的经典文章-RCNN,希望大家支持和喜欢。此外,对“目标检测/模型压缩/语义分割”感兴趣的小伙伴,欢迎加入QQ群 813221712 讨论交流,进群请看群公告!
点击链接加入群聊【Object Detection】:https://jq.qq.com/?_wv=1027&k=5kXCXF8

二、资料推荐

1、本文相关资料推荐

注:为方便下载,部分资源已上传百度网盘,点击即可下载,若网盘失效,望告知!
①论文原著地址:https://pan.baidu.com/s/1Lj-ZQYG4h1FKH-cTmdRbgg
②中英对照翻译:https://pan.baidu.com/s/15EA2A-JDc_D7L1Af2_ACeA
③官方源码地址:http://www.cs.berkeley.edu/˜rbg/rcnn
④其他版本代码:https://github.com/Liu-Yicheng/R-CNN

三、基础知识

1、目标分类 VS 目标检测 VS 语义分割 VS 实例分割

千言万语,不如一张图来的直接(此处以行人为例进行说明)!如下图所示:
计算机视觉典型任务实例图
(a)图表示目标分类,模型只需告诉你该图片的主体对象是什么类别,人?车?类似的常用数据集有cifar10、cifar100、MNIST、猫狗大战、ImageNet等。此外,模型往往会给出 Top_k 的概率,即该图片中对象有可能的类别排序,通常的评测指标也分 Top_1 和 Top_5。目标分类的结果为:给图片整体打一个标签。

(b)图表示目标检测,该任务可以描述为两个子任务。首先,这张图片中哪儿有对象?这是定位问题,其次,该对象属于什么类别?这是分类问题。目标检测任务相对于目标分类来说更复杂,主要体现在需要额外的位置信息,而且一张图片可能出现的对象种类和个数通常不止一个和一类。常用的目标检测数据集有:VOC、COCO、KITTI、伯克利等。目标检测的结果为:用矩形框或其它形式标识出图片中的对象,同时说明该对象的类别。

(c)图表示语义分割,这是一种基于像素级别的分类问题,即确定图片中的每一个像素点属于何种类别。常用的语义分割数据集有:VOC、Cityscapes等。语义分割的结果为:一张图片的像素类别掩码。

(d)图表示实例分割,其也是一种基于像素级别的分类问题,与语义分割最大的差异在于需要区分类内差异,也就是即使是同一个类别,如:人,也需要区分不同的个体,如图(d)用不同的颜色标识。常用的实例分割数据集有:Cityscapes。实例分割的结果为:一张图片的像素类别掩码。

注意:现在通常使用Bbox表示的目标检测任务其实是一种不精细的表示方式,如图(b)中的三个矩形框,每个矩形框中不仅包含了该对象本身,还包含了其它对象和背景。而实例分割则可以视为一种精确的目标检测,一个对象的所有像素点给检测出来,达到了像素级别,所以,笔者认为目标检测的终极目标应该是实例分割的形式,只是现阶段受限于硬件的算力和模型的精度。

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

有监督预训练Supervised pre-training)
所谓的有监督预训练,我们也可以把它称之为迁移学习。
比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。

然后当你遇到新的项目任务是:人脸性别识别.

那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。

图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇paper采用了迁移学习的思想。

文献就先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络的图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段cnn模型的输出是1000个神经元,或者我们也直接可以采用Alexnet训练好的模型参数。

无监督预训练(Unsupervised pre-training)

无监督预训练这个名词我们比较熟悉,栈式自编码、DBM采用的都是采用无监督预训练。因为预训练阶段的样本不需要人工标注数据,所以就叫做无监督预训练。这样操作是为了让系统获得更好的初始化参数。

3、IOU定义

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

IOU定义了两个bounding box的重叠度,如下图所示:
矩形框A、B的一个重合度IOU计算公式为(这个CSDN我实在不大会排版/大哭):
IOU=(A∩B)/(A∪B)
就是矩形框A、B的重叠面积占A、B并集的面积比例:
IOU=S(A∩B)/S(A∪B)
IOU=S(A∩B)/(S(A)+S(B)-S(A∩B))

4、非极大值抑制(NMS)

目标检测会从一张图片中找出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是我们保留下来的第二个矩形框。

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

5、何为mAP

评价检测器好坏的指标通常有:对数平均漏检率(Log Average Miss-rate,LAMR)、帧率(Frame per Second,FPS)、查准率(Average Precision,AP)和查全率(Recall)。帧率表征模型的效率,查准率、对数平均漏检率和查全率反映模型的精度。

mAP这个概念是PASCAL VOC比赛中所明确的metric。它的意思是输出的结果是一个ranked list,里边每一个元素包含了类别、框的信息,以及confidence,这个confidence就用来排序。有了排序,就可以计算AP了,然后再针对所有分类,取一个mean,就得到了mAP。这里为何要排序呢?是因为每一个框有一个confidence,mAP作为评估指标,需要考虑confidence进来。比方说我给出一个框,说我有99%的信心这里有一个猫,结果这里没有,相比我给出一个框,说我有10%的信心这里有一个猫,结果也没有,这两个框的penalty和reward不能一样的。因为99%信心说有,结果没有,那就说明这个系统很有问题。反之,假如我给出一个框,99%的信心说有一个猫,然后真有猫,相比10%信心说有猫,结果也是有猫,这两个框也不一样。也就是越“靠谱”,reward越大。什么叫靠谱?靠谱的意思是信心足的时候,一般结果正确。所以我们根据confidence进行排序之后,就应该给排名靠前的结果,也就是confidence比较大的一些更大的权重。所以才会有ranked list。或者可以理解为,我有一个query,查询的内容是,系统中的图片里猫都在那儿?那么这个就肯定需要ranked list了。

值得一提的是在2010年之前,VOC比赛用的AP计算方法并不是上边所述的计算方法,而是对interpolated 的那个图均匀取11个点,[0.0 0.1 0.2 … 1.0]然后求平均。后来才成上边所述的AP计算方法。

计算方式和代码参考:https://github.com/rafaelpadilla/Object-Detection-Metrics#create-the-ground-truth-files

6、边界框回归

边界框回归问题很重要也很复杂,详细参考博客:
https://blog.csdn.net/zijin0802034/article/details/77685438

四、论文解读

1、本文的应用背景(拟解决关键问题)

①目标检测任务的性能在2010年至2012年提升很少,基本上是模型的组合或在现有的技术上少许改进。

②以AlexNet为代表的CNN网络在目标分类任务上取得了很好的成就,CNN对ImageNet的分类结果在多大程度上可以泛化为PASCAL VOC目标检测挑战赛的结果?

③CNN的层次结构特征,多大程度上影响了检测任务的性能(不同层次的特征使用的效果对比)

2、本文亮点

①将复杂的CNN网络应用于自下而上的候选区域之上,以便定位和分割对象。

②使用了迁移学习来提高了目标检测的性能。

③文章列举了大量的实验分析数据,十分值得借鉴,具体可参考文章拜读。

3、算法流程

测试阶段流程,如上图所示:
第一步:输入待处理的图片
第二步:应用SS(Selective search)算法在输入图片上生成大约2000个候选框(有可能是目标的框)
第三步:对第二步中生成的所有候选框,利用CNN提取固定长度的特征
第四步:基于每个候选框提取出来的特征,放入二分类的SVM中进行分类
第五步:对于每一类目标的候选框(第四步后的候选框已经有类别信息)应用NMS筛选重复框
第六步:对于第五步后保留的候选框的特征,使用边界框回归来精修位置
注:原则上第三步到第六步可以重复以提高精度,但作者文中已说明没必要这样做,提升不大

几点说明:
①SS算法主要是基于目标的颜色、形状、轮廓、纹理等信息的,算法具体参考:
https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf
https://blog.csdn.net/Julialove102123/article/details/77938017

②提取特征的CNN网络有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。

为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。

③由于AlexNet和VGG中均有全连接层,所以要求输入特征提取网络的图片(候选区域)的尺寸固定(如 227 * 227),而SS算法根据实际目标生成的候选区域大小差异很大,则需要将候选区域变形到固定尺寸(227 * 227),变形的方式有:
(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讲解阶段我再具体讲解。

④AlexNet和VGG有很多层特征可以使用,如pool5,fc6,fc7,究竟选择哪一层的特征用于SVM和边界框回归好?
在这里插入图片描述
如上图的一二三行所示,当分别选取AlexNet的pool5,fc6,fc7时的mAP其实差异不大,但fc6和fc7含有的参数量分别为:4096 * 9216 和 4096 * 4096,参数量巨大。注意此时是没有微调和加边界框回归的。

⑤AlexNet和VGG均是基于ImageNet训练的,是否需要微调?
文献给我们证明了一个理论,如果你不进行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精度还低。事情是这样的:

1).cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;

2).采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);

3).然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm,具体请看下文。

训练阶段说明:
1、有监督预训练
参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这边文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。

网络优化求解:采用随机梯度下降法,学习速率大小为0.001;

2、特定领域数据集微调
接着采用selective search 搜索出来的候选框,然后处理到指定大小图片,继续对上面预训练的cnn模型进行fine-tuning训练。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景) (20 + 1bg),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个事正样本、96个事负样本(正负样本的定义前面已经提过,不再解释)

3、二分类SVM的训练
这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当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个候选框,可以得到20004096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096N点(Therefore,the pool5 need to be set as)乘(N为分类类别数目,因为我们训练的N个svm,每个svm包好了4096个W),就可以得到结果了。

4、还存在什么问题

很明显,最大的缺点是对一张图片的处理速度慢,这是由于一张图片中由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)附录中对于resized操作、Bounding-box regression、数据冗余等有详细介绍,可以看一看;

五、特别鸣谢

https://blog.csdn.net/zhangyoufei9999/article/details/80406423
https://blog.csdn.net/u011534057/article/details/51218250
https://www.cnblogs.com/zf-blog/p/6740736.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章