Faster R-CNN整体介绍及部分细节讲解

论文全称: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时的具体架构图

在这里插入图片描述

二、论文细节(论文中出现顺序排列)

  1. RPN(Region Proposal Network)
    图→CNN→候选框+检测分数
    在特征图上滑动
    在这里插入图片描述
  2. anchor box只依赖单一尺寸的图片和特征图,用单一尺寸的filters(用单一尺寸的特征图,训练针对不同比例、大小的分类器,后面会有讲解)
  3. RPN的正例:a.和真值框IoU最高的anchor b.和任意真值框IoU大于0.7的anchor
    负例:与所有真值框的IoU均小于0.3
  4. 损失函数:
    在这里插入图片描述
    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)
    λ=10\lambda=10:用于平衡两个加和项(实验证明这个参数设多少影响不大)
  5. 候选框回归:
    在这里插入图片描述
    x,y,w,h:中心座标、候选框宽、高
    x,xa,x*:预测框、锚框、真值框
  6. RPN中,采用(3*3)大小的窗口大小在特征图上滑动。
    在这里插入图片描述
    但由于学了k个regressor,而这些回归器不共享参数,所以相当于得到了多尺度多比例的候选框。
  7. 用"image-centric" sampling训练RPN
  8. mini-batch:一张照片中的正负anchors(随机在这张图片的所有anchors中抽样256个,正负样例比例1:1,如果正例样本数小于128,则用负例补满256个anchor)
  9. 用预训练过的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数据集上设置的参数不同,后面会讲)
  10. 训练步骤:a.用ImageNet模型参数初始化之后,先训练RPN网络
    b. 用ImageNet模型参数初始化之后,利用刚刚RPN网路的输出proposal训练fast RCNN
    c.用Fast RCNN网络初始化RPN的模型参数,但冻住共享部分,只训练RPN的独特部分
    d.保持共享部分,训Fast RCNN的独有部分
  11. resize图片使短边长度600pixel。VGG网络和ZF网络(本论文的实验部分以VGG和ZF两种网络作为backbone进行了实验)最后一层卷积层的stride=16。
    训练时忽视了超出图像边界的框,不过测试时将所有框都加上了,不过将超出边界的位置裁剪掉了
  12. RPN网络输出proposal时,因为候选框也就是proposal互相重叠,所以根据cls层的分数,进行了极大值抑制(NMS)。需要NMS的框互相之间IoU大于等于0.7。在NMS后,用分数top-N的候选框进行检测(训练时是N=2000)
  13. 部分实验参数设置: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\in[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=WTϕt=W^T\phi,也就是一个全连接层。输入是锚框对应的特征图ϕ\phi,输出是t,通过损失函数来优化参数W。由于要将t向t*靠近,所以损失函数在本文中定为了smooth L1,
在这里插入图片描述
也就是smoothL1(tt)smooth_{L1}(t-t^*)
而得到了偏移之后的具体用法如下:
Gx=Awtx+AxGy=Ahty+AyGw=Awexp(tw)Gh=Ahexp(th) G'_x=A_wt_x+A_x \\ G'_y=A_ht_y+A_y \\ G'_w=A_wexp(t_w) \\ G'_h=A_hexp(t_h)
其中A是初始锚框,GG'是通过t修正后的锚框。前两个公式是平移变换,后两个公式是缩放变换。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章