论文全称:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
目录
一、整体总结
1. 训练过程
先训RPN,后训fast rcnn检测器
之后用冻住共享部分训RPN独特部分
最后冻住共享部分训Fast Rcnn独特部分
2. 较Fast RCNN性能提升原因
主要是采用了能在GPU上运行的RPN提高了时间效率
通过实验得知,共享网络参数等均对mAP有所提高,其中影响最大的是cls层和reg层。RPN网络在proposal数设置的小时效果仍很好,说明RPN网络提议的proposal很好
不用NMS后效果降低,说明NMS可能并未对检测效果有很大影响,且减少了false alarm
3. 整体架构
A. conv layers
用于特征提取,生成特征图。本文中所用的conv layers部分有ZF网络和VGG网络两种。
B. Region Proposal Network(RPN)
用滑动窗口的方式在整个特征图上进行扫描,将其通过3*3的conv层(intermediate layer),之后再将conv层之后的结果分别通过1*1 conv的cls层和reg层,这两层分别用于判断锚框中是否有物体和锚框的位置偏移。
由于本文中利用同样尺寸(3*3)大小的特征图,要判断多种不同尺度不同比例的锚框是否有物体,还有锚框的位置偏移,所以本文中针对类别数k设置了k个参数不共享的回归器。
所以针对每一个3*3大小的特征图像窗口,cls层的输出是2k大小(锚框内是否有目标)的,reg层的输出是4k大小(窗口中心点座标偏移和宽高偏移)的。在得到所有窗口的cls层和reg层的结果后,选择cls层分数最高的K个锚框进行后续的检测,此处的K是自己设定的。
C. ROI Pooling+classifier(与Fast RCNN相似)
此部分和下图所示的Fast R-CNN结构一致。
在通过RPN网络得到K个最有可能有目标的锚框(锚框就相当于上图中的红框,是画在原始图像上的)之后,需要先将其进行映射,将每个锚框对应的特征图找出来。通过上文了解到,特征图将原始图像通过conv layers(对应Fast RCNN中的Deep ConvNet)得到的,所以在找锚框对应特征图时,要知道conv layers对原始图像做的处理。
以conv layers是VGG-16网络时为例,VGG网络的conv层、relu层都不会改变图像的大小,而每个pooling层都会使得图像大小减少一半,也就是由(H,W)变为(H/2,W/2),且总共有4个pooling层。所以原始图像的(H,W)变为了(H/16, W/16)。那么在将锚框映射到对应特征图的时候,将大小为(h,w)的锚框,缩小为(h/16, w/16)大小的锚框,将对应座标也缩小16倍即可得到对应的特征图位置,也就是完成了上图中的RoI projection部分。
然而由于锚框大小比例等不同,所以每个锚框对应的特征图大小比例也不同,所以为了使得锚框的特征图能够输入同样的网络中,固定不同锚框的特征图大小,采用了RoI Pooling的方式。
RoI Pooling可以采用RoI max Pooling还有RoI average Pooling两种方式。在本文中采用的是max Pooling的方式。为了使得大小为(h,w)的特征图池化到大小为(H,W)的特征图,可以将大小为(h,w)的特征图分成H*W个不同的小块,每个小块的大小为(h/H, w/W),之后将这些小块中最大值作为(H,W)大小特征图的对应位置的特征值即可。
RoI Pooling完成后,将特征图通过全连接层处理得到Rol特征向量,之后再分别通过两个不同的全连接层,通过softmax对锚框内物体类别进行预测,通过回归器对锚框位置进行矫正。
例:VGG16为conv layers时的具体架构图
二、论文细节(论文中出现顺序排列)
- RPN(Region Proposal Network)
图→CNN→候选框+检测分数
在特征图上滑动
- anchor box只依赖单一尺寸的图片和特征图,用单一尺寸的filters(用单一尺寸的特征图,训练针对不同比例、大小的分类器,后面会有讲解)
- RPN的正例:a.和真值框IoU最高的anchor b.和任意真值框IoU大于0.7的anchor
负例:与所有真值框的IoU均小于0.3 - 损失函数:
i:mini-batch中anchor索引
pi:第i个anchor是目标的概率
pi*:真值标签(如果anchor是正例则为1,负例则为0)
ti:预测的目标框4点座标向量
ti*:真值框4点
Lcls:log loss(2类,是否是目标)
Lreg(ti, ti*)=R(ti-ti*),R是robust loss func(smooth L1)
Ncls:用于normalization,mini-batch大小(文中设置256)
Nreg:用于normalization,anchor位置个数(文中设置2400)
:用于平衡两个加和项(实验证明这个参数设多少影响不大) - 候选框回归:
x,y,w,h:中心座标、候选框宽、高
x,xa,x*:预测框、锚框、真值框 - RPN中,采用(3*3)大小的窗口大小在特征图上滑动。
但由于学了k个regressor,而这些回归器不共享参数,所以相当于得到了多尺度多比例的候选框。 - 用"image-centric" sampling训练RPN
- mini-batch:一张照片中的正负anchors(随机在这张图片的所有anchors中抽样256个,正负样例比例1:1,如果正例样本数小于128,则用负例补满256个anchor)
- 用预训练过的ImageNet分类模型参数初始化已有层参数,用Gaussian初始化新定义的参数。
微调:ZFnet的所有层,conv 3_1和VGG的up部分
lr=0.001(60k iter),lr=0.0001(之后的20k iter)
momentum=0.9,weight decay=0.0005
(PASCAL VOC数据集上,COCO数据集上设置的参数不同,后面会讲) - 训练步骤:a.用ImageNet模型参数初始化之后,先训练RPN网络
b. 用ImageNet模型参数初始化之后,利用刚刚RPN网路的输出proposal训练fast RCNN
c.用Fast RCNN网络初始化RPN的模型参数,但冻住共享部分,只训练RPN的独特部分
d.保持共享部分,训Fast RCNN的独有部分 - resize图片使短边长度600pixel。VGG网络和ZF网络(本论文的实验部分以VGG和ZF两种网络作为backbone进行了实验)最后一层卷积层的stride=16。
训练时忽视了超出图像边界的框,不过测试时将所有框都加上了,不过将超出边界的位置裁剪掉了 - RPN网络输出proposal时,因为候选框也就是proposal互相重叠,所以根据cls层的分数,进行了极大值抑制(NMS)。需要NMS的框互相之间IoU大于等于0.7。在NMS后,用分数top-N的候选框进行检测(训练时是N=2000)
- 部分实验参数设置:a. Pascal VOC 2007和Pascal VOC 2012上进行了实验
backbone: fast version of ZF网络:5 conv,3全连接
VGG-16:13 conv,3全连接
b. COCO数据集上进行了实验:8GPU
mini-batch大小:RPN时是8,fast RCNN时是16
lr=0.003(240k iter)→lr=0.0003(之后的80k iter)
负样例:与真值框的IoU[0, 0.5)
RPN网络提出300个proposal
将图像resize到单一尺寸,也就是短边长度为600pixel
三、回归器reg层原理
这个链接讲的很好:https://zhuanlan.zhihu.com/p/31426458
总体就是为了将当前锚框向真值框靠近,需要回归器回归出当前锚框与真值框之间的偏移。回归出的偏移用t表示,真实的偏移用t*表示。这些偏移的计算公式如下:
其中x、y、w、h分别代表窗口中心座标和窗口宽高。所以接下来就是如何求得t值并尽量向t*靠近了。为了求得t值,本文利用了线性变换的方式,,也就是一个全连接层。输入是锚框对应的特征图,输出是t,通过损失函数来优化参数W。由于要将t向t*靠近,所以损失函数在本文中定为了smooth L1,
也就是。
而得到了偏移之后的具体用法如下:
其中A是初始锚框,是通过t修正后的锚框。前两个公式是平移变换,后两个公式是缩放变换。