Faster R-CNN 论文详解【论文笔记 + pytorch实现 附.pth权重文件】

写在前面

      Ren, Shaoqing, Kaiming He, Ross Girshick, and Jian Sun. 2015. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. arXiv.org. June 4..

      在R-CNN、SPPNet、Fast R-CNN基础上,创新的Faster R-CNN可以简单地看做“区域生成网络RPN+fast RCNN”的系统,用RPN代替Fast RCNN中的Selective Search方法,进而可以得到一种端到端训练方法。这篇论文着重解决了这个系统中的三个问题:

  1. 如何设计区域生成网络
  2. 如何训练区域生成网络
  3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络

0 Abstract

     之前提出的SPPnet和Fast R-CNN网络已经极大地减少了网络的运行时间,但是候选区域计算仍然是一个对于网络运算时间的瓶颈,这篇论文旨在解决该问题。作者引入了一个候选区域网络(RPN),该网络与原来的检测网络(即Fast R-CNN)共享全图像的卷积特征,从而使得候选区域的计算成本降到最低。
     RPN是一个全卷积网络,可以同时在每个特征图位置预测目标边界和目标分数。由于使用Fast R-CNN网络用于检测,RPN通过端到端的训练,可以生成高质量的候选区域,故作者将RPN和Fast R-CNN通过共享卷积特征进一步合并为一个单一的网络

1 Introduction

     Fast R-CNN首先生成图片的卷积图,之后再通过Search Selective选择候选区域。在生成的卷积图之上,可以通过添加一些额外的卷积层来构建RPN,而这个RPN取代了Search Selective。这些卷积层同时在特征图上的每个位置上回归区域边界和目标分数。由于RPN是一种全卷积网络,可以针对生成检测候选区域的任务进行端到端的训练。下图是Faster R-CNN结构的整体框图。

      RPN可以高效预测具有很大范围的图片尺寸和长宽比的候选区域。

      不同于改变原始图像的尺寸大小或者是改变过滤器的尺寸,作者引入新的“锚”盒(anchor boxes)作为多种尺寸和长宽比的参考,该方案避免了枚举多种比例或长宽比的图像或滤波器。这个模型在使用单尺度图像进行训练和测试时运行良好,从而有利于运行速度。

2 FASTER R-CNN

     目标检测系统Faster R-CNN由两个模块组成。第一个模块是提出候选区域的PRN,第二个模块是使用候选区域作为输入的的Fast R-CNN模型。

     RPN模块告诉Fast R-CNN模块在哪里寻找需检测的目标,即代替了Fast RCNN中的Selective Search方法。在2.1节中,介绍候选区域网络的设计和属性。在2.2节中,设计了用于训练具有共享特征模块的算法。

2.1 RPN(Region Proposal Networks)

     RPN以图像的特征图作为输入,输出一组矩形的候选区域,每个区域都有一个目标得分。因为最终目标是RPN与Fast R-CNN目标检测网络共享计算,所以假设两个网络共享一组共同的卷积层。

     为了生成候选区域框,在最后一个共享的卷积层输出的卷积特征图上滑动mini网络,这个mini网络在输入卷积特征图上取出n×n大小的空间窗口(在论文中取n=3)。每一个滑动窗口被映射为一个低维度的特征。这个特征被输入到两个并行的1×1卷积层中,一个是边界框回归层,一个是框分类层。这个mini网络如下图所示。

     在每一个候选窗口的位置,同时预测k个候选区域,所以reg层有4k个输出(4个参数定义一个矩形);cls层输出2k个得分,即对每个候选区域是目标/非目标的估计概率(为简单起见,使用二类的softmax层实现的cls层,还可以用logistic回归来生成k个得分)。

     这里注意:由于mini网络以滑动窗口的方式进行操作,可以在nxn的卷积网络后跟两个1×1的卷积网络层(分别是reg和cls)来实现,ReLU应用于nxn卷积层的输出。具体请看下图红框部分。(整个流程请看第三部分)

2.1.1 Anchor

     对于得到的特征图的每一个位置,考虑9种大小的候选窗口:三种面积{1282,2562,5122}×三种比例{1:1,1:2,2:1}。这些候选窗口称为anchors。每个anchor以当前候选窗口的中心为中心,并对应一种尺度和长宽比,这样在每一个滑动位置就有k=9个anchor。对于大小为WxH的卷积特征图,总共有W×H×k个anchor。

     下面这张图更好的展示了论文中anchor的位置及大小。

