有很多优秀的作者都对这篇文章进行了翻译,我从那些笔记中摘选出我认为比较重要的进行记录。
RCNN学习笔记(7):Faster R-CNN 英文论文翻译笔记——>http://blog.csdn.net/u011534057/article/details/51259812
RCNN学习笔记(5):faster rcnn——>http://blog.csdn.net/u011534057/article/details/51247371
Faster R-CNN论文详解——>http://lib.csdn.net/article/deeplearning/46182
____________________________________________________________________________________________________________________________________
关键:区域建议网络(Region Proposal Network, RPN)
RPN和检测网络
共享全图的卷积特征,使得计算区域建议框几乎不花时间(例如每个图像10ms)。
- RPN是一个全卷积网络,在每个位置同时预测目标边界和objectness得分。
- RPN是端到端训练的,生成高质量区域建议框,用于Fast R-CNN来检测。
- 通过一种简单的交替运行优化方法,RPN和Fast R-CNN可以在训练时共享卷积特征。
构造RPN
作者观察发现:基于区域的检测器例如Fast R-CNN使用的卷积(conv)特征映射,同样可以用于生成区域建议。
在这些卷积特征后面
增加两个额外的卷积层,构造RPN:
- 第一个层把每个卷积映射位置编码为一个短的(例如256-d)特征向量
- 第二个层在每个卷积映射位置,输出这个位置上多种尺度和长宽比的k个区域建议的objectness得分和回归边界(k=9是典型值)
Faster R-CNN统一的网络结构如下图所示,可以简单看作RPN网络+Fast R-CNN网络。
注意:上图Fast R-CNN中仍然含特有卷积层。
具体步骤:
- 首先向CNN网络【ZF或VGG-16】输入任意大小图片;
- 经过CNN网络前向传播至最后共享的卷积层,一方面得到供RPN网络输入的特征图,另一方面继续前向传播至特有卷积层,产生更高维特征图;
- 供RPN网络输入的特征图经过RPN网络得到区域建议框和区域得分,并对区域得分采用非极大值抑制【阈值为0.7】,输出其Top-N【文中为300】得分的区域建议给RoI池化层;
- 第2步得到的高维特征图和第3步输出的区域建议框同时输入RoI池化层,提取对应区域建议框的特征;
- 第4步得到的区域建议特征通过全连接层后,输出该区域的分类得分以及回归后的bounding-box。
RPN网络结构如上图所示:
过程:在最后一个共享的卷积层输出的卷积特征映射上
滑动小网络,这个网络
全连接到输入卷积特征映射的nxn的空间窗口上。每个滑动窗口
映射到一个低维向量上(对于ZF是256-d,对于VGG是512-d,每个特征映射的一个滑动窗口对应一个数值)。这个向量输出给两个
同级的全连接的层——bbox回归层(reg)和bbox分类层(cls)。
建模:全卷积网络
注意:上图中卷积层/全连接层表示卷积层或者全连接层,作者在论文中表示这两层实际上是全连接层,但是网络在所有滑窗位置共享全连接层,可以很自然地用n×n卷积核【论文中设计为3×3】跟随两个并行的1×1卷积核实现
RPN网络结构
RPN的网络流程图,利用了SPP的映射机制,从conv5上进行滑窗来替代从原图滑窗。
特征提取
原始特征提取(下图灰色方框)包含若干层conv+relu,直接套用ImageNet上常见的分类网络即可。本文试验了两种网络:5层的ZF,16层的VGG-16,具体结构不再赘述。
额外添加一个conv+relu层,输出51*39*256维特征(feature)。
训练方案
目的:实现attention机制,从
RPN网络结构中可以看出,RPN在CNN卷积层后增加
滑动窗口操作以及
两个卷积层完成区域建议功能,第一个卷积层
将特征图每个滑窗位置编码成一个特征向量,第二个卷积层
对每个滑窗位置输出k个区域得分和k个回归后的区域建议,并对得分区域进行非极大值抑制后输出得分Top-N【文中为300】区域,告诉检测网络应该注意哪些区域,本质上实现了Selective Search、EdgeBoxes等方法的功能。
具体实现:
- 首先套用ImageNet上常用的图像分类网络,本文中试验了两种网络:ZF或VGG-16,利用这两种网络的部分卷积层产生原始图像的特征图;
- 对于 1 中特征图,用n×n【论文中设计为3×3,n=3看起来很小,但是考虑到这是非常高层的feature map,其size本身也没有多大,因此9个矩形中,每个矩形窗框都是可以感知到很大范围的】的滑动窗口在特征图上滑动扫描【代替了从原始图滑窗获取特征】,每个滑窗位置通过卷积层1映射到一个低维的特征向量【ZF网络:256维;VGG-16网络:512维,低维是相对于特征图大小W×H,typically~60×40=2400】后采用ReLU,并为每个滑窗位置考虑k种【论文中k=9】可能的参考窗口【论文中称为anchors,见下解释】,这就意味着每个滑窗位置会同时预测最多9个区域建议【超出边界的不考虑】,对于一个W×H的特征图,就会产生W×H×k个区域建议;
- 步骤 2 中的低维特征向量输入两个并行连接的卷积层2:reg窗口回归层【位置精修】和cls窗口分类层,分别用于回归区域建议产生bounding-box【超出图像边界的裁剪到图像边缘位置】和对区域建议是否为前景或背景打分,这里由于每个滑窗位置产生k个区域建议,所以reg层有4k个输出来编码【平移缩放参数】k个区域建议的坐标,cls层有2k个得分估计k个区域建议为前景或者背景的概率
候选区域、参考窗口(anchor)
特征可以看做一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积
× 三种比例
。这些候选窗口称为anchors。
步骤:
(1)首先按照尺度和长宽比生成9种anchor,这9个anchor的意思是conv5 feature map 3x3的滑窗对应原图区域的大小。这9个anchor对于任意输入的图像都是一样的,所以只需要计算一次.。(大小对应关系有了,下一步就是中心点对应关系)
(2)对于每张输入图像,根据图像大小计算conv5 3x3滑窗对应原图的中心点。
有了中心点对应关系和大小对应关系,映射就显而易见了。
如下图示,RPN网络中对特征图滑窗时每个滑窗位置所对应的原图区域中9种可能的大小,相当于模板,对任意图像任意滑窗位置都是这9种模板。继而根据图像大小计算滑窗中心点对应原图区域的中心点,通过中心点和size就可以得到滑窗位置和原图位置的映射关系,由此原图位置并根据与Ground Truth重复率贴上正负标签,让RPN学习该Anchors是否有物体即可。
作者在文中表示采用Anchors这种方法具有
平移不变性,就是说
在图像中平移了物体,窗口建议也会跟着平移。同时这种方式也
减少了整个模型的size,(输出层512×(4+2)×9=2.8×10^4个参数【512是前一层特征维度,(4+2)×9是9个Anchors的前景背景得分和平移缩放参数】,而MultiBox有1536×(4+1)×800=6.1×10^6个参数)而较小的参数可以在小数据集上减少过拟合风险。
当然,在RPN网络中我们只需要找到大致的地方,无论是位置还是尺寸,后面的工作都可以完成,这样的话采用小网络进行简单的学习【估计和猜差不多,反正有50%概率】,还不如用深度网络【还可以实现卷积共享】,固定尺度变化,固定长宽比变化,固定采样方式来大致判断是否是物体以及所对应的位置并降低任务复杂度。
在整个faster RCNN算法中,有
三种尺度。
原图尺度:原始输入的大小。不受任何限制,不影响性能。
归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定。这个参数和anchor的相对大小决定了想要检测的目标范围。
网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。
Anchors为什么考虑三种尺度和长宽比?
文中对Anchors的尺度以及长宽比选取进行了实验,如下图所示:
实验是在VGG-16模型下,采用PASCAL VOC 2007训练集和PASCAL VOC 2007测试集得到。
相比于只采用单一尺度和长宽比,单尺度多长宽比和多尺度单长宽比都能提升mAP,表明多size的anchors可以提高mAP,作者在这里选取了最高mAP的3种尺度和3种长宽比。
如何处理多尺度多长宽比问题?即如何使24×24和1080×720的车辆同时在一个训练好的网络中都能正确识别?
文中展示了两种解决多尺度多长宽比问题:
一种是使用图像金字塔,对伸缩到不同size的输入图像进行特征提取,虽然有效但是费时;
另一种是使用滤波器金字塔或者滑动窗口金字塔,对输入图像采用不同size的滤波器分别进行卷积操作,这两种方式都需要枚举图像或者滤波器size;作者提出了一种叫Anchors金字塔的方法来解决多尺度多长宽比的问题,在RPN网络中对特征图滑窗时,对滑窗位置中心进行多尺度多长宽比的采样,并对多尺度多长宽比的anchor boxes区域进行回归和分类,利用Anchors金字塔就仅仅依赖于单一尺度的图像和特征图和单一大小的卷积核,就可以解决多尺度多长宽比问题,这种对推荐区域采样的模型不管是速度还是准确率都能取得很好的性能。
同传统滑窗方法提取区域建议方法相比,RPN网络有什么优势?
传统方法是训练一个能检测物体的网络,然后对整张图片进行滑窗判断,由于无法判断区域建议的尺度和长宽比,所以需要多次缩放,这样找出一张图片有物体的区域就会很慢;
虽然RPN网络也是用滑动窗口策略,但是滑动窗口实在卷积层特征图上进行的,维度较原始图像降低了很多倍【中间进行了多次max pooling 操作】,RPN采取了9种不同尺度不同长宽比的anchors,同时最后进行了bounding-box回归,即使是这9种anchors外的区域也能得到一个跟目标比较接近的区域建议。
窗口分类和位置精修
分类层(cls_score)输出每一个位置上,9个anchor属于前景和背景的概率;
窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数。
对于每一个位置来说:
分类层从256维特征中输出属于前景和背景的概率;
窗口回归层从256维特征中输出4个平移缩放参数。
就局部来说,这两层是全连接网络;就全局来说,由于网络在所有位置(共51*39个)的参数相同,所以实际用尺寸为1×1的卷积网络实现。
需要注意的是:并没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正。
____________________________________________________________________________________________________________________________________
训练处理
对样本的处理
考察训练集中的每张图像:
a. 对每个标定的真值候选区域,与其重叠比例最大的anchor记为前景样本
b. 对a)剩余的anchor,如果其与某个标定重叠比例大于0.7,记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本
c. 对a),b)剩余的anchor,弃去不用。
d. 跨越图像边界的anchor弃去不用
为了训练RPN,我们给每个anchor分配一个二进制的标签(即是不是目标)。
分配正标签给两类anchor:(i)对每个标定的真值候选区域,与其重叠比例最大的anchor记为前景样本 ,(ii)与任意标定的真值候选区域有大于0.7的IoU交叠的anchor。注意到一个GT包围盒可能分配正标签给多个anchor。
分配负标签给与所有GT包围盒的IoU比率都低于0.3的anchor。
非正非负的anchor对训练目标没有任何作用。
正样本仅表示前景,负样本仅表示背景;
回归操作仅针对正样本进行;
训练时弃用所有超出图像边界的anchors,否则在训练过程中会产生较大难以处理的修正误差项,导致训练过程无法收敛;
对去掉超出边界后的anchors集采用非极大值抑制,最终一张图有2000个anchors用于训练。
SGD mini-batch采样方式:同Fast R-CNN网络,采取”image-centric”方式采样,即采用层次采样,先对图像取样,再对anchors取样,同一图像的anchors共享计算和内存。每个mini-batch包含从一张图中随机提取的256个anchors,正负样本比例为1:1【当然可以对一张图所有anchors进行优化,但由于负样本过多最终模型会对正样本预测准确率很低】来计算一个mini-batch的损失函数,如果一张图中不够128个正样本,拿负样本补凑齐。
学习区域建议的损失函数
遵循Fast R-CNN中的多任务损失,最小化目标函数。对一个图像的损失函数定义为
i 是一个mini-batch中anchor的索引,Pi表示anchor i是目标的预测概率。如果anchor为正,GT标签 Pi* 就是1,如果anchor为负,Pi* 就是0(由此可以看出回归损失项仅在anchor为正样本情况下才被激活)。
ti 是一个向量,表示正样本anchor到预测区域的4个平移缩放参数【以anchor为基准的变换】,ti* 表示正样本anchor到Ground Truth的4个平移缩放参数【以anchor为基准的变换】。
分类损失 Lcls 是两个类别(目标vs.非目标)的对数损失(二值【是物体或者不是物体】分类器):
归回损失函数Lreg:
其中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项差不多是等权重的。)
对于回归,采用4个坐标:
x,y,w,h指的是包围盒中心的(x, y)坐标、宽、高。变量x,xa,x*分别指预测的包围盒、anchor的包围盒、GT的包围盒(对y,w,h也是一样)的x坐标。可以理解为从anchor包围盒到附近的GT包围盒的包围盒回归。
RPN网络中bounding-box回归的实质其实就是计算出预测窗口。这里以anchor窗口为基准,计算Ground Truth对其的平移缩放变化参数,以及预测窗口【可能第一次迭代就是anchor】对其的平移缩放参数,因为是以anchor窗口为基准,所以只要使这两组参数越接近,以此构建目标函数求最小值,那预测窗口就越接近Ground Truth,达到回归的目的;
文中提到, Fast R-CNN中基于RoI的bounding-box回归所输入的特征是在特征图上对任意size的RoIs进行Pool操作提取的,所有size RoI共享回归参数,而在Faster R-CNN中,用来bounding-box回归所输入的特征是在特征图上相同的空间size【3×3】上提取的,为了解决不同尺度变化的问题,同时训练和学习了k个不同的回归器,依次对应为上述9种anchors,这k个回归量并不分享权重。因此尽管特征提取上空间是固定的【3×3】,但由于anchors的设计,仍能够预测不同size的窗口。
____________________________________________________________________________________________________________________________________
训练过程
RPN网络预训练
样本 |
来源 |
正样本 |
ILSVRC20XX |
负样本 |
ILSVRC20XX |
样本中只有类别标签;
文中一带而过RPN网络被ImageNet网络【ZF或VGG-16】进行了有监督预训练,利用其训练好的网络参数初始化;
用标准差0.01均值为0的高斯分布对新增的层随机初始化。
Fast R-CNN网络预训练
样本 |
来源 |
正样本 |
ILSVRC20XX |
负样本 |
ILSVRC20XX |
样本中只有类别标签;
文中一带而过Fast R-CNN网络被ImageNet网络【ZF或VGG-16】进行了有监督预训练,利用其训练好的网络参数初始化。
RPN网络微调训练
RPN网络样本 |
来源 |
正样本 |
与Ground Truth相交IoU最大的anchors【以防后一种方式下没有正样本】+与Ground Truth相交IoU>0.7的anchors |
负样本 |
与Ground Truth相交IoU<0.3的anchors |
PASCAL VOC 数据集中既有物体类别标签,也有物体位置标签;
正样本仅表示前景,负样本仅表示背景;
回归操作仅针对正样本进行;
训练时弃用所有超出图像边界的anchors,否则在训练过程中会产生较大难以处理的修正误差项,导致训练过程无法收敛;
对去掉超出边界后的anchors集采用非极大值抑制,最终一张图有2000个anchors用于训练;
对于ZF网络微调所有层,对VGG-16网络仅微调conv3_1及conv3_1以上的层,以便节省内存。
Fast R-CNN网络微调训练
Fast R-CNN网络样本 |
来源 |
正样本 |
Ground Truth +与Ground Truth相交IoU>阈值的区域建议 |
负样本 |
与Ground Truth相交IoU<阈值的区域建议 |
PASCAL VOC 数据集中既有物体类别标签,也有物体位置标签;
正样本表示每类物品的Ground Truth以及与Ground Truth重叠度超过某一阈值的区域建议,负样本表示同Ground Truth重叠度小于某一阈值的区域建议;
回归操作仅针对正样本进行。
RPN网络、Fast R-CNN网络联合训练
训练网络结构示意图如下所示:
如上图所示,RPN网络、Fast R-CNN网络联合训练是为了让两个网络共享卷积层,降低计算量。
文中通过4步训练算法,交替优化学习至共享特征:
① 进行上面RPN网络预训练,和以区域建议为目的的RPN网络end-to-end微调训练;
② 进行上面Fast R-CNN网络预训练,用第①步中得到的区域建议进行以检测为目的的Fast R-CNN网络end-to-end微调训练【此时无共享卷积层】;
③ 使用第②步中微调后的Fast R-CNN网络重新初始化RPN网络,固定共享卷积层【即设置学习率为0,不更新】,仅微调RPN网络独有的层【此时共享卷积层】;
④ 固定第③步中共享卷积层,利用第③步中得到的区域建议,仅微调Fast R-CNN独有的层,至此形成统一网络如上图所示。
为什么不能分别学习两个网络而是要共享卷积层?
RPN和Fast R-CNN都是独立训练的,要用不同方式修改它们的卷积层。因此需要开发一种允许两个网络间共享卷积层的技术。注意到这不是仅仅定义一个包含了RPN和Fast R-CNN的单独网络,然后用反向传播联合优化它那么简单。原因是
Fast R-CNN训练依赖于固定的目标建议框,而且并不清楚当同时改变建议机制时,学习Fast R-CNN会不会收敛。作者开发了一种实用的
4步训练算法,通过交替优化来学习共享的特征。
第一步,依上述训练RPN,该网络用ImageNet预训练的模型初始化,并端到端微调用于区域建议任务。
第二步,利用第一步的RPN生成的建议框,由Fast R-CNN训练一个单独的检测网络,这个检测网络同样是由ImageNet预训练的模型初始化的,这时候两个网络还没有共享卷积层。
第三步,用检测网络初始化RPN训练,但是固定共享的卷积层,并且只微调RPN独有的层,现在两个网络共享卷积层了。
第四步,保持共享的卷积层固定,微调Fast R-CNN的fc层。这样,两个网络共享相同的卷积层,构成一个统一的网络。
____________________________________________________________________________________________________________________________________
相关工作
用深度网络定位类确定或类不确定的bbox 的方法:
- Scalable object detection using deep neural networks.【In CVPR, 2014】
- Overfeat: Integrated recognition,localization and detection using convolutional networks. 【In ICLR, 2014.】
- Scalable, high-quality object detection.
- Deep neural networks for object detection. 【In NIPS, 2013】
在OverFeat方法[2]中,训练全连接(fc)层,对假定只有一个目标的定位任务预测bbox坐标。fc层再转入卷积层来检测多个类确定的目标。
MultiBox方法[1, 3]从最后一个fc层同时预测多个(如800)bbox的网络中生成区域建议,R-CNN就是用的这个。他们的建议框网络应用于单个图像或多个大图像的切割部分(如224x224)[3]。
作者在后文中讲他们的方法时更深层次地讨论OverFeat和MultiBox。
____________________________________________________________________________________________________________________________________
some questions
文中提到了三种共享特征网络的训练方式?
① 交替训练
训练RPN,得到的区域建议来训练Fast R-CNN网络进行微调;此时网络用来初始化RPN网络,迭代此过程【文中所有实验采用】;
② 近似联合训练
如上图所示,合并两个网络进行训练,前向计算产生的区域建议被固定以训练Fast R-CNN;反向计算到共享卷积层时RPN网络损失和Fast R-CNN网络损失叠加进行优化,但此时把区域建议【Fast R-CNN输入,需要计算梯度并更新】当成固定值看待,忽视了Fast R-CNN一个输入:区域建议的导数,则无法更新训练,所以称之为近似联合训练。实验发现,这种方法得到和交替训练相近的结果,还能减少20%~25%的训练时间,公开的python代码中使用这种方法;
③ 联合训练
需要RoI池化层对区域建议可微,需要RoI变形层实现,具体请参考这片paper:Instance-aware Semantic Segmentation via Multi-task Network Cascades。
图像Scale细节问题?
文中提到训练和检测RPN、Fast R-CNN都使用单一尺度,统一缩放图像短边至600像素;
在缩放的图像上,对于ZF网络和VGG-16网络的最后卷积层总共的步长是16像素,因此在缩放前典型的PASCAL图像上大约是10像素【~500×375;600/16=375/10】。
网上关于Faster R-CNN中三种尺度这么解释:
原始尺度:原始输入的大小,不受任何限制,不影响性能;
归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定,这个参数和anchor的相对大小决定了想要检测的目标范围;
网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224×224。
以上6行博主并不懂,还需要仔细研究源码。
理清文中anchors的数目。
文中提到对于1000×600的一张图像,大约有20000(~60×40×9)个anchors,忽略超出边界的anchors剩下6000个anchors,利用非极大值抑制去掉重叠区域,剩2000个区域建议用于训练;
测试时在2000个区域建议中选择Top-N【文中为300】个区域建议用于Fast R-CNN检测。