检测论文综述(一) : 从RCNN到Mask-RCNN

对于目标检测方向并不是特别熟悉,本文记录一下RCNN, fast-RCNN, faster-RCNN, mask-RCNN这4篇有关目标检测的论文笔记和学习心得。

RCNN - Rich feature hierarchies for accurate object detection and semantic segmentation

R-CNN的意思就是Region based,主要思路就是根据一张图像,提取多个region,再将每个Region输入CNN来进行特征的提取。因此RCNN就可以分为Region proposals, Feature extraction两个主要部分,提取的特征就可以输入任意一个分类器来进行分类。
模型的流程图如下:

RCNN

在具体的实现中

  1. 图像中第2步的region proposals,可以使用selective search来进行,对于每一张图像,selective search大约提取出2000个框。
  2. 接着,这个框所选中的图像区域,经过预处理(首先将框稍微扩张使得候选框能够包含部分context信息,也就是物体的环境信息,接着将扩张后的图像resize到固定大小)变成一个227*227大小的图像
  3. 这些227*227的region图像输入到CNN中,最终的FC层输出4096维的特征向量
  4. 分类,训练一个SVM用于分类

训练

在训练的时候,首先使用的是已经训练好的CNN网络作为特征提取器,但是由于预训练是在分类数据集上,因此在应用到检测之前要做finetune。也就是说,为了将用ImageNet数据集训练的网络应用到新的任务(检测),新的数据集(region)上,作者将原来的CNN最后的1000类的fc层,更改为了N+1层,N代表待检测的物体的类别数。然后,对于所有的region,如果它和ground truth的重叠率大于0.5,就认为是正类。
对于分类器的训练,作者发现选择多大的IoU来区分正类和负类非常关键。并且,对于每一类,都会训练一个分类器。

Bounding Box Regression

框的回归非常重要,在对每一个region proposal使用分类器进行打分评价之后,作者使用一个回归器来预测一个新的框作为结果。这个回归器使用的特征是从CNN中提取的特征。回归器的训练中,输入是 region proposal 的 x, y, w, h和ground truth的x, y, w, h,目标是学习一种变换,使得region proposal通过该变换能够接近ground truth。同时,希望这种变换拥有尺度不变性,也就是说尺度变化的话,变换不会改变。
如下图所示,每一个regressor会学习一组参数,特征输入是pool 5的特征输出,拟合的目标是t_*^i

regressor
变换目标

Fast-RCNN

Fast-RCNN 主要解决的问题是在RCNN中对于每一个region proposal都进行特征提取,会产生非常多的冗余计算,因此可以先对一张图像进行特征提取,再根据region proposal在相应的特征上进行划分得到对应region的特征(映射关系)。
这样便可以实现共享计算提高速度,但是与SPPnets不同,SPPnets在一副图像得到对应的特征后,从这张图像的特征上proposal对应的部分,采用空间金字塔池化,如下图:

空间金字塔池化

如此,对于不同输入大小的proposal都能得到一个固定大小的特征向量。
Fast R-CNN也采用了上面的办法,但是不同的是使用了一个RoI pooling 而不是空间金字塔池化,这就对应了Fast R-CNN解决的另外一个问题,就是多个阶段训练的问题。就像在讲解R-CNN的时候,R-CNN需要先使用selective search进行region的选择,再finetune一个预训练的模型,再训练SVM分类器,再进行框的回归。而Fast-RCNN将finetune和分类器的训练结合了起来。原因也非常简单,因此Fast R-CNN采用的RoI pooling是可以进行反向传播的,也就是可以求导的。
求导公式如下:
RoI求导

直观上讲,就是对于输入的
x
的每一个值,如果它是最大值,导数就是
1 * \partial{loss} / \partial{y_{rj}}
,只是需要在每一个region proposal的每一个输出上进行累加。如果不是最大值,就是0。

RoI pooling层

RoI pooling的方法很简单,类似于空间金字塔pooling,它将proposal部分对应卷积层输出的特征(称之为RoI,因为用于做pooling的特征是 region of interest,也就是我们感兴趣的区域)划分成H*W块,然后对每一块求最大值,最终得到了一个 H*W的特征图。可以看出,它只是空间金字塔pooling的一部分。
但是SPP-nets的空间金字塔也是可以求导的,那么它到底不好在哪里呢?因为当每一个RoI都可能来源于不同的图像的时候(R-CNN和SPPnets的训练策略是从一个batch的不同图像中,分别挑选一个proposal region),SPPNets的训练非常地低效,这种低效来源于在SPPnets的训练中,每个RoI的感受野都非常地大,很可能对应了原图的整个图像,因此,得到的特征也几乎对应了整张图像,所以输入的图像也就很大。
为了提高效率,Fast-RCNN首先选取N个图像,再从每个图像上选择R/N个RoI,这样的效率就比从每个图像提取一个RoI提高了R/N倍。

多任务 loss

为了将分类和框回归结合起来,作者采用了多任务的loss,来进行联合的训练。具体来说就是将分类的loss和框回归的loss结合起来。网络的设计上非常直接,就是将RoI得到的特征接几个FC层后,分别接不同的输出层。对应于分类部分,特征会接一个softmax输出,用于分类,对于框回归部分,会接一个输出4维特征的输出层,然后分别计算loss,用于反向传播。loss的公式如下:


