fasterrcnn论文_【论文解读】精读Faster RCNN

  • Faster R-CNN论文链接

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

  • 推荐代码:

https://github.com/facebookresearch/Detectron (首推!Faster RCNN原班人马复现代码,模型有很多,Faster RCNN、端到端的Faster RCNN、Mask RCNN以及keypoint net。但是基于caffe2实现,可读性差)

https://github.com/tensorflow/models/tree/master/research/object_detection (由google实现,专人维护,同样有可选多模型。基于tensorflow实现,使用了tensorflow各种特性,对tensorflow没有一定掌握程度的同学,很难读懂代码)

https://github.com/smallcorgi/Faster-RCNN_TF (python2,tensorflow,最大的亮点是类函数链式调用实现网络结构,可读性强超强。唯一缺点就是roi pooling的代码没有开源)

https://github.com/endernewton/tf-faster-rcnn (tensorflow,slim,有全部实现代码,可读性较强)

(您的点赞是对知识分享的最大认可,谢谢)

一、概述

Faster R-CNN是截止目前,RCNN系列算法的最杰出产物,two-stage中最为经典的物体检测算法。推理第一阶段先找出图片中待检测物体的anchor矩形框(对背景、待检测物体进行二分类),第二阶段对anchor框内待检测物体进行分类。

fasterrcnn论文_【论文解读】精读Faster RCNN_第1张图片
图一 Faster R-CNN检测示例

R-CNN系列物体检测算法的思路都是,先产生一些待检测框,再对检测框进行分类。Faster R-CNN使用神经网络生成待检测框,替代了其他R-CNN算法中通过规则等产生候选框的方法,从而实现了端到端训练,并且大幅提速。如果不了解R-CNN、Fast R-CNN,建议不必深究,不影响读懂Faster R-CNN

前文中推荐的几篇解读,在各种Faster R-CNN文章中算是比较出类拔萃的,本文同样将其作为参考。Faster R-CNN实现细节相对复杂,论文以及论文解读,都无法百分之百还原算法全貌,透彻理解需要同时阅读代码。

二、网络结构

fasterrcnn论文_【论文解读】精读Faster RCNN_第2张图片
图二 Faster R-CNN结构图(素材源自文章《一文读懂Faster RCNN》)

整个Faster R-CNN可以分为三部分:

  1. backbone:共享基础卷积层,用于提取整张图片的特征。例如VGG16,或Resnet101,去除其中的全连接层,只留下卷基层,输出下采样后的特征图。
  2. RPN:候选检测框生成网络(Region Proposal Networks)。
  3. Roi pooling与分类网络:对候选检测框进行分类,并且再次微调候选框坐标(在RPN中,网络会根据先前人为设置的anchor框进行坐标调整,所以这里是第二次调整)。输出检测结果。

第一部分backbone就是普通的卷积网络,输出特征图供后续两阶段共用。第三部分中的分类网络,通过两个全连接层,再通过两个姊妹全连接层(论文中用词,指相同尺寸,不共享权值的两个全连接层),分别输出坐标微调回归信息与检测框分类信息。下面重点解释RPN与RoI pooling。

三、Region Proposal Networks

fasterrcnn论文_【论文解读】精读Faster RCNN_第3张图片
图三 论文中的RPN结构示意图

论文中这张图,说实话有点难理解,sliding window很容易误导人理解为anchor框。更清晰的结构图,继续引用《一文读懂Faster RCNN》中的RPN结构图:

fasterrcnn论文_【论文解读】精读Faster RCNN_第4张图片
图四 RPN结构(源自文章《一文读懂Faster RCNN》)

原来图三中的sliding window,是一个kernal size为3*3的卷积层。再通过两个姊妹1*1的卷积层,输出两个特征图,也就是图三中的2k scores、4k coordinates。

  1. 两个特征图维度与维度解释:假设anchor框个数k=9,RPN的输入特征图的尺寸是
    (w, h是特征图的宽高,假设之前的backbone是VGG16,那么此特征图的通道数是512),经过一个共同的3*3卷基层,两个独立的1*1的卷积层,输出
    的scores,与
    的coordinates。scores通道数18=9(anchor框个数)* 2(是待检测物体、不是待检测物体概率)。不明白这里是否属于待检测物体概率,为什么不用一个数来表示?coordinates通道数36=9*4(四个坐标回归数值
    )。
  2. scores分支中reshape层作用:将1*1卷积后的tensor先reshape,便于使用softmax层计算,之后再reshape回来。此处不影响对算法对理解,具体实现可以阅读代码。
  3. anchor坐标回归:sliding window如果不是anchor框的话,此处读者可能有疑惑,anchor框体现在哪里?coordinates分支网络中输出的通道4,分别将其标记为
    ,其含义如下:

对应的标签

含义如下:

其中,

分别是x的预测值、anchor框、真实标签对应值,
同理。
是矩形框的中心点坐标,
是矩形框的宽高。由相应的
产生loss。

也就是说,anchor框事先人为设定的宽高,全部蕴含在对应位置中,比如特征图上具体某一个点,一共输出36维数值,前4维,就固定按照进行anchor框1事先设定的

,结合当前处于特征图位置
,计算相应的
。第5至8维,按照anchor框2的
,计算相应的
......,
其中每个anchor框的
是固定的常数,不会改变,在训练与推理中保持一致

4. Proposal层:
Proposal层一共有5个输入参数:

  • rpn_cls_score:2k scores,用于区分正例负例框;
  • rpn_bbox_pred:矩形框回归数值
    ,用于还原矩形框;
  • im_info:原始图像resize后的宽高以及resize比例;
  • feat_stride:当前特征图下采样倍数(如果backbone是VGG16,那么此时Proposal层接收到的feature map下采样倍数为16);
  • anchor_scales:anchor框尺寸。

