前段时间在读R-CNN,今天写个博客对论文的内容和自己的理解进行总结,方便以后回顾,以及与大家学习交流。所有的博客都是博主二次消化吸收的产物,难免包含主观和不准确之处。最好的学习资料还是一手论文!
首先先回答两个问题:
(1)两阶段模型指的是哪两个阶段?
(2)R-CNN中的R指什么?
第一个问题,两阶段目标检测模型的第一个阶段是提取候选框(Region Proposal),第二个阶段是对候选框进行分类、回归等操作。代表模型就是R-CNN系列,而单结段目标检测模型即对输入图片进行端到端处理,没有提取候选框操作,模型输入图片,直接输出目标(Object)的类别、位置坐标、置信度等信息,代表为YOLO系列。
回答了第一个问题,第二个问题也就明了了,R-CNN中的R指的是候选框,即Region Proposal。
R-CNN应该可以称得上是在目标检测领域用到深度学习的鼻祖了,有很重要的意义。
2012年,AlexNet在ImageNet举办的图像分类比赛上首次使用了深度学习,分类效果有了质的提升,这也再次把神经网络推上了热点。AlexNet的网络结构如下:
为什么画成上下两部分,是因为当时GPU显存还很小,无法把整个网络放在一个GPU中训练,所以使用了两个GPU来共同训练一个网络。上、下两部分模型装在两个GPU中。
赛后,大家进行了一系列讨论,其中讨论最多的问题之一就是:我们能在多大程度上,将CNN的分类结果泛化到PASCAL VOC数据集的目标检测任务上?
2013年的R-CNN就是对这一问题的精彩回答!
在R-CNN之前,对于目标检测任务,提取的特征还是在像素层面的,而引入了CNN网络结构,就可以提取更深层次的语义特征,进而可以更好的进行后续任务。这也是为什么作者在论文正文的第一句就说:“Features matter.”(特征很重要!)
R-CNN相较于之前传统的目标检测算法,做出了革命性的改变,但也遇到了两个问题:
(1)如何进行目标的定位?
一种方法是将定位问题用回归(Regression)的方法处理,但之前基于回归处理的问题效果并不理想,因此作者没有用该方法。(不过之后大放异彩的YOLO v1就是把分类和定位用回归进行处理的)
另一种思路是使用滑动窗口,但是R-CNN中使用的网络框架为AlexNet,AlexNet中包含5个卷积层,越往后的卷积层对应原图中的感受野越大,第五层一个神经元对应原图(227x227)的感受野是(195x195),这显然没法用滑动窗口来定位。即使用了,定位性能也很差。
所以作者选择的思路是先为每张图片生成大概2000个可能是目标的候选框(Region Proposal),这些候选框与类别无关。然后对候选框进行筛选,留下最有可能框出目标的候选框,这么做就对目标进行了定位。后来为了进一步提升定位性能,作者又为每一种类别训练了一个Bounding Box线性回归器,用来对框出目标的Region Proposal进行微调。
(2)用来训练的目标检测任务的数据集太少了怎么办?
要从头训练深度神经网络模型,需要较多的标注好的数据集。然而目标检测数据集的标注难度较大,那时PASCAL VOC的目标检测数据集用来训练也不够,于是作者提出了一种针对该情况的天才范式:
我是这么理解该范式的:如果有另一项任务的数据集较多,且和目标任务相近,我们将其称为辅助任务。先把网络的骨干结构用辅助任务进行训练,然后再在训练好的骨干结构后面加上全连接层,在数据集较少的目标任务上进行微调训练,就可以训练出很好的满足目标任务的模型。
所以,作者的解决思路是:先把AlexNet的骨干结构(主要是前五层CNN)在ImageNet图像分类这一辅助任务上训练,再将训练好的骨干结构后面的全连接层由1000个神经元换成21个,然后在PASCAL VOC上进行训练。(因为ImageNet数据集是1000分类,而PASCAL VOC是20个类别,再加1个背景类别background)
这一范式有很重要的启发意义,后续的很多论文都用了这一思路,对网络骨架进行预训练。
但是,为什么这一范式可以work呢?
作者的另一个伟大发现是,在预训练时,卷积层学到了很多图片的底层特征和语义特征,而非全连接层。 因此我们可以用已经学到了图片底层和语义特征的卷积层组成的网络骨架,微调后迁移泛化到相近的任务上去。
前面介绍了R-CNN的发展背景,以及作者在提出R-CNN时遇到的两个问题。接下来步入正题,聊聊R-CNN的大体思路,如下图:
(1)首先将原图经过selective search方法,得到大约2000个候选框(Region Proposal);
(2)将每个Region Proposal变形到227x227大小,输入训练好的AlexNet主干网络中,输出4096维的特征向量,这4096维的向量中已包含语义特征;
(3)作者训练了20个SVM分类器(对应20个类别),将4096维的向量输入分类器,得出分类结果;
(4)作者还训练了20个线性回归器Bounding Box Regression(对应20个类别),将4096维的向量输入回归器,对Region Proposal进行微调,获得更好的目标定位性能。
上面的图是我画的,论文中介绍R-CNN流程的图如下:
都一个意思,不过论文中的图没有画出Bounding Box回归的过程。同济子豪兄的流程图更清晰易懂:
(1)为什么选取候选框要用Selective search方法?
最主要的原因是为了便于和其他目标检测算法比较,因为之前的一些目标检测算法是基于selective search的,所以作者为了控制变量,也选择了这一方法。实际上选择什么样的候选框产生方法都无所谓。
(2)为什么要将Region Proposal变形到227x227像素?
这是网络结构要求的,需要输入227x227的固定尺寸。至于如何将Region Proposal进行变形,作者选用了最简单的策略:先在Region Proposal周围补充16个像素,然后将其直接变形到227x227。类似于在PPT中按住shift然后将图像强行拉到227x227大小。部分例子如下图所示:
可以看到右下角的那个发生了挺明显的变形。
(3)NMS非极大值抑制删除重复候选框
针对一个目标有可能被几个距离较近的候选框重复框选的问题。
我们将2000个Region Proposal输入CNN网络提取出2000个4096维的特征,再对这4096维的特征分别用训练好的20个SVM分类器进行打分,对打分后的Region Proposal使用NMS非极大值抑制来删除重复的候选框。
(4)模型耗时情况
我在同济子豪兄的视频中截了上面的图。可以看到,最耗时的操作是对2000个候选框进行CNN前向推理、对候选框变形到227x227 以及 用selective search得到2000个候选框。而用SVM进行分类和NMS非极大值抑制操作虽然和种类数量相关,却只占用了极少的时间。
我发现之前自己更关注一个模型的结构和前向推理过程,但其实这个模型是如何训练出来的,也相当重要,这里面有很多值得说道的地方。整个训练过程可以分四个步骤。
(1)在辅助任务ImageNet数据集上预训练
首先在ImageNet 1000图像分类数据集上对AlexNet框架进行预训练,使得骨干模型的卷积层能够学习到图片的底层和语义特征。最终作者训练出的网络骨干架构性能和AlexNet相近,稍微弱于AlexNet,作者说这是由于训练的过程进行了一定程度的简化。
(2)在目标任务PASCAL VOC数据集上迁移学习
将在辅助任务上预训练好的网络最后的1000个神经元的全连接层换成21个神经元,然后在PASCAL VOC上进行迁移学习训练。
这里有一点需要注意:在迁移学习训练时,模型的输入是变形为227x227的region proposal。但对于一张图片而言,会产生2000个Region Proposal,那么在迁移学习训练网络时,到底哪些Region Proposal被定义为正类(Positive),哪些又被定义为负类(Negative)呢?
这里作者采用的策略是:把Region Proposal与Ground Truth(即人工标注的框)IOU大于0.5的规定为正类,否则为负类。如下图所示:
在上图中,红色的框为人工标注的Ground Truth,绿色和蓝色的框都为Region Proposal。而在训练时,由于绿色的框和Ground Truth IOU>0.5,所以训练时把它作为人(Positive)。而蓝色的框和Ground Truth IOU≤0.5,所以训练时把它作为背景(Negative)。
这么处理主要是因为若是只把Ground Truth作为正类,则会出现正类远远小于负类的情况,正类数目过少,出现过拟合。而把与GT IOU大于0.5的都作为正类,则可提升正类数量,减轻过拟合。
但这么处理也带来了一些问题:即模型的定位性能会变差,因为我们把与Ground Truth IOU>0.5的Region Proposal都作为正类了,在上图中,显然绿色的框的定位不是特别的准确,然而为了增大正类的样本数量,我们还是在训练时将其看作正类。
(3)对每一类别训练一个SVM分类器【用于分类】
我们将变形后227x227的Region Proposal输入到上一步迁移学习训练好的CNN网络中,输出4096维的向量。然后对每个Region Proposal对应的4096维向量用SVM进行分类,得出该Region Proposal的类别。那么,如何训练出这一组SVM呢?
思路是这样的:我们把Ground Truth作为正类,而把Region Proposal与Ground Truth IOU<0.3的Region Proposal作为负类,忽略与GT IOU>0.3的Region Proposal,如下图所示。
细心的朋友可能会注意到,为什么在fine-tuning迁移学习训练网络时,与和训练SVM时正负样本规定不一致呢?
训练过程 | 正样本 | 负样本 |
---|---|---|
迁移学习训练网络 | 与GT IOU>0.5的region proposal | 其他region proposal |
训练SVM | Ground Truth | 与GT IOU<0.3的region proposal |
这个问题我在之后会详细解释。
(4)对每一类别训练一个Bounding Box 线性回归器【用于对Region Proposal微调,提高定位性能】
其实有了前三步,已经可以对图片进行目标检测了:首先对原图提取2000个Region Proposal,把2000个Region Proposal输入到CNN骨干网络中,提取出4096的特征,然后使用训练好的一组SVM对每个Region Proposal对应的4096维特征进行分类,找出所有可能包含目标的Region Proposal。再对其进行NMS后处理,删除重复预测的Region Proposal,即可得出最终的结果。
不过,直接使用Region Proposal作为最终的框存在定位不够精确的问题,毕竟通过Selective Search选出的所有Region Proposal,不一定能严丝合缝地框住目标。
因此,作者又对每个类别训练了一个Bounding Box 线性回归器,对Region Proposal进行微调,进而可以更严丝合缝地框出目标。
思路如下:
Px,Py,Pw,Ph是Region Proposal的中心坐标x,y以及宽w和高h。
Gx,Gy,Gw,Gh是Ground Truth的中心坐标x,y以及宽w和高h。
我们要训练出一个线性分类器,使得模型可以预测出四个参数因子:dx(P),dy(P),dw(P),dh(P)。而通过这四个参数因子,即可以得到从Region Proposal到Ground Truth的映射,如下图所示:
即,我们将一个Region Proposal对应的4096维向量输入线性分类器,线性分类器预测出四个参数:dx(P),dy(P),dw(P),dh(P)。我们用已知的Px,Py,Pw,Ph与四个参数进行运算,就可以得出我们预测的Ground Truth的位置。
既然说了我们要训练的是一个线性分类器,那么只需要训练一组参数,与4096维的向量一一相乘即可。训练过程使用加上L2正则化的岭回归损失函数:
有了第四步,模型的mAP提升了3,从50.2提升到了53.7。
作者提出了一个很有启发性的做法,该做法可以让我们了解到每个神经元具体学到了哪些特征,每个神经元负责什么工作,增加了模型的可解释性。
具体做法是:我们可以将大量的Region Proposal(大约1000万个)输入模型,然后观察第五个卷积层中的某一神经元对于哪些Region Proposal产生最大的激活值,将Region Proposal按照激活值由高到低排序,再通过NMS去除重叠的Region Proposal,最后展示出激活值最高的Region Proposal。通过观察这些Region Proposal,就可以了解到该神经元学习到了哪些特征。
这是一个很有趣且很符合人直觉的想法,我们来看看作者给出的效果:
可以看出,使这些神经元产生最大激活的Region Proposal都存在语义上的共性,因此第五层(深层)的神经元确实学习到了图片语义层面的特征!amazing!
我们之前说了,fine-tuning迁移学习训练网络结构时,和训练SVM时正负样本的规定并不相同,具体差异如下:
训练过程 | 正样本 | 负样本 |
---|---|---|
迁移学习训练网络 | 与GT IOU>0.5的region proposal | 其他region proposal |
训练SVM | Ground Truth | 与GT IOU<0.3的region proposal |
原因如下:
(1)迁移学习训练网络时,之所以把与GT IOU>0.5的region proposal 作为正类,是因为若仅仅把Ground Truth作为正类,则正类相较于负类数量太少了。CNN网络包含大量参数,需要较多数据进行训练才不会出现过拟合。为了增加正类的数据量,我们才“委曲求全”,把与GT IOU>0.5的region proposal 作为正类。
(2)但(1)带来的问题是训练出的CNN网络提取的特征的定位性能较差,因为我们“委曲求全”,把与GT IOU>0.5的region proposal 也作为正类了。
(3)综合前两点,我们看出,如果正类的数量对于训练模型来说足够,我们肯定不用再“委曲求全”,为了增加正类数量而同时增加定位误差。而对于SVM分类器来讲,我们不需要太多的数据去训练(参数量较少),因此可以直接用Ground Truth作为正类,进而降低定位误差。
简单来说就是:迁移学习训练网络时我们希望增加正类样本数量以降低过拟合,训练SVM时我们希望降低定位误差,因此正负样本的规定不同。
从直觉上来讲,肯定是直接在训练好的CNN网络后面加个softmax分类更加合理。事实上作者也确实这么做了,作者把SVM换成softmax后,发现在VOC 2007数据集上的mAP由54.2%掉到了50.9%,掉的还不少。为什么会出现这种情况呢?
其实mAP的减少,主要还是因为定位性能的下降。我们之前说了,在fine-tuning迁移学习训练CNN网络时,为了增加正类样本的数量,减轻过拟合,我们把与GT IOU>0.5的region proposal 也作为正类了。这就导致了定位性能的下降。而如果我们在后面直接加一个softmax,相当于没有对定位性能进行提升。
而训练SVM时,通过规定Ground Truth为正类时,相当于间接提升了模型的定位性能,因此mAP会上涨一些。
另外,SVM在训练时还用到了Hard Negative Mining(难例挖掘),即当错把背景分为某类别时,就把该背景样本添加到该类别SVM训练集的负样本。相当于加了个错题本,训练效果更好!
R-CNN这篇论文也看了很久,一方面自己本身读论文就慢;另一方面是过年期间,事情不少。不过跟着同济子豪兄来读论文,确实少踩了很多坑,感谢!
读完R-CNN,我也有几点思考:
(1)R-CNN的伟大意义自然不用说,但站在事后诸葛亮的角度来看,还有很多值得改进的地方:首先是整个模型的结构过分冗余复杂了:selective search提取Region Proposal、CNN网络提取Region Proposal的深层特征、一组SVM对深层特征进行分类、一组Bounding Box Regression对Region Proposal定位进行修正。实在是难以称其简洁优美。
而这样的设置,显然会带来难以训练、难以优化、模型推理速度很慢等问题(但需要注意的是,在当时,R-CNN是耗时相当短的模型了)。后续的两阶段模型,可能也是在R-CNN基础上做得小修小补了,除非有新的变革!(YOLO!!)
(2)R-CNN论文中提到了很多很有意义的范式及做法:
【1】先在辅助任务上预训练模型,然后迁移学习到数据集较少的目标任务上;
【2】可视化某层的某个神经元学习到的特征,来增加模型的可解释性,可解释性也是很重要的!
【3】作者发现学到了图片底层和语义特征的是卷积层,而非全连接层,全连接层的用处主要是对卷积层学到的特征进行整合。
以上就是近期读的R-CNN总结,希望能对你有所帮助。