loss
回归loss

回归的target可以参考前面的R-CNN部分。

notes

  1. 尺度不变的检测。
  2. 在进行预测的时候,还可以通过SVD来简化FC的运算来加快速度。

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

为什么比fast还fast呢?主要原因是在这篇论文中提出了一个新的层:RPN(region proposal networks)用于替代之前的selective search。这个层还可以在GPU上运算来提高速度。
RPN的目的:

  1. 有效地进行region proposal,在不同的大小,不同的尺度,不同的比例下
  2. 支持反向传播
  3. 支持在GPU上运算
  4. 能够和Fast R-CNN结合起来运算
    如下图:


    faster rcnn结构

Region Proposal Networks

为了能够进行region proposal,作者使用了一个小的网络,在基础的卷积层输出的特征上进行滑动,这个网络输入大小为n*n,输入后会映射(用n*n的卷积)为一个固定长度的特征向量,然后接两个并联的fc层(用1*1的卷积层代替),这两个fc层,一个为box-regressoin,一个为box-classification。如下图:

RPN

在每一个滑动窗口(可以参考https://blog.csdn.net/bingochenjx/article/details/78422290),为了考虑到尽可能多的框的情况,作者设计了anchors来作为region proposal。anchors就是对于每一个滑动窗口的中心位置,在该位置对应的原图位置的基础上,按照不同的尺度,长宽比例框出k个不同的区域。然后根据这些anchors对应的原始图像位置以及区域,和ground truth,就可以给每一个滑动窗口的每一个anchor进行标记,也就是赋予label,满足一定条件标记为正类(比如和ground truth重叠大于一个值),一定条件为负类。对于正类,就可以根据ground truth和该anchor对应的原图的区域之间的变换关系(参考前面的R-CNN的框回归),得到回归器中的目标,用于训练。也就是论文中的loss function部分:

loss

自然地,也就要求RPN的两个并联的FC层一个输出2k个值用于表示这k个anchor对应的区域的正类,负类的概率,另一个输出4k个值,用于表示框回归的变换的预测值。

训练RPN和Fast R-CNN

对于整个网络的训练,作者采用了一种叫做4-step Alternating Training的方法。具体可以参考论文。

Mask R-CNN

与之前的检测任务稍有不同,mask r-cnn的任务是做instance segmentation。因此,它需要对每一个像素点进行分类。
与Faster R-CNN不同,Faster R-CNN对每一个候选框产生两个输出,一个是类别,一个是bounding box的offset。Mask R-CNN新增加了一个输出,作为物体的mask。这个mask类似于ps中的蒙版。

与Faster R-CNN类似的是,Mask R-CNN同样采用RPN来进行Region Proposal。但是在之后,对于每一个RoI,mask r-cnn还输出了一个二值化的mask。

Mask Representation

不像类别,框回归,输出都可以是一个向量,mask必须保持一定的空间信息。因此,作者采用FCN来从每个RoI中预测一个m*m的mask。

RoIAlign

由于属于像素级别的预测问题,就需要RoI能够在进行特征提取的时候保持住空间信息,至少在像素级别上能够对应起来。因此,传统的取最大值的方法就显得不合适。
RoI Pooling,经历了两个量化的过程:
第一个:从roi proposal到feature map的映射过程。
第二个:从feature map划分成7*7的bin,每个bin使用max pooling。

为此,作者使用了RoIAlign。如下图


RoIAlign

为了避免上面提到的量化过程

  1. 使用 x/16 而不是int(x/16),也就是说在进行roi proposal到feature map的映射过程中,不进行四舍五入。
  2. 对于每一个bin(也就是一个pooling之后的特征 对应的feature map的区域)使用bilinear interpolation来计算,之后使用max或者average pool。

可以参考https://blog.csdn.net/xiamentingtao/article/details/78598511

模型结构

作者使用ResNet作为基础的特征提取的网络。
对于预测类别,回归框,mask的网络使用如下图结构:


Head结构

总结

整体看完这几篇大佬的论文,虽说没有弄清楚每一个实现细节,但是大体上了解了算法的思路。可以看出,出发点都源于深度神经网络在特征提取上的卓越能力,因此一众大神试图将这种能力应用在检测问题中。从R-CNN中简单地用于特征提取,到为了提高速度减少计算的Fast R-CNN,再到为了将region proposal集成进入整个模型中,并且利用GPU加速的RPN,也就是Faster R-CNN。再到为了应用于instance segmentation任务中,设计的RoIAlign和mask。包括bounding box regression,pooling层的设计,训练方法的选择,loss的设计等等细节,无一不体现了大师们的思考和创造力。
可能在我们这些“拿来”者的眼中,这些方法都显得“理所应当”和巧妙,好用,但是,它们背后隐藏的选择和这些选择的思考却更值得我们学习。
以及,对待每一个问题,如何设计出合理的解决方案,以及方案的效率,通用性,更是应该我们努力的方向。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容