R-CNN回顾

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

R-CNN存在的问题:

1.每个RoI都需要经过CNN网络进行特征提取,产生了冗余计算。

2.分步训练过于繁琐且带来了很多磁盘读写操作致使模型训练时间过长。

Fast R-CNN的改进

论文作者提出了Fast R-CNN,通过:

1.同一图片的不同proposals共享一次卷积运算来解决上述问题1。

2.使用multi-task objective进行end-to-end的训练来解决上述问题2。

算法前向与反向流程图如下:

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

更快的Faster R-CNN

Fast R-CNN虽然提升了模型的训练速度与测试速度但计算Region Proposal的耗时依旧很大。

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

对此作者考虑到将Region Proposal部分的工作也交给CNN来做,提出了Faster R-CNN,使用RPN(Region Proposal Network)区域建议网络用来提取检测区域。使用RPN既能享受GPU带来的加速效果又能和检测网络共享卷积网络,得益于上述两个特征算法在Region Proposal上的开销大大降低了。

简单的来说Faster R-CNN = Fast R-CNN+Region Proposal Networks,算法流程图如下:
【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

总结三者使用的方法与改进

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

Faster ## R-CNN介绍

Faster R-CNN主要由两个模块构成:

1.RPN模块

2.Fast R-CNN模块

RPN模块负责生成Region来告知Fast R-CNN模块应关注原图片的哪些区域。Fast R-CNN模块使用这些proposed regions来进行目标检测任务。

在之前版本的算法中Region Proposal使用的selective search算法都在CPU上运行无法享受GPU带来的加速效果,并且忽视了Region Proposal的任务与检测网络间存在共享计算的机会。Faster-RCNN提出了Region Proposal Networks(RPNs)来替代selective search算法。

RPN模块与Fast R-CNN模块共享了部分运算大大降低了Region Proposal的开销,其中共享的运算部分如下图:

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

RPN模块

RPN网络结构

为了生成 region proposals,RPN模块在从共享卷积运算输出的conv feature map上滑动一个3✖3的小窗口作为输入。其结构如下图:
【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

每个滑动小窗口都被映射为一个更低维度的feature map输入到box-regression layer (reg) 和 box-classification layer(cls)。

在每个小窗口上都会预测出k个与小窗口同中心的region proposals,作者将这些proposals称为anchors,这些anchors被提前设定了尺寸与长宽比。

作者使用了3种尺寸与3种长宽比,因此此时k=9。

对应每个滑动小窗口,上文中提到的reg layer应有4k个输出用来编码k个anchor的box,cls layer应有2k个输出来预测k个anchor为物体还是背景的概率。

尝试思考下对于尺寸为W × H(typically ∼2,400)的conv feature map,经过RPN模块我们能得到多少个anchors?(W Hk)

RPN模块训练方式

首先我们需要标记每个anchor的类别标签(为物体还是背景),标记方式如下:

1.将与一个ground-truth box拥有最高IOU的anchor/anchors标为正例。

2.将与所有ground-truth box IOU都小于0.3的anchor/anchors标为负例。

3.剩余未被标记的anchor不参与训练。

有了上述的定义,给出损失函数如下:
【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态
【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态
【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

λ为权衡分类与回归损失的权重参数。

由于从一张图片生成的anchor boxes数量过多且大都数为负例,使用全部的anchor进行训练的话会导致模型偏向预测负例,因此作者通过随机采样的方式取256个anchors,并尽量控制正负例比例为1:1。

Fast R-CNN模块

Fast R-CNN模块架构

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

通过RoI pooling layer,将由RPN生成的每个anchor在conv feature map中对应的部分转化为特定尺寸H × W的 spatial extent来匹配之后的FCs。

具体转化的方法为:将anchor在conv feature map上对应的窗口划分为H × W的网格,然后在每个小网格中分别使用max pooling从而得到最终的H × W的 spatial extent。

FCs后分别连接两个输出模块:

1.第一个使用softmax层输出每个RoI的分类概率分布$p = (p_0, . . . , p_K)$,共K+1个分类的概率(+1为背景)。

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态
p为没个RoI输出的分类概率分布,u为每个RoI的ground-truth class。

t^u为bbox回归的的偏移量,v为ground-truth bounding-box(即 regression target)。

[u ≥ 1]表示仅在当前RoI标记为非背景时才计算回归损失。

λ为权衡分类与回归损失的权重参数。
将二者组合为共享feature的统一模型

由于RPN与Fast R-CNN模块各自训练的时候都会修改到用来提取conv feature map的CNN,这与我们最初设想的共享feature相违背。因此得寻找到一种训练方法使二者能够共享特征提取的CNN网络,我们想达到的目标如下图所示:

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

具体训练方法有两种如下:

(i)Alternating training(交替训练)

1.按照上文中介绍的RPN模块训练方式训练得到RPN模块R1。

2.按照上文中介绍的Fast R-CNN模块训练方式使用R1输出的proposals训练得到Fast R-CNN模块F1。(此时R1与F1并不共享卷积层)

3.在F1的结构上初始化RPN模块参数,并对这部分参数进行训练得到组合模型M1。注意该轮过程中共享的卷积层参数保持与F1中一致,即不会被初始化和训练。(此时M1的RPN模块与Fast R-CNN模块共享了卷积层)

4.保持共享卷积层参数不变的情况下,在M1上训练Fast R-CNN模块得到最终的组合模型M2。

(ii)Approximate joint training(近似联合训练)

与方法(i)分阶段训练不同,该方法将二模块做为整体(如下图)同时进行训练。将前传过程中产生的RPN loss与Fast R-CNN loss相加作为最终的损失函数用于反向传播。

方法(ii)实现起来更简单,训练速度快于(i),得到的模型与(i)中训练得到的模型表现差不多。
【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态

【技术博客】目标检测算法Faster R-CNN介绍-Mo 动态