R-FCN 笔记

R-FCN:Region-based Fully Convolutional Network

R-FCN 也是知名度较高的一个目标检测框架,mAP 和前传速度能够与 Faster R-CNN 一较高下,尽管速度比不过 YOLO 系,但相对而言准确度更高。值得一看的是里面的全卷积思路,使得 R-FCN 作为一个 two-stage 的方法却有着相对简单的网络结构。

R-FCN论文:R-FCN: Object Detection via Region-based Fully Convolutional Networks


出发点

对于知名的 R-CNN 系网络(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)而言,将每个 RoI 中的特征图分别进行前向传播都是不可避免的。尽管从 Fast R-CNN 起,这一弊端已经被权重共享的特征提取网络缓解了,但在其后的目标检测与分类网络上的运算仍然是 per-RoI 的。由于 RPN 可以提供以千为数量级的 RoI,R-CNN 系的网络结构在训练和预测过程中都会导致一定的时间消耗。

这些最先进的目标检测网络引入大量 per-RoI 运算的一个原因在于,它们都是基于 ResNet 或 GoogLeNet 等骨干网络的,这些骨干网络是全卷积的,因为骨干网络本来就是在图像分类数据集上进行预训练的。为了将网络的任务从“进行准确的分类”迁移到“定位目标并进行分类”,不得不在骨干网络后面再次引入多层的卷积结构,尽管这些卷积层的参数是共享的,但它们的运算却是分散的,这种结构——据 R-FCN 作者所言——是不自然的。

R-FCN 笔记_第1张图片
一般策略:对每个 RoI,分别进行共享权重的卷积(和可选的全连接)运算,这增加了计算开销

这并非在否认 R-CNN 系网络,毕竟至今它们仍是目标检测任务中的首选模型,并且在前向传播速度上也不能称之为慢。但尽管是最先进的方法,其中存在的问题也仍然确实值得解决。 R-FCN 的主要出发点就是尽可能地减轻 per-RoI 的运算,加快网络的训练和预测速度。


思路

在 R-FCN 论文中提出的观点:图像分类任务存在平移不变性,而深度卷积网络又具有不在意图像内容平移的特性,所以能够在此类任务中有非常好的表现;但对于目标检测任务而言,这种特性是无法很好地被过渡的,因为此时需要得到目标的位置信息,这在一定程度上引入了平移变化性。所以,不能直接将骨干网络的结构用于目标检测任务中。

许多其它方法中,解决这一问题的做法都是通过在特征图上进行 RoI Pooling 操作,以及进行后续的 per-RoI 运算,借此引入平移变化性。

与一般策略不同,R-FCN 的做法是,仍然通过共享运算的全卷积网络提取图像在空间上的特征,并且不令 RoI Pooling 层后还有任何可训练参数。


网络结构

RoI 的提取采用 RPN(Region Proposal Network),此项工作在 Faster R-CNN 中已有完善的实现,且几乎无需更多地进行训练。初步的特征提取在 ResNet-101 上进行,得到 feature maps。

R-FCN 笔记_第2张图片
R-FCN 网络结构


R-FCN 笔记_第3张图片
网络结构(注明通道数)

定义超参数,表示网络将把 RoI 分为的小窗格分别进行考虑。文中取 ,即把 RoI 分为 9 个小窗格子,考虑 RoI 的左上方、上方、右上方、左方、中间、右方、左下方、下方、右下方。

在初始特征图上引入新的卷积层,以得到对位置敏感的 score map,score map 通道数为,表示对于个类别而言的个RoI位置(或者,也可以理解成和在不同的维度上,不过这样子特征就是4维了,不好画图表示),这个 score maps 大概算整个论文里最抽象的东西了。尽管这些新的卷积层功能特殊,但它们在结构上与一般的卷积层没有什么差别。

在其后连接一个对位置敏感的特殊 RoI Pooling 层,以引导来自 score map 的信息。该池化层以及后续的层都不再具有可训练的权重。该池化层的池化算法需要单独说明。


位置敏感的 RoI Pooling 层

RoI 已由 RPN 得到,RoI Pooling 层将此 RoI 下的 score map 中的内容分割成的窗格。若 RoI 尺寸为,则每个窗格的大小为。

在 RoI Pooling 层中,对于每个类别,每个窗格最后都得到一个输出,此池化层采用平均池化,输出 shape 为。注意池化层之前 RoI 窗口内的特征 shape 为,按说池化层应该只改变尺寸,不改变通道数,可是这里的 RoI Pooling 却在改变特征图尺寸的同时,改变了其通道数,这里是 R-FCN 方法中较容易令人迷惑的一点。

通道数的改变是因为 RoI Pooling 层上的特殊操作:score map 之所以被称为对位置敏感的,就是因为它对个窗格内的特征进行了分立的特征提取。对应地,在 RoI Pooling 层进行平均池化时,只池化 score map 上符合条件 {①在相同的窗格内 and ②在对应的通道上} 的特征像素。比如,在对右上角(即第 3 个)窗格池化时,池化操作是对 score map 上,对应窗格内,在总共组通道上,第 3 个通道上的特征进行的。

上述 score map 通道到池化输出窗格的映射,的网络结构图中以不同的颜色标示了出来。


目标检测的后续操作

R-FCN 在 RoI Pooling 层之后就不再有可训练参数,所以需要用其他的方式判断 RoI 是否(较好地)覆盖目标、目标的类别以及边框回归参数。

RoI 是否覆盖目标

在一个 RoI 内,对特定的类别,RoI Pooling 的个输出进行一次投票,投票以不加权平均值的形式实现,如果这个投票值超过一定的阈值,则认为该 RoI 内有属于类别的目标。

下图示意 RoI 是否覆盖所导致 RoI Pooling 层的不同输出,可以看到,当 RoI 的左上方窗格“在目标的左上方(的置信度高)”时,score map 上对应的窗格及通道上的特征将被高度激活,上方、右上方、左方、中间、右方、左下方、下方、右下方这些位置也符合此规律。如果一个 RoI 恰好覆盖目标,那么其投票值就会很高。

至于为什么会有这样的特性?可以认为这种特征就是 R-FCN 所构建和训练的网络从训练集中所学习到的。

R-FCN 笔记_第4张图片
对比:RoI 覆盖目标 / RoI 未覆盖目标

目标分类

一个 RoI 将输出通道数为的投票值,对该输出进行 softmax 激活,得到置信度最高的类别,作为目标类别。

边框回归

与上述的  通道的卷积层并行,构造了一个兄弟卷积层,通道数为,用同样的策略将它聚合到一个通道的平均投票值上,这四个值表示,为目标检测领域通用的边框回归参数。


感想

感觉 R-FCN 的思路比较清奇,虽然看懂了它是怎么做的,但并没理解它为什么要这么设计。

你可能感兴趣的:(R-FCN 笔记)