anchor的平移不变性

     作者的方法保证了平移不变性,且无论是anchor还是相对anchor计算候选区域的函数都有这个特性。平移不变性指的是如果在一张图片上移动一个物体, 那么候选区域也应该平移并且相同的函数应该能够在新的位置也计算出该候选区域来。平移不变特性也减小了模型的大小。

多尺度anchor作为回归参照物
     anchor的设计解决了多尺度(和长宽比)的问题。目前多尺度预测有两种流行的方法,第一种方法是基于图像/特征金字塔,即图像在多个尺度上进行缩放,并且针对多个尺寸的同一图片计算特征图,但该方法非常耗时;第二种方法是在特征图上使用多尺度(和/或长宽比)的过滤器。

     anchor通过考虑9个可能的候选窗口:三种面积{1282,2562,5122}×三种比例{1:1,1:2,2:1},参照多尺度和长宽比的anchor来分类和回归边界框,它只依赖单一的图像尺寸、特征图和滤波器(特征图上的滑动窗口)。

2.1.2 损失函数

      在训练RPN过程中,给每个anchor标记一个二进制的标签(positive/negative)。符合下面两类情况之一的anchor则标记为positive:

  1. 与真实边界框有最高的IoU的anchor(也许不到0.7)
  2. 与任意真实边界框的IoU>0.7的anchor。(注意到对于同一个真实边界框可能有多个positive标签的anchor)

      对于与任意真实边界框的IoU<0.3的anchor标记为negative;非正非负的anchor对训练目标没有任何作用。

     在这些定义的基础上,结合遵循Fast R-CNN中的多任务损失来最小化目标函数。对一个图像的损失函数定义为

     其中i为每一个mini-batch中的anchor的索引;pi为预测anchor i 是positive的概率;如果anchor为positive,则真实标签p*i为1,如果anchor为negative,p*i为0;

     ti是包含预测边界框的4个参数化坐标的向量;同理,t*i表示anchor为positive时的真实边界框。

     分类损失Lcls是两个类别上(目标或不是目标)的交叉熵损失。

     对于回归损失,使用Lreg(ti,t*i)=R(ti - t*i),其中R是鲁棒损失函数(平滑L1)。

      其中Pi*×Lreg这一项意味着只有anchor为positive时即(Pi* =1)才有回归损失,其他情况则没有(Pi* =0);

     公式中Ncls和Nreg用于归一化,Ncls为#mini-batch(Ncls = 256),Nreg为anchor的个数(Nreg~2400)。默认设置λ = 10,这样使得两部分的权重大致相等。

     对于边界框回归,采用的4个坐标参数为:

     其中,x,y,w和h表示边界框的中心坐标及其宽和高。变量x,xa和x*分别表示预测边界框、anchor和实际边界框,该公式可以理解为anchor到邻近的真实边界框的回归。如下图所示,其中红色的A框是生成的anchor box,而蓝色的G’框是经过RPN网络训练后得到的较精确的预测框,绿色的G是ground truth box。

     在SPPNet和Fast R-CNN中,通过对于任意尺寸的RoIs进行特征池化,并且回归权重由所有区域大小共享;而在Faster R-CNN中,用于回归的特征在特征图上具有相同的空间大小(3×3)。

     考虑到候选区域的不同大小,需要学习一系列k(k=9)个边界框回归器。每一个回归器对应于一个尺度和长宽比,且k个回归量之间不共享权重。因此,由于anchor的设计,即使用于回归的特征具有固定的尺度/比例,仍然可以预测各种尺寸的边界框。

2.1.3 训练RPNs

     RPN可以通过反向传播和随机梯度下降(SGD)进行端对端的训练。采用“以图像为中心”的采样策略来训练这个网络,即每个小批量数据都从包含许多positive和negative锚点的单张图像中产生。

     随机采样一张图片中的256个anchors去计算一个mini-batch的损失函数,其中采样的positive anchor和negative anchor的比率可达1:1。如果一个图像中的正样本数小于128,就用负样本填补这个mini-batch。

     将模型中的所有新层(所有共享卷积层之后的层)的权值初始化为均值为0、标准差为0.01的高斯分布,所有其他层(即共享的卷积层)是通过对ImageNet分类预训练的模型来初始化的。

     对于前60k个mini-batch,学习率为0.001;对于之后的20k个mini-batch,学习率是0.0001;momentum为0.9,权重衰减为0.0005。

