R-CNN 物体检测第一弹
今天,重读了 R-CNN 的 TPAMI 版本,感觉受益颇多。该版相比之前的会议版,在检测流程和实现细节上表述得更为清晰。此外,因为是改投 TPAMI 的关系,因此文中补充了很多额外的实验和分析,尤其是检测系统为什么最后设计成这样的缘由。接下来,我就简要记录一下这篇文章的主要思想和作者对检测的思考,也加入我个人的理解。
缘起
为了推动计算机视觉领域的研究进展,斯坦福大学的 Li Feifei 组根据 wordnet 的思想,建立了一个包罗了近乎海量图片的数据库ImageNet 。在那个 SVM 还异常火热的时代,ImageNet 这种量级的数据库对于现有的图像分类,目标检测的技术来说简直就是灾难。为了进一步对现有的分类,检测技术进行衡量,ImageNet 从2010年开始举办 ILSVRC挑战赛 。这个挑战赛的任务主要包括图像分类,分割,目标检测等。比赛刚刚兴起的时候,还是 ensemble learning(比如随机森林),SVM的天下。而且参赛者们通常拼了老命,好了很多内存,组合了很多学习器,最后也提高不了多少正确率。
ILSVRC12,伴随着船坚炮利的西方国家(加拿大)的Hinton组的AlexNet战舰的一声炮响,大家一起进入了CNN+vision的大航海时代… 为什么当时CNN模型在图片分类任务上能取得这么大的进步,主要是他们当时采用的方法包含了如下几个优点:
CNN model 在提取图像 feature 方面的优秀能力。
传统的图像特征,例如 SIFT,GIST,HOG等都是由计算机视觉专家在数学模型推导的基础上提出来的,这些特征通常被SVM等分类模型用来完成图像分类。但是这些特征存在着一些与生俱来的缺点:首先,这些特征最初是由科学家提出的,最初都只是用在特定领域,比如SIFT之于关键点,HOG之于局部边缘等,但是并未在图像分类和目标检测任务上对特征提取的方式做过优化;其次,在经过复杂的特征提取步骤之后,再送入SVM分类模型进行训练,最后得出的模型效果不好,我们很难去判断到底是模型的泛化能力问题,还是特征的表示能力问题。
而CNN model 提取特征的方式则大不一样,首先它由通用的 卷积层相叠加的方式来获得,其次,该特征提取的方式是经过学习得到,而且该学习过程是和图像分类任务密切联系的。也就是说,该特征提取方式实现了对图像分类任务的自适应。那么这样会带来一个问题,要是分类任务变化了,例如类别数量变化了,图像类别变化,甚至不是分类任务了,该模型不就得重新提取了吗?在这里我先说,确实是这样的。但是,人们开发了 find-tuning 方法以及与之对应的transfer-learning理论来解决这个由任务,数据变化带来的模型训练问题。
ImageNet 大量数据带来的优势。
图像分类任务,从机器学习的角度来说,就是一个学习任务。
从学习的角度来讲,我们需要做好以下两件互为矛盾的事情:第一,构造学习能力很强的学习算法;第二,构造泛化能力不弱的学习算法。放在函数的逼近和拟合任务下来看,第一件事情要求:给我越多越多的数据点(x,y),我能拟合出一个万能的函数f(x)来通过这些数据点附近;第二件事情要求:我拟合出的万能函数f(x)能对未知的x求出更准确的y,即f(x)在训练集和测试集上的performance趋向于一致。那为什么这两个事情相互矛盾呢?第一,现实世界的数据点通常带有很大的噪声,如果强行学习,使得函数在训练集的每个数据点上都十分逼近ground-truth,这样得到的模型通常都十分复杂,并且这个模型在测试集上的表现通常很差。这就是过拟合:测试集上的performance 远远比 训练集差。过拟合的来源一般就是f(x)太复杂。第二,如果将重点放在使得f(x)在测试集上的performance不差,那么f(x)就会倾向于变得异常简单(极端情况就是一直输出常数,这样performance都很弱),至少这样虽然学习到的内容比较少,但是不会因为过拟合而使得测试集performance极差。
那么,有没有什么办法跳出这个怪圈呢?目前还没有,毕竟这是学习理论决定的。 我们可以在尽可能保证泛化能力的前提下,提高学习能力。
以CNN model为代表的深度学习模型是多层前馈神经网络的特别版,而多层前馈神经网络本身是一个学习能力极强的模型。在此基础上,为了提高其泛化能力,除了采用加正则的方法,那就是让训练数据尽可能够多,希望以此来覆盖更多的图像分布,从而使得CNN model在遇到测试集之前,能见到更多的带supervision的训练集样本,然后通过学习使得最后在测试集上的效果不差。因此,如果以ImageNet中的百万量级的数据为训练集,我们就能通过学习得到一个不那么容易过拟合的CNN model,关键这个CNN model 的表示拟合能力很强,因此更不会欠拟合。
如果把学习比作做菜,那么现在的CNN model就是一口大锅,而ImageNet就是能配上这口大锅的天量食材。而现在唯一需要做的就是用一把巨大的铲子来翻动CNN model这台做菜机器了。
NVIDIA GPU 战术核显卡和CNN model计算方式天然匹配的计算架构。
前面说到,CNN model是多层前馈神经网络的一种。众所周知,多层前馈神经的层数通常有5-20层,但是每层内的隐藏单元数量则非常巨量(比如CNN Model的某Conv层就可能有56x56x128个隐藏单元),如果采用CPU依次对这些单元进行计算,那么将十分耗时。但是,每一层的隐藏单元间的值互不直接影响,因此可以同时利用权重和前一层的输出来求解后一层的每一个隐藏单元的值,这样在每层内部就天然具备了并行计算的特性。
另一方面,N家开发的带CUDA计算核心的显卡,又恰好能进行这样的并行计算。当然这个巧合并不完全是因为N家高瞻远瞩,而是因为显卡之前就是采用并行计算的方式来对游戏画面进行着色的。当然,另一方面也是因为黄教主十分慷慨,经常给各大实验室送显卡,本蒟蒻所在的实验室居然都申请到了,于是大家都开始用它了。
这是以上这些优势,使得AlexNet在ILSVRC12的图像分类比赛拔得头筹,并且一下子就把结果提高了很多个百分点。如此一来,那么目标检测任务能够利用CNN model来学到优秀的特征以用于自身提高吗?要知道,检测不仅要求对检测到的物体准确地判断其类别,更要对物体进行准确的定位。此外,ILSVRC中的图像分类数据是百万量级的标记数据,是因为标注者只需要对每张图片(通常包含单类物体)判断属于哪一类即可。而对目标检测任务来讲,一张图片可能包含多个目标,那么标注者不仅需要标注出每个目标的类别,还需要给出目标的精确位置(框住目标的bounding box(简记为bbox)的中心和长宽)。所以能够用于目标检测任务的标记数据就十分少。例如 PASCAL VOC比赛中的数据,最开始只有20类,后来才有了200类,每一类的目标数量也比较有限。所以,即便能将CNN model用于目标检测,也找不到足够的标记数据来驱动CNN model的学习。那么,我们看R-CNN是如何解决两个问题的?
主要检测流程
那么,R-CNN是如何解决上述问题的呢?
首先,如何利用CNN model来进行检测?更大一点,如何利用分类来进行检测。作者们借鉴前人的方法,采用类似sliding window的思想,在每张图片生成可能包含的region,然后尝试利用CNN 图片分类model来对每个region来判断目标类别。这样既实现了目标检测中的类别判断,又在生成region时已经附带得到了bbox的位置信息。
其次,如何应对目标检测任务的标记数据不足的问题?作者们考虑采用迁移学习的策略,直接将用于ImageNet图片分类的网络搬过来用于region图片的特征提取。但是这样会因为domain的不同,使得分类任务性能有所下降,因此还需要利用相对ImageNet来说是少量的 目标检测标记数据来进行分类网络的fine-tuning。具体地,
R-CNN的检测流程主要包含如下几步:
采用region proposal generation算法(这里用的是Selective Search算法)来获取图片中可能包含object的region。
这里的region proposal generation,不是简单的sliding window,而是希望尽可能得到一些可能包含object的region,即更像object而非background的region。这些region可能存在多种scale,position。如果采用传统的sliding windows,不仅产生了大量的无意义的region,也为后面对region的逐个分类增加很大的计算量。因此作者在这里用的是 Selective Search 算法,该算法一般能生成2000+左右的region,并且一般能够囊括图片中目标所在的region。文中5.2部分的叙述显示,在ILSVRC13 的数据上,SS得到的region中,相对ground-truth的bbox来说,有91.6%的召回率;而对PASCAL VOC的数据,则有98%。
将上一步得到的region对应的图片部分逐个提取出来,依次resize到标准大小,然后送入CNN model来提取图像feature(文中用到的是pool5,fc6,fc7层的特征)。
首先,如何resize到标准大小,文中的7.1部分给出了三种resize策略(详细请看文中),结论是,在第一步得到的proposal周围一定范围内的context也纳入到region中,可以提高mAP。最后,将所有的region对应的图片resize到标准大小,这是因为当前使用的CNN model并非全卷积,使用了标准输入大小。
其次,如果直接采用从ImageNet上训练出来的分类网络作为提取特征的网络的话,整体检测性能也比之前的方法好很多。但是如果再在目标检测的标记数据上进行fine-tuning的话,检测性能将得到进一步的提升。
一旦涉及该多分类CNN model的fine-tuning训练的话,首先要解决的问题是:各个类别样本的定义。文中的3.3.2部分给出的定义是:对训练集中每张图片做SS算法,得到的region中,和ground-truth bbox的IOU>=0.5着被认为是该ground-truth bbox对应类比的正样本,而其余的IOU < 0.5都被视作负样本,即代表background的样本。其次,需要将原始的多分类CNN model最后的softmax层由原来的1000分类改为现有的N+1分类,其中1000为原网络的softmax层的单元数,N为现有目标检测任务中的目标类别个数。最后,由于类别样本相对background样本来说还是太少,因此在fine-tuning的过程中,每个mini-batch中,背景样本占比75%,其余为随机抽取的类别样本。
然后将提取到的图像特征送到class-specific的SVM算法中去判断,每个region对应的是什么类别(如果什么目标都不是,则属于背景类别),以及属于该类别的概率。如果该概率 > 某个阈值(例如0.5)。
上一步的fine-tuning的过程,是对一个自带softmax多分类层的分类网络进行微调。那么,为什么不直接用上述网络进行分类,而要将特征抽取出来,采用SVM算法进行分类呢?文中7.2部分给出了作者的理由:采用softmax层分类相比SVM分类,mAP从54.2%降到了50.9%;这可能有两方面造成:第一,fine-tuning过程定义的正样本只要求IOU>=0.5,这不适合precision localization;第二,softmax是在随机采样的背景样本上进行训练,而SVM采用的则是hard-negative mining,这提高了分类准确度。
具体,这里的SVM分类算法学习的是N个class-specific SVM classifier,对每个classifier来说,正样本就是ground-truth bbox,其余和ground-truth bbox的IOU<0.3的generated region都是负样本。注意,这里的正样本和fine-tuning中的定义完全不同。按照作者在7.2部分的描述,最开始作者首先想到采用SVM+pretrained model,并且经试验发现从SVM现在定义的正负样本学到的SVM模型很好。后来又决定引入fine-tuning,然后发现之前的正负样本定义方式效果很差,采用现在的0.5阈值做fine-tuning效果好了很多。这里的关键不是阈值,而是fine-tuning 中如果采用SVM model那样的正样本定义,那么可以用于训练的正样本就太少了。因此,在改变了fine-tuning的正样本定义之后,正样本大概增加了30倍以上,如此fine-tuning过程的效果提了上去。但接下来的问题就是 这样造成网络的precise localization很差,这也是之前提到采用SVM模型做分类的原因之一。
由此看来,这就是一个分类性能+定位性能+训练难易度互为trade-off的过程啊
最后,为了提高目标的定位精度,采用 bbox regression 技术来对object的bbox进行修正。
这是一门锦上添花的技术,文中引用的是DPM算法 TPAMI10版本: “Object detection with discriminatively trained part based models”。其主要思想就是:训练一个regressor,通过现有region的(Px,Py,Pw,Py)来预测真实的(Gx,Gy,Gw,Gh)。
为什么需要作修正呢?这主要是因为目标检测任务除了注重每个region的分类精度外,还看重region的位置准确度。但是之前在第一步SS算法时,实际上已经将region的位置固定下来了。这里再进行调整还有提升空间吗?有的,实验均显示采用了bbox regression的mAP有所提升。定性来说,可以这么理解,N个类别中,例如人,其大致的aspect和structure是固定的。如果此时得到一个分类为人的region,采用的bbox regression就可以理解为对该region的位置和长宽进行调整,使得改造后的aspect和structure更接近人的比例。上面的想法也说明,需要训练的是类别-敏感的bbox regressor。此外,我个人猜测,一个通用的对所有类别一致的bbox regressor可能对提高region的定位精度并没有什么用,当然这个猜想需要验证,文中尚未给出。
具体地,文中的bbox regressor是一个岭回归模型,训练样本对并不简单的(Px,Py,Pw,Ph)和(Gx,Gy,Gw,Gh),而是经过了一番数据处理的(Px,Py,Pw,Ph)和(tx,ty,tw,th),详细的数据变换请参看文中7.3部分。
值得注意的是,为了训练好这个模型,在构建训练样本对时,针对每个region proposal P,只采用和P的IOU最大的ground-truth bbox G,且该IOU必须大于0.6的阈值。这样组成的样本对才能进入 bbox regression的训练集。也就是说,选择靠得尽可能相近的P和G来进行训练。这主要是考虑到bbox regression不能讲原有的位置P带得太远,不然影响最终的mAP效果。
此外,实验发现,只进行一次bbox regression即可,若是在当前回归的结果上在进行一次bbox regression,效果并没有改善。
其它
文中还做了很多实验来验证每个模块的意义,例如:
- 4.1节的可视化,遍历数据库,测试使得pool5层的某六个unit响应极高的前几名的region,从示例图看出,pool5 unit已经开始对应上一些特定的概念。
- 4.2.1节提到的不采用fine-tuning时,pool5,fc6,fc7特征分别用于SVM分类时,检测性能相对DPM等均有提升,但是pool5的提升最大。文中说是说明pool5之前的卷积特征更为重要,我认为“百尺竿头,更进一步”,检测性能的提升本来就是越高越难,fc7相对pool5提高不多,也无可非议。
- 4.2.2节提到采用fine-tuning时,pool5,fc6,fc7特征用于SVM分类时,检测性能又有提升,且此时的fc层的提升更大。这说明 fine-tuning 显著地调整了fc 层的权重,使其更适用于目标数据集的检测任务。综合上一条,发现卷积层是一个相对通用的特征提取器,而fc层更多的是针对task和数据集的不同进行自适应调整。