《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun
——学习资料记录(Simon John)
文章拟解决问题(Towards Real-Time)
SPP net和Fast R-CNN提取proposal(s)的方法是十分消耗时间。因此作者提出了:区域提取网络(Region Proposal Network, RPN),它和检测网络共享全图的卷积特征,几乎不花时间。
1.方法概述
Faster RCNN = Fast RCNN + RPN。
作者提出RPN提取proposal,在 Fast R-CNN使用的卷积(conv)特征映射(注:文章作者用的是ZF和VGG-16的最后一个卷积层)之后增加两个额外的卷积层,构造RPN:(1)第一个层把每个卷积映射位置(即:扫窗后的区域映射到原图)的特征编码(类似于卷积过程)为一个短的(例如256-d)特征向量,(2)第二个层在每个卷积映射位置,输出这个位置上多种尺度和长宽比的k个proposal的objectness得分和回归边界(k=9是典型值)。
RPN是一种全卷积网络(fully-convolutional
network, FRN)可以针对生成检测proposals的任务端到端地训练。为了统一RPN和Fast R-CNN[5]目标检测网络,作者提出一种简单的训练方案,即保持proposals固定,微调proposal和微调目标检测之间交替进行。这个方案收敛很快,最后形成可让两个任务共享卷积特征的标准网络。
2.RPN细节
RPN将一个图像(任意大小)的特征作为输入,输出矩形Proposal的集合,每个框有一个objectness得分。
RPN和Fast
R-CNN共享计算,所以这两个网络共享一系列卷积层。在最后一个共享的卷积层输出的卷积特征映射上滑动小网络,这个网络全连接到输入卷积特征映射的nxn(本文中n=3)的空间窗口上。每个滑动窗口映射到一个低维向量上(对于ZF是256-d,对于VGG是512-d,每个特征映射的一个滑动窗口对应一个数值)。
将这个向量输出给两个同级的全连接的层——包围盒回归层(reg)和包围盒分类层(cls)。注意图像的有效感受野很大(ZF是171像素,VGG是228像素)。 图1(左)举例。注意,由于小网络是滑动窗口的形式,所有位置用来计算内积的nxn的层参数相同(文章中n=3)。这种结构实现为nxn的卷积层,后接两个同级的1x1的卷积层(也就是全连接网络的意思,分别对应reg和cls),ReLU应用于nxn卷积层的输出。
图1:左:proposal网络(RPN)。右:用RPN proposals在PASCAL VOC 2007测试集上的检测实例。可以在很大范围的尺度和长宽比中检测目标。
备注:anchor(上图结构的三个窗口不是三个不同的扫窗窗口,扫窗窗口是固定的3X3)
在每一个滑动窗口的位置,同时预测k个Proposals。则:reg层有4k个输出(即k个box的坐标编码)。cls层输出2k个得分(即对每个proposals是目标/非目标的估计概率,文章为简单起见,是用二类的softmax层实现的cls层,作者提到:可以用logistic回归来生成k个得分)。
k个Proposals框被相应的k个称为anchor的box参数化。每个anchor以当前滑动窗口中心为中心,映射到原图的一个区域,以这个区域中心对应一个尺度和长宽比,文章使用3种尺度和3种长宽比(1:1;1:2;2:1),则在每一个滑动位置就有k=9个anchor。
实现细节
对于anchor,用3个简单的尺度,包围盒面积为128x128,256x256,512x512,和3个简单的长宽比,1:1,1:2,2:1。
(注:在预测大proposals时,作者文中说的算法考虑了使用大于基本感受野的anchor包围盒。这些预测不是不可能——只要看得见目标的中间部分,还是能大致推断出这个目标的范围)。这句话我没看明白
通过这个设计,解决方案不需要多尺度特征或者多尺度滑动窗口来预测大的区域,节省了相当多的运行时间。图1(右)显示了算法处理多种尺度和长宽比的能力。下表是用ZF网络对每个anchor学到的平均proposals大小(s=600)。
(注:跨越图像边界的anchor包围盒要小心处理。在训练中,我们忽略所有跨越图像边界的anchor,这样它们不会对损失有影响)
特征图和原图的对应关系,需要下一步补充!
例子:对于一个典型的1000x600的图像,差不多总共有20k(~60x40x9)anchor。忽略了跨越边界的anchor以后,每个图像只剩下6k个anchor需要训练了。如果跨越边界的异常值在训练时不忽略,就会带来又大又困难的修正误差项,训练也不会收敛。在测试时,还是应用全卷积的RPN到整个图像中,这可能生成跨越边界的proposals,然后将其裁剪到图像边缘位置。
RPN产生的 proposals和其他proposals会有大量重叠,为了减少冗余,采用非极大值抑制(non-maximum
suppression, NMS)。固定对NMS的IoU阈值为0.7,这样每个图像只剩2k个proposals。NMS不会影响最终的检测准确率,但是大幅地减少了proposals的数量。NMS之后,用proposals中的top-N个来检测。
3训练Faster RCNN网络
3.1 训练RPN
(RPN=cls层和reg层,注:256-D的特征直接这两个全连接层,先对此刻slide window得到的proposal进行cls,输入的是此刻proposal的得分,一个节点;如果是目标,在输给reg层进行坐标的回归,输出为四个节点,注意reg层用的还是此刻proposal对应的256-D特征。也就是cls和reg层用的特征是一样的。)
对于cls层
给每个anchor分配一个二进制的标签(是目标还是背景)。
正标签给两类anchor:(i)与某个ground
truth(GT)包围盒有最高的IoU(Intersection-over-Union,交集并集之比)重叠的anchor(注:也许不到0.7);
(ii)与任意GT包围盒有大于0.7的IoU交叠的anchor。
(注意:一个GT包围盒可能分配正标签给多个anchor。分配负标签给与所有GT包围盒的IoU比率都低于0.3的anchor)。(注:非正非负的anchor对训练目标没有任何作用)。
那么对一个图像的损失函数定义为 :
(这里,i是一个mini-batch中anchor的索引,Pi是anchor i是目标的预测概率。如果anchor为正,GT标签Pi* 就是1,如果anchor为负,Pi* 就是0。ti是一个向量,表示预测的包围盒的4个参数化坐标,ti* 是与正anchor对应的GT包围盒的坐标向量。)
分类损失*Lcls是两个类别(目标vs.非目标)的对数损失。
对于回归损失*,用 来计算,其中R是鲁棒的损失函数(smooth L1)。
Pi* Lreg这一项意味着只有正anchor(Pi* =1)才有回归损失,其他情况就没有 (Pi* =0)。cls层和reg层的输出分别由{pi}和{ti}组成,这两项分别由Ncls和Nreg以及一个平衡权重λ归一化(早期实现及公开的代码中,λ=10,cls项的归一化值为mini-batch的大小,即Ncls=256,reg项的归一化值为anchor位置的数量,即Nreg~2,400,这样cls和reg项差不多是等权重的。
对于回归
理解为从anchor包围盒到附近的GT包围盒的包围盒回归。
Bounding
Box 的细节,请看http://caffecn.cn/?/question/160
具体的推导和解释已经上传至 Tower。(感兴趣的请查看)
每个anchor对应一个regressors。(注:每一个回归量对应于一个尺度和长宽比的anchor,k个anchor所对应的回归量之间不共享权重。因此,即使特征具有固定的尺寸/尺度,预测各种尺寸的包围盒仍然是可能的)
4.训练 Faster RCNN网络
(注:proposal与目标检测(Fast RCNN)共享卷积特征)
RPN和Fast
R-CNN都是独立训练的,要用不同方式修改它们的卷积层。因此作者提出一种允许两个网络间共享卷积层的技术,而不是分别学习两个网络。(注意到这不是仅仅定义一个包含了RPN和Fast R-CNN的单独网络,然后用反向传播联合优化它那么简单。原因是Fast R-CNN训练依赖于固定的目标proposals,而且并不清楚当同时改变建议机制时,学习Fast R-CNN会不会收敛。虽然这种联合优化在未来工作中是个有意思的问题)
作者开发了一种实用的4步训练算法(结尾有作者介绍),通过交替优化来学习共享的特征。
第一步,依上述训练RPN,该网络用ImageNet预训练的模型初始化,并端到端微调RPN用于proposal任务。
第二步,我们利用第一步的RPN生成的proposals,由Fast R-CNN训练一个单独的检测网络,Fast R-CNN检测网络同样是由ImageNet预训练的模型初始化的,这时候两个网络还没有共享卷积层。
第三步,用检测网络Fast R-CNN再进行RPN训练,但固定共享的卷积层,并且只微调RPN独有的层,现在两个网络共享卷积层了。
第四步,保持共享的卷积层固定,微调Fast R-CNN的其它层。这样,两个网络共享相同的卷积层,构成一个统一的网络。
4.优化
RPN为全卷积网络,通过反向传播(BP)和随机梯度下降(SGD)端到端训练。遵循 “image-centric”采样策略训练这个网络。每个mini-batch由包含了许多正负样本的单个图像组成。
随机地在一个图像中采样256个anchor,计算mini-batch的损失函数,其中采样的正负anchor的比例是1:1。如果一个图像中的正样本数小于128,就用负样本填补这个mini-batch。
通过从零均值标准差为0.01的高斯分布中获取的权重来随机初始化所有新层(最后一个卷积层其后的层),所有其他层(即共享的卷积层)是通过对ImageNet分类预训练的模型来初始化的。
(作者在PASCAL数据集上对于60k个mini-batch用的学习率为0.001,对于下一20k个mini-batch用的学习率是0.0001。动量是0.9,权重衰减为0.0005)
注:Faster RCNN
Faster
R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
https://github.com/rbgirshick/py-faster-rcnn
https://github.com/ShaoqingRen/faster_rcnn