2.2 RPN和Fast R-CNN共享特征

     独立训练RPN和Fast R-CNN将以不同的方式修改卷积层权重,因此需要开发一种允许在两个网络之间共享卷积层的技术,而不是训练两个独立的网络。作者提出三种方法来训练具有共享特征的网络:

  1. 交替训练。首先训练RPN,并使用这些候选区域来训练Fast R-CNN。将微调Fast R-CNN网络后的结果用于初始化RPN,并且重复这个过程。这是本文所有实验中使用的解决方案。
  2. 近似联合训练。将RPN和Fast R-CNN网络在训练期间合并成一个网络。在每次SGD迭代中,前向传递生成候选区域,在训练Fast R-CNN检测器时,将RPN生成的候选区域看作是固定的、预计算的区域。反向传播像往常一样进行,其中对于共享层,将来自RPN损失和Fast R-CNN损失的反向传播信号结合起来。但是这个解决方案忽略了关于RPN响应的导数,因此是近似的。
  3. 非近似联合训练。需要一个关于边界框坐标可微分的RoI池化层,这个方法在论文中仅仅简单提了一下。

     接下来着重阐述一下论文使用的四步交替训练:

  1. 将RPN网络用ImageNet预训练的模型初始化,对于候选区域任务进行端到端微调;
  2. 将Fast R-CNN网络用ImageNet预训练的模型初始化,将第一步得到的候选区域输入到Fast R-CNN网络中用于训练;
  3. 使用训练后的Fast R-CNN网络初始化RPN模型,将共享卷积层固定,仅仅微调RPN网络独立的卷积层;
  4. 保持共享卷积层参数不变,微调Fast R-CNN网络独立的卷积层。

2.3 实现细节

     RPN生成的某些候选区域和其他候选区域大量重叠,为了减少冗余,采用基于候选区域的cls得分的非极大值抑制(non-maximum suppression, NMS),固定对NMS的IoU阈值为0.7,这样使得每张图像只剩2k个候选区域。NMS不会影响最终的检测准确率,并且大幅地减少了候选区域的数量,进而减少了训练时间。
     注意并不是将这2k个候选区域全部检测,而是在NMS之后,将候选区域中的top-N个送入分类器和回归器,所以Faster-RCNN和RCNN、Fast-RCNN一样,都属于two-stage的检测算法。

3 汇总网络执行过程

     这里以ResNet模型作为特征提取网络,来阐述Faster R-CNN的具体执行过程。首先下图为该模型的Faster R-CNN框架。

     这里将Faster R-CNN模型算法共分为四个颜色不同的框图,对应着四个步骤:

1.Conv layers(绿框)。作为一种cnn网络目标检测的方法,faster_rcnn首先对输入进来的图片尺寸进行处理,一般会把输入图片的短边固定成600,Resize后的图片保持原图片的宽高比;通过特征提取网络ResNet50(还可以用VGG16、GoogleNet)等分类特征提取网络来获取图片的特征图,该特征图被共享用于后续的RPN层和全连接层。Faster R-CNN之后的操作均在特征图上进行处理。

2.Region Proposal Networks(蓝框)。RPN网络用于生成建议框。该层通过softmax判断anchors属于foreground或者background,再利用box regression修正anchors获得精确的propocals;
3.Roi Pooling(红框)。该层收集输入的特征图和建议框,综合这些信息提取proposal feature map,送入后续的全连接层判定目标类别;
4.Classification(橙框)。利用proposal feature map计算建议框的类别,同时再次bounding box regression获得检验框的最终精确位置。

     下面结合上图对于任意一张图片经过该网络的处理过程进行阐述:

3.1 Conv layers

     对于Faster R-CNN网络输入一张P×Q大小的图像,首先网络将图像resize为M×N大小,之后经过ResNet50得到该图像的特征图。这里需注意:

  • Faster-RCNN的主干特征提取网络部分只包含了长宽压缩了四次的内容,第五次压缩后的内容在ROI中使用,即Faster-RCNN在主干特征提取网络所用的网络层仅为ResNet50中网络的一部分,如下图所示。
  • 这里将参数具体化,假定输入图片大小为(600, 600, 3),则经过主干网络得到的特征图大小为(38, 38, 1024)
  • 故在进行卷积时,输入与输出的大小相同,而经过4个pooling后的特征图大小应为(M/16, N/16);
  • 记得之前讲到对于特征图上的每一个位置有9个anchor,而这9个anchor则对应原图中16×16的图像区域。

