作者:中南大学可视化实验室 可解释性机器学习项目组 18届本科生研究员 WXY
日期:2020-9-18
论文期刊:2014-CVPR
标签:RCNN 目标检测
一、写在前面的知识
选择性搜索
https://www.cnblogs.com/zyly/p/9259392.html
提取region proposal是目标检测、目标跟踪中的基本环节。
目标检测的第一步是选择更小的区域,然后利用算法去识别区域中物品的得分。
最直接的方法是滑动窗口,但是明显这很耗时,因为区域的尺寸和位置是不一定的。
region proposal是更优秀的区域候选算法,它将图像输入,输出边界框作为候选区域,它们大多与目标很接近,selective search是代表性算法。
selective search:通过颜色、纹理、形状等特征将原始图像分为等级区域(即将其分割)
但分割后后的图片不能直接做目标检测,因为大多数物体包含两种以上的颜色(一个物体肯包含丰富的颜色信息);如果物体有重叠,这种方法无法处理。
selective search的步骤:
- 根据前面的分割的图片画出多个框,把所有框放入region列表中
- 更具相似程度(颜色、纹理、形状等),计算框的两两相似图,把相似度放入另一个列表A
- 从A中找到相似度最大的框a,b,将它们合并
- 把合并的框加入region列表,从A中删除和a,b相关的相似度,重复此过程,直到A为空。
候选框的数量层数十万降到几千
解释一下相似度:
颜色:每个颜色通道生成25-bin的直方图,共75维
纹理:每个颜色通道使用高斯差分对8个方向计算提取纹理特征,使用10-bin直方图表示
尺寸:鼓励尺寸小的区域合并
形状兼容相似度:两区域重合比例程度
相似度是四个特征的线性组合
BoundingBox回归
selective search得到的候选区可能与实际目标存在偏差
selective search选出红色的框,ground truth是绿色框,飞机已经检测出来,但是IoU<0.5导致识别失败,观察只需要对其进行线性变换(缩放、平移)就可以成功识别。
CNN输出的特征向量里包含了信息,所以在CNN输出的特征向量上做一个loss计算,调整原来框的位置(即缩放、平移操作)。
实际上这就是一个线性回归的过程,给定输入的特征向量X,学习一组参数W,使回归后的值与真实值Y非常接近,即
对每种类都设计边界框回归,需要设计好的loss函数,那么学习到的参数可以使loss收敛,就可对边界框进行修正。
在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器。
以下是常见的两类迁移学习场景:
1 卷积网络当做特征提取器。使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余部分当做特征提取器(例如AlexNet在最后分类器前,是4096维的特征向量)。这样提取的特征叫做CNN codes。得到这样的特征后,可以使用线性分类器(Liner SVM、Softmax等)来分类图像。
2 Fine-tuning卷积网络。替换掉网络的输入层(数据),使用新的数据继续训练。Fine-tune时可以选择fine-tune全部层或部分层。通常,前面的层提取的是图像的通用特征(generic features)(例如边缘检测,色彩检测),这些特征对许多任务都有用。后面的层提取的是与特定类别有关的特征,因此fine-tune时常常只需要Fine-tuning后面的层。
预训练模型
在ImageNet上训练一个网络,即使使用多GPU也要花费很长时间。因此人们通常共享他们预训练好的网络,这样有利于其他人再去使用。例如,Caffe有预训练好的网络地址Model Zoo。
何时以及如何Fine-tune
决定如何使用迁移学习的因素有很多,这是最重要的只有两个:新数据集的大小、以及新数据和原数据集的相似程度。有一点一定记住:网络前几层学到的是通用特征,后面几层学到的是与类别相关的特征。这里有使用的四个场景:
1、新数据集比较小且和原数据集相似。因为新数据集比较小,如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当做特征提取器,用提取的特征训练线性分类器。
2、新数据集大且和原数据集相似。因为新数据集足够大,可以fine-tune整个网络。
3、新数据集小且和原数据集不相似。新数据集小,最好不要fine-tune,和原数据集不类似,最好也不使用高层特征。这时可是使用前面层的特征来训练SVM分类器。
4、新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练。但是实践中fine-tune预训练模型还是有益的。新数据集足够大,可以fine-tine整个网络。
实践建议
预训练模型的限制。使用预训练模型,受限于其网络架构。例如,你不能随意从预训练模型取出卷积层。但是因为参数共享,可以输入任意大小图像;卷积层和池化层对输入数据大小没有要求(只要步长stride fit),其输出大小和属于大小相关;全连接层对输入大小没有要求,输出大小固定。
学习率。与重新训练相比,fine-tune要使用更小的学习率。因为训练好的网络模型权重已经平滑,我们不希望太快扭曲(distort)它们(尤其是当随机初始化线性分类器来分类预训练模型提取的特征时)。
二、RCNN正式开始
目标识别:在给定图像中识别给定的物体,将整张图像输入,输出类别标签并给出图像中物体出现的概率。
目标检测:输入图像,返回图像中包含的物体,还要对物体进行定位。
在RCNN之前基于PASCAL VOC数据集的目标检测已经到达一个瓶颈期,之前的目标检测大多基于SIFT和HOG来提取特征,PASCAL VOC目标检测发展很缓慢,每次只是对之前的系统进行很小的调整。当Alexnet出现后,人们又开始重视CNN,作者就是希望将通过CNN在目标分类和目标检测之间构建桥梁。
这篇文章首次展现了CNN可以很大程度地提升基于PASCAL VOC的目标检测能力,它展示了一个简单可测量的目标检测算法,在VOC 2012上将mAP(平均准确率)提升了30%,达到了53.3%。
两个主要问题:在深层网络中定位目标、在带标签数据量不足时如何训练高能力的网络
第一个问题:定位。第一种考虑是将其看做是一个回归问题,但是别人做出的结果只有30.5%的准确率,不够优秀。第二种是考虑使用滑动窗口,之前滑动窗口已经在CNN中使用了20年了,用于检测人脸和行人。但之前的网络都很简单,只有两层卷积层,如果在深层的网络中使用(比如这里的5层),后面的单元有很大的感受野195*195,这使得精确定位变成了不可实现的系统问题(同时滑动窗口会消耗过多时间)。作者使用的是“使用区域识别(recognition using regioins),它适合目标检测与语义分割。总的来说,这种方法对输入图像产生大约2000个对类独立的区域建议,然后CNN会从每个区域建议中提取定长的特征向量,然后将其输入到类特定的线性SVM中。
第二个问题:带标签数据不足。作者使用了迁移学习中的微调(fine-tuning),首先在ILSVRC上进行有监督的预训练,然后在PASCAL(较小的数据集)上进行微调。微调带来的提升是显著的,mAP上升了8%。
补充:作者使用了bounding-box regression,对降低错误定位率有显著作用。
1. 使用RCNN进行目标检测
目标检测系统分为三个模块:产生类独立的区域建议;一个大型CNN,从每个区域提取定长特征向量;一组类特定的线性SVM
区域建议:使用了selective search算法
特征提取:使用Caffe,CNN包括5个卷积层和两个全连接层,从每个区域建议中提取4096维的特征向量。CNN的输入必须是227*227大小,但是区域建议的大小是不固定的,作者采取了简单的方法,直接将区域扭曲到需要的大小
2、训练
有监督的预训练:在大型辅助数据集ILSVRC2012上进行预训练,仅使用图像基本的注释,没有box标记。预训练得到的网络在ILSVRC2012上得到了2.2%的top-1错误率。
域特定的微调:为了使这个CNN能应用到目标检测和新的域(扭曲后的区域建议),继续在这个基础上使用区域建议训练。除了将原来的1000类的分类器替换为N+1类的分类器(N是目标类数,1是背景,对于VOC N为20),CNN的其他部分不变。对于与真实框的IoU大于0.5的结果认为是positive,其他是negative,随机梯度下降的学习率是0.001,每次迭代中采样32个积极窗口,96个背景窗口,mini-batch为128。
3、测试时的检测:
在测试图像上使用selective search提取约2000个区域建议,将其扭曲后输入CNN得到特征,对每个类使用训练得到的SVM对这个特征进行评分。然后使用非极大抑制,如果一个区域与得分最高的区域的IoU大于一个阈值,就丢弃这个区域。
(简单说一下什么是IoU,非极大抑制)
4. 在PASCAL VOC 2010-12的结果
检测准确率超过其他模型,消耗的时间更少
5、 在ILSVRC2013检测的结果
左边是平均准确率,右边是200个类的准确率的分布,线的最高点是准确率最高的类,box的最高线是第25个,最低线是第75,红线是中间值。
可视化、消融学习、误差模式
1、对特征的可视化
想法是选出一个unit(特征图),将它作为自己的目标检测器。在一个大的区域建议集合上计算这个单元的激活值,根据结果从大到小地对区域排序后,使用非最大抑制,然后展示得分最高的一些区域。
对第五层卷积层经过池化后进行可视化,选取其中6个单元,每个单元选了16个得分最高的。有些单元可以检测目标,比如第一行检测人,有些只能检测纹理,比如第二行。
2、消融实验:去掉一些特征观察影响
微调:
展示了不加FT与加FT的模型,在第五层卷积层和后两层全连接层的识别能力。
1.明确的是RCNN比之前的算法准确率高
2.不加FT的准确率低于加FT
3.如果不加FT甚至不如直接去掉全连接层,直接使用卷积层输出。
作者给出一个结论:CNN的分类能力来自于卷积层,而不是全连接层,有时甚至可以直接不加全连接层。
Bounding-box Regression:带来了3-4%的提升
ILSVRC2013检测数据集
将数据集分为train, val, test三部分,val和test是详细标记的(带有bounding box标记),train训练集来自ILSVRC2013分类图像集,不是详细标记的。
训练集会被用在CNN微调、SVM训练、bounding-box回归训练
对照实验:
总结一下:RCNN是将CNN用到目标检测的开端,相比以前的方法带来了大幅度的性能提升(30%)。它的亮点是将regoin proposal与高性能的CNN结合来定位目标,以及通过微调等技巧在较少的数据集上得到较好的结果。
RCNN的缺点:需要事先提取多个候选区域对应的图像,占用大量的磁盘空间;每个region proposal都需要进入CNN网络计算,导致多次重复的特征提取;因为CNN的输入时固定的,但之前说过会对候选区域进行扭曲,会带来形变、过小、损失特征等,这对CNN的特征提取有致命的坏处。
Fast RCNN在数据输入上不对其限制,加入了ROI Polling层,可以在任意大小的特征映射上为每个输入ROI区域提取固定的维度特征表示,然后确保每个区域的后续分类可以正常执行。
Faster RCNN:候选区生成、特征提取、分类器分类、回归器回归都在神经网络中完成,运行都在GPU上,提高了效率。
对上文的一些修正
检测过程(这部分没问题,只是回顾):
输入图像,使用SS算法提取约2000个区域
将每个区域扭曲后输入CNN,对其输出使用SVM为每个类打分,然后使用非极大抑制选择更优的区域减少数量
输入到bounding-box回归进行优化
训练过程(明确一下预训练和微调的作用):
预训练:
使用或训练一个分类模型(如AlexNet,VGG),数据集是不充分标记的大型辅助数据集(没有box标记),预训练是在训练识别能力,而不是预测位置的能力
微调:
将CNN的输出层替换为所需大小的输出层(N+1),从图像中提取区域,扭曲后输入CNN进行训练,将第五个卷积层的池化输出保存到硬盘,使用这些数据训练SVM,以及bounding-box回归。
也就是说,
预训练只训练CNN,微调的训练过程是分段的,微调时训练CNN、SVM、bounding-box regression是独立进行的。所以上次说的同时训练CNN和SVM是错误的,将多段学习合并为一段学习是Fast RCNN的改进点之一。
注:
学长的问题:用于学习的应该是整张打了标签的图片,裁剪的图片的作用是什么?
1)CNN的参数与微调是否有关?
是有关的,原文:为了使CNN适应新的任务(检测)和新的域(扭曲的区域窗口),我们使用扭曲后的区域继续对CNN的参数通过随机梯度下降进行训练。
微调训练的部分:CNN、SVM、bounding-box regression,只不过有顺序地分别进行
2)有争议的标签
训练CNN:在划分区域后,如果某区域与真实框的IoU大于0.5将其认为是对应类的正例(positive),其余是反例。在CNN的每次迭代中,从所有类的所有区域中采样32个正例,96个反例组成128大小的mini-batch,使用这些数据进行训练。所以训练CNN的输入时各个区域(region proposal),真实框(ground truth box)是来自原图像。(这个从所有类的区域进行采样的方法被Fast RCNN称为使用来自不同图片的区域进行训练对参数更新是高度低效的,但是还是会训练CNN,FRCN对采样方法进行了改进)
在训练SVM进行分类前,还需要为数据打上标签。只将真实框认为是每个类的正例,对于与一个类的所有实例的IoU小于0.3的proposal被标记为negative。作者设置了IoU=0.3的阈值,超过则表示可以被打上这个类的标签(前面这部分打标签的实际意义我不是特别明白,按我理解是在讲正向传播时候怎么判断一个区域是不是一个类,就是通过与真实框的IoU是否达到阈值来判断)。核心问题是IoU是与谁相交,原文“正例被简单定义为每个类的真实框(ground-truth bounding boxes)”,这种说法与前面提取区域后与真实框进行IoU比较的用词相同(似乎这个问题被我做成了英文阅读理解),这个真实框应该来自未分割的原图,也就是说区域通过CNN得到特征,与原图的真实框进行IoU计算。
上面是前两天的想法,今天看视频时候又想到这个问题
这张图右边是人工为每个栅格打好的标签,8维,包含边界框和目标分类的信息,这都是已经做好的工作。我们做的是有监督的学习,所以输入不光只有图像,还有真实值,也就是图片里的y矩阵,至于y矩阵是从原图中来还是从每个区域中来,我觉得没什么区别,要拟合的东西实际上是y矩阵。那么YOLO里的栅格和RCNN的区域建议究竟起什么作用,实际上在图片生成的一堆区域和栅格中,包含我们需要的最好的一批可以很好地框住目标,我们将这些区域选出来,这些区域的位置也就成为了我们预测的位置,所以所有RCNN里裁剪得到的区域和YOLO里划分的栅格就是目标位置的候选区域。(至于这些区域、栅格的不准确问题,让他们通过bounding-box回归就能更好地描述位置。)因为真实值来自原图像,也就能解释SVM和bounding-box到底向谁学习。