Proposal层所做的事情有:

  • 利用anchor框事先指定的scale,结合矩形框回归数值
    ,还原出检测框;
  • 在所有的检测框中,挑选出128个positive与128个negative,用于训练。当正例的检测框小于128个时,使用negative进行填充。这256个框的选取,可以在检测框置信度排序、nms、超出边界过滤之后,随机选取;
  • 输出Proposal Region:[x1, y1, x2, y2],positive框的坐标信息。此时的坐标信息,是对应图二中图像M*N尺寸的,原因是可以充分利用网络回归数值。如果对应于16倍下采样后的特征图,那么两个位置之间相差就是16个像素。

所以整个RPN的作用就是:

  1. 神经网络回归检测框,并且对检测框进行二分类(positive、negative);
  2. 输出过滤后的positive检测框(RoI)。

四、RoI pooling

RoI pooling源自Fast RCNN,原文中对RoI pooling定义如下:

RoI max pooling works by dividing the h × w RoI window into an H × W grid of sub-windows of approximate size h/H × w/W and then max-pooling the values in each sub-window into the corresponding output grid cell. Pooling is applied independently to each feature map channel, as in standard max pooling.

解释一下这里的具体操作:

对于一个

的特征图区域,要将其作为输入,送入后续
的网络中,需要做shape的适配。这里适配方式就是,在
的特征图中,用
个子窗口覆盖它。每个子窗口的shape就是
,每个子窗口的取值,就是对当前子窗口进行
max pooling,再直观一些,图示如下:

fasterrcnn论文_【论文解读】精读Faster RCNN_第5张图片
图五 RoI pooling

RPN在特征图中会产生尺寸不一致的Proposal区域,而在Faster RCNN中,之后的分类网络输入尺寸固定为7*7,所以对于任意大小的输入,都用7*7的网格覆盖原区域。在7*7中每个格子上,取当前格子覆盖区域内的最大值(max pooling)。任意大小的Proposal,就这样都pooling成了7*7的尺寸。

五、训练

  • Loss Function

回顾一下Faster RCNN的两个stage,RPN与之后的分类网络,输出都是坐标回归数值与分类数值,所以两个网络的Loss函数都可以用如下式子表达:

其中,

分类损失函数
,二分类与多分类,可以用不同的损失函数,
是一个用来平衡回归与分类loss比例的因子,
之前的
,控制了只有正例框才会产生检测框回归loss。
回归损失函数,原文中作者使用robust loss(smooth L1),表达式如下:

这里重点说下标签:原文中提到会指派一个二分类标签(是待检测物体or not),指定一个正例标签有两种情况:(1)IoU最高的anchor box;(2)IoU数值大于0.7。一般来说,条件(2)已经可以找到很多的正例框,(1)是用来防止一些IoU很小的罕见的检测框。

  • 训练过程

论文中所述,Faster R-CNN的训练一共有四个步骤:

In the first step, we train the RPN as described in Section 3.1.3. This network is initialized with an ImageNet-pre-trained model and fine-tuned end-to-end for the region pro- posal task. In the second step, we train a separate detection network by Fast R-CNN using the proposals generated by the step-1 RPN. This detection network is also initialized by the ImageNet-pre-trained model. At this point the two networks do not share convolutional layers. In the third step, we use the detector network to initialize RPN training, but we fix the shared convolutional layers and only fine-tune the layers unique to RPN. Now the two networks share convolutional layers. Finally, keeping the shared convolutional layers fixed, we fine-tune the unique layers of Fast R-CNN.

注:如图二所示,以下统一将特征提取部分卷基层称为backbone,RPN和Fast RCNN网络则指两个网络独有的网络结构部分。

  1. backbone使用ImageNet预训练模型初始化权重,使用抽样后的256个正负例anchor框开始训练RPN网络。backbone权重也参与微调。
  2. 使用第一阶段训练好的RPN,生成正例预测框,供Fast RCNN分类网络进行训练。此时backbone权值也使用ImageNet预训练模型初始化。截止第二步,RPN与Fast RCNN使用两个backbone,没有共享。
  3. 使用第2步中训练好的Fast RCNN网络中相应的backbone权值,初始化RPN网络之前的backbone,RPN部分使用第1步的训练结果进行初始化。第3步只微调RPN中的权值。截止第三步,Fast R-CNN与RPN开始共享backbone
  4. backbone与RPN权值不再改变,使用第2步训练的Fast RCNN部分结果初始化Fast RCNN,再次微调训练。

其实在代码实现中,从backbone到RPN,再到Fast RCNN分类网络,每一步计算都不丢弃变量的导数传递,那么可以实现整个网络的端到端训练。只需要用ImageNet预训练backbone,之后的RPN与Fast RCNN部分,同时产生loss,同时反向传播更新,backbone部分也一直在共享。端到端的训练方式更容易普及,更加便于工程化实现。

六、小结

Faster R-CNN第一阶段的RPN,简单修改之后,就成了一年之后的Yolo v1。

RPN、RoI pooling原理直观,但是编程实现,比Yolo系列要难很多,不断的数据shape对齐,并且在这些操作中不能丢弃参数之间的导数传递(例如不能使用tf.py_func),是非常考验深度学习编程功底的。

检测系列最经典的两个算法,R-CNN与Yolo,一个开创了区域检测思路,另一个开创了使用回归做物体检测。引用朋友的一句话,R-CNN与Yolo相对天才,而SSD就比较平庸了。

参考:

一文读懂Faster RCNN


完,欢迎指正。

你可能感兴趣的:(fasterrcnn论文)