3.2 Region Proposal Networks

     得到的feature map作为RPN网络的输入。首先经过3×3卷积层和relu层,相当于feature map上的每个点又融合了周围3x3的空间信息,增加网络的鲁棒性;其结果并行输出两路,一路用于给anchor标记positive/ negative;另一路用于修正anchor框的位置。最后的Proposal层则负责综合positive anchors和边界框偏移量获取proposals,同时剔除太小和超出实际原图像边界的proposals。

     对于这条路,首先通过`1×1`卷积对输入特征计算scores进而标记每个anchor;这里使用了18个`1×1`卷积核,故输出大小为`M/16 x N/16x 18`,刚好对应了feature maps每一个点都有9个anchors,且每个anchor有两种标记(positive/ negative);而后面接softmax层用于获得positive anchors。      而softmax前后接一个reshape层的目的是为了便于softmax分类,主要是caffe框架的softmax实现形式所需要,且第二个Reshape将`M/16 x N/16`的尺寸大小变为`M × N`大小,用于Proposal层剔除超出实际原图像边界的proposals。

     对于这条路,首先通过1×1卷积用于对输入计算anchor相对于真实边界框的变换量;这里使用了36个1×1卷积核,故输出大小为M/16 x N/16x 36,因为共有9个anchor,每个anchor的位置有四个变量确定。
     Proposal层结合输入的positive anchors和回归后的边界框,首先剔除尺寸非常小的positive anchors和超出实际原图像边界的proposals,之后对剩余的positive anchors进行NMS(nonmaximum suppression),最后取top-N个结果作为Proposal层的输出。(该层对应于文末提供项目中的class ProposalCreator()函数)

3.3 RoI pooling

     Proposal层的输出为由anchor选出的得分排名前N个候选框,RoI pooling层的输入为图片的特征图和Proposal层的输出的结合,故可将RoI pooling的输入理解为是根据候选框的位置扣出不同大小的特征图。
     RoI pooling的主要作用为将大小不同的特征图划分为相同大小的sections(sections数量与输出的维度相同),再对每个sections进行max pooling操作;
     故RoI pooling为每个候选区域提取固定大小的特征图,即输入特征图尺寸不固定,但是输出特征图尺寸固定。参考下图,经过RoiPoolingConv层后输出特征图尺寸均变为14×14。

3.4 Classification

     Classification部分由ResNet第五部分和全连接层组成。对于RoI pooling的输出,经过ResNet第五部分的卷积网络又将特征图大小缩小为7×7,最后接上ResNet50网络最后的大小为7×7的池化层,得到大小为(32×1×1×2048)的特征信息,经过扁平化后尺度变为(32×2048)。
     最后接上两个并行的全连接层,分别输出每个候选框的分类以及位置偏移量用于回归更加精确的目标检测框。对于上图情况,具体大小为[32, 84]、[32, 21]。
     经过这4步则完成了对于一张图片的目标检测。

3.5 TIPs

     需要注意的是,真实边界框的表标注是由框的左上点坐标和右下点坐标组成的,但是网络计算出的是边界框的位置偏移量,而并非框的坐标点位置。需要根据框的左上点坐标和右下点坐标,将边界框以中心位置x, y和宽高来表示,这样可以根据网络计算出的位置偏移量来改变x, y, h, w,最后再将这四个变量转换为左上点坐标和右下点坐标的形式,以便于在图片上绘制框框。

4 pytorch实现

     个人感觉Faster R-CNN还是一个比较大的项目的,pytorch实现对于很多自学者来说还是很有挑战性的。本人在github上找了很多Faster R-CNN pytorch实现,最终发现一个很好理解且可以在自己笔记本上(GTX 950M)进行训练预测的一个项目。
     结果展示:

      原作者github链接:https://github.com/bubbliiiing/faster-rcnn-pytorch
      个人fork原项目后github链接(代码中仅附更详细注释):
      https://github.com/Bryce-HJ/Faster-R-CNN-by-pytorch

     这么大的一个项目,把代码直接贴在博客中感觉也不会很静下心来去看代码,所以个人建议还是通过本篇Blog的基础知识结合项目代码一起学习才会更高效。以上全为自学,有任何问题欢迎指出讨论。

     该项目使用pytorch版本为 pytorch == 1.2.0,最初本人使用1.6版本的pytorch运行该项目,出现很多语法及例如@staticmethod等错误,百度一圈后还是决定新建一个对应版本的虚拟环境,以避免修改很多对应版本的语法问题错误。

     同样,在通过40h的漫漫训练,感觉模型已经可以很好的进行预测了,对于硬件条件限制的自学者,也提供对应的权重文件,可以直接将该权重文件放入项目中对图片进行预测。
     权重文件获取方式:关注【OAOA】回复【0816】即可。

参考知乎博客,文中图片部分来自源论文,部分来自该知乎博客。(强推)
参考博客 + 代码

欢迎关注【OAOA

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值