论文地址
一文读懂Faster RCNN
a-PyTorch-Tutorial-to-Object-Detection
本文主要是 《一文读懂Faster RCNN》 的内容,旨在学习Faster RCNN算法整体思路,加上了一点理解
0. 前言
Faster R-CNN网络结构图。
在文中,白裳认为Faster RCNN其实可以分为4个主要内容:
- Conv Layer,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
- Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
- RoI Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
- Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
在上图中,对于一副任意大小PxQ的图像:
- 首先缩放至固定大小MxN,然后将MxN图像送入网络;
- RPN(红框部分),经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals
- Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
1. Conv Layers
Conv layers包含了conv,pooling,relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例,如图2,Conv layers部分共有13个conv层,13个relu层,4个pooling层。这里有一个非常容易被忽略但是又无比重要的信息,在Conv layers中:
在Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小。
Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。
一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!因为有4个pooling层这样Conv layers生成的feature map中都可以和原图对应起来。
1.1 conv后的Fully Connect层(选看)
其实Conv层运用的思想是迁移学习的思想,所以该部分的网络可以替换为任意一个目标效果比较好的网络,既然如此,难免需要对这些网络结构进行改进。
有的网络倒数几层可能是Fully Connect层,那么,我们怎样将FC层替换成Conv层,还要保证不损失其信息呢?
在传统的分类模型中,不能直接对卷积层直接进行分类操作,都需要将其flatten成1维的结构。
-
方式1:
在下图中,一个3通道的 2 ∗ 2 2*2 2∗2的图片在FC层展开(黄色部分)。由于最后分成两类,所以FC层又被展开成了两个大小相同的Vector(灰色部分),每一个Vector是12dim。
-
方式2:
在下图中,一个3通道的 2 ∗ 2 2*2 2∗2的图片不需要被flatten,卷积层使用了2个有12个元素的滤波器(filters)完成了点积操作(灰色的部分)
实际上,方式1和方式2是完全相等的。一个有
I
I
I个通道,高和宽分别为
H
,
W
H,W
H,W的图片,通过FC层的输出为
N
N
N个类别,实际上等同于有同样卷积核,高和宽分别为
H
,
W
H,W
H,W的N个output通道的操作
2. Region Proposal Networks(RPN)
提出RPN网络的原因
作者想要解决Fast R-CNN在选择proposal 区域时计算不共享的问题。
-
RPN 网络的功能
RPN 网络能够把任何尺寸的图像作为输入,输出一个矩形的提议区域。这一过程使用 fully convolutional network 。 -
怎么样设计RPN网络?
为了产生提议区域, 作者在卷积特征的输出上加了一层“滑动的小型网络???”
we slide a small network over the convolutional feature map output by the last shared convolutional layer
上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线:
- 上面一条通过softmax二分类anchor获得该目标区域是背景还是分类。故而选用0,1分类。
- 下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
- Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。
其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
2.1 多通道图像卷积基础知识介绍
- 单通道图像+单卷积核做卷积
- 多通道图像+多卷积核做卷积
在上图中,输入有3个通道,同时有2个卷积核。
每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。
2个卷积核就输出2个通道,所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!
2.2 锚框
在目前的主流算法中,都用pyramids of images 或者 pyramids of filters 这两种方法,如下图。
锚框由作者以某个像素为中心点,按照宽长比为:
{
1
:
1
,
1
:
2
,
2
:
1
}
\{1:1, 1:2, 2:1\}
{1:1,1:2,2:1}生成的3种大小的矩形框。实际上通过anchors就引入了检测中常用到的多尺度方法。
遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。
- 在上图中,Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
- 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变(如图4和图7中的红框)
- 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates
- 全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释)
另外,作者在论文中提到所提出的模型带有:Translation-Invariant Anchors(平移不变性)这个特性是根据锚框以及根据锚框计算提议区域的函数得来的。如果一张图片中的目标发生了转变,那么提议区和计算提议区的函数也应该发生translation。作者提出的方法保证了这种平移不变性,作为对比,还使用k-means产生了800个没有平移不变性的锚框
为什么说保证了平移不变性锚框是根据目标的中心位置产生的锚框,所以随着目标的改变,锚框也会跟着发生改变。所以作者说保持了平移不变性。
2.3 softmax判定positive与negative
一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如下图:
num_output=18,正好对应:feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和negative,所有这些信息都保存
W
×
H
×
(
9
∗
2
)
W \times H \times (9*2)
W×H×(9∗2)大小的矩阵。
2.4 bounding box regression原理
绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。
那么经过何种变换F才能从图10中的anchor A变为G’呢? 比较简单的思路就是:
输入是N个pairs { ( P i , G i ) } i = 1 , . . , N \{(P^i, G^i)\}_{i=1,..,N} {(Pi,Gi)}i=1,..,N。其中, P i = ( P x i , P y i , P w i , P h i , ) P^i=(P^i_x,P^i_y,P^i_w,P^i_h,) Pi=(Pxi,Pyi,Pwi,Phi,)。
其中 P x i , P y i P^i_x,P^i_y Pxi,Pyi代表锚框中心点的坐标, P w i , P h i P^i_w,P^i_h Pwi,Phi代表锚框的宽和高。 G = ( G x , G y , G w , G h ) G=(G_x,G_y,G_w,G_h) G=(Gx,Gy,Gw,Gh)。我们的目标是尽可能的让P去贴近G。
首先,使用4个函数去描述 P P P: d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P), d_y(P), d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P)使用的公式为:
- 公式(1)与公式(2)的作用为:平移;
- 公式(3)与公式(4)的作用为:缩放
然后 d ∗ ( P ) d_{*}(P) d∗(P)这里的 ∗ * ∗指代 ( x , y , h , w ) (x,y,h,w) (x,y,h,w)。计算公式为:
而上式中, ϕ 5 ( P ) \phi_5(P) ϕ5(P)代表cnn feature map的值, W ∗ W_* W∗又是一个可以学习的参数,它损失函数为:
L o s s = ∑ i N ∣ t ∗ i − W ∗ T ϕ ˙ ( P ) ∣ Loss=\sum_{i}^{N}|t_*^i-W_{*}^{T} \dot \phi(P)| Loss=i∑N∣t∗i−W∗Tϕ˙(P)∣
优化目标为:
其中
t
∗
t_*
t∗被定义为:
2.5 对proposals进行bounding box regression
num_output=36,即经过该卷积输出图像为WxHx36,一个点是4个坐标,相当于有9个锚框
VGG输出
50
∗
38
∗
512
50*38*512
50∗38∗512 的特征,对应设置
50
∗
38
∗
k
50*38*k
50∗38∗k个anchors,而RPN输出:
大小为
50
∗
38
∗
2
k
50*38*2k
50∗38∗2k 的positive/negative softmax分类特征矩阵
大小为
50
∗
38
∗
4
k
50*38*4k
50∗38∗4k 的regression坐标回归特征矩阵
2.6 Proposal Layer
Proposal Layer负责综合所有 d x ( P ) , d y ( P ) , d w ( P ) , d H ( P ) d_x(P), d_y(P), d_w(P), d_H(P) dx(P),dy(P),dw(P),dH(P) 变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
3 RoI pooling(注意力机制)
而RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到Rol pooling层有2个输入:
- 原始的feature maps
- RPN输出的proposal boxes(大小各不相同)
3.1 为何需要RoI Pooling
对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。一般这种情况由两个解决方法,但都会破坏图像信息:
- 从图像中crop一部分传入网络
- 将图像warp成需要的大小后传入网络
RoI Pooling layer forward过程:
- 由于proposal是对应MXN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)X(N/16)大小的feature map尺度;
- 再将每个proposal对应的feature map区域水平分为 p o o l e d w × p o o l e d h pooled_w \times pooled_h pooledw×pooledh 的网格;
- 对网格的每一份都进行max pooling处理。
4 Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:
- 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
- 再次对proposals进行bounding box regression,获取更高精度的rect box
5 Faster R-CNN训练
Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为2个大阶段和6个步骤:
第一阶段:预训练阶段
- 在已经训练好的model上,训练RPN网络
- 利用步骤1中训练好的RPN网络,收集proposals
- 第一次训练Fast RCNN网络
第二阶段:全局调整
- 第二次训练RPN网络
- 再次利用步骤4中训练好的RPN网络,收集proposals
- 第二次训练Fast RCNN网络
5.1 训练RPN网络
在该步骤中,首先读取RBG提供的预训练好的model(本文使用VGG),开始迭代训练。整个网络使用的Loss如下:
上述公式中:
- i i i 表示anchors index
- p i p_i pi表示positive softmax probability
- p i ∗ p^*_i pi∗代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive, p i ∗ = 1 p^*_i=1 pi∗=1;
- 反之IoU<0.3时,认为是该anchor是negative, p = ∗ 0 p^*_=0 p=∗0;至于那些0.3<IoU<0.7的anchor则不参与训练);
- t t t 代表predict bounding box, t ∗ t^* t∗代表对应positive anchor对应的GT box。可以看到,整个Loss分为2部分:
- cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
- reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了 p i ∗ p^*_i pi∗,相当于只关心positive anchors的回归(其实在回归中也完全没必要去关心negative)。
由于在实际过程中,
N
c
l
s
N_{cls}
Ncls 和
N
r
e
g
N_{reg}
Nreg]差距过大,用参数λ平衡二者(如
N
c
l
s
=
256
N_{cls}=256
Ncls=256,
N
r
e
g
=
2400
N_{reg}=2400
Nreg=2400时设置
λ
=
N
r
e
g
N
c
l
s
=
10
\lambda = \frac{N_{reg}}{N_{cls}}=10
λ=NclsNreg=10),使总的网络Loss计算过程中能够均匀考虑2种Loss。这里比较重要是
L
r
e
g
L_{reg}
Lreg 使用的soomth L1 loss,计算公式如下:
Abstract
we introduce a Region Proposal Network (RPN) that shares full-image convolutional features with the detection network, thus enabling nearly cost-free region proposals.
作者提出了一种RPN算法,能够在detection网络中共享卷积特征,RPN model是一个全卷积模型,能够同时预测bounds和类别的分数。充分的利用了attention机制,每张图片只有300个提议区域。
1 Introduction
目前已有的R-CNN方法,在计算方面花费的时间都很久,优化的方法基本上都是通过 sharing convolutions across proposals完成的。现在,提议区的计算已经是测试时间的瓶颈了。
fast region-based CNNs对于proposal的选择是在CPU上进行的,如果在GPU上实现其接口,则 ignores the down-stream detection network and therefore misses important opportunities for sharing computation.
在本文中,作者做了算法上的调整,使用深度卷积神经网络计算提议区。在卷积网络的顶部,我们增加了可以同时拟合bounds和分类的卷积层——RPN。
Our scheme can be thought of as a pyramid of regression references (Figure 1, c), which avoids enumerating images or filters of multiple scales or aspect ratios.
因此,我们引入了一种叫做“锚框”的东西,该方法可以理解成 pyramid of regression 的引申,避免了不同比例和多尺度样本或通道的穷举。提出的方法主要是替代了proposal区域的选择。
3 FASTER R-CNN
faster R-CNN包括两部分:
- a deep fully convolutional network:产生提议区域
- Fast R-CNN detector :使用提议区
3.1 Region Proposal Network(RPN)
这个小网络接受一个 n × n n\times n n×n的windows,每一个sliding window 都被映射到了维度更低的特征上了。它所产生的特征输入到了两个全连接网路中——a box-regression layer (reg) and a box-classification layer (cls). 在这篇文章中作者取的值是3,而在实际的输入图片中,感知野非常大。在VGG中是228像素的。
- 为什么采取fully-connected layers ?
这样的话这个滑动窗口能够使得fully-connected layers 共享所有空间的位置。
Multi-Scale Anchors as Regression References
在多尺度方面,目前有两个主流的方法:
-
image/ feature pryramids:一张图片被resize成多个尺度和特征maps,这个方法虽然有效但是耗费时间。
-
第二种方法则是在 feature map 上使用多尺度的滑动窗口, 在一个模型中,不同的纵横比由不同的filter size训练。