Faster RCNN
建议先阅读之前的RCNN和Fast RCNN后再来阅读此文
Faster RCNN PyTorch
实现:https://github.com/codecat0/CV/tree/main/Object_Detection/Faster_RCNN
Faster RCNN提出了Region Proposal Network
解决了Fast RCNN中selective search
算法提取候选框速度太慢的问题。
1. Faster RCNN初识
conv layers
:通过 C N N CNN CNN提取image的feature maps
。此feature maps
被共享用于后续的层Region Proposal Networl
:用于生成region proposals
。该层通过softmax
判断anchors
属于foreground
还是background
,再利用bounding box regression
修正anchors
以获得精确的proposals
RoI pooling
:该层收集输入的feature maps
和proposals
,综合这些信息后提取proposal feature maps
,送入后续层进行检测classifier
:利用proposal feature maps
计算proposal
的类别,同时再次通过bounding box regression
获取检测框最终的精确位置
通过上述Faster RCNN的流程介绍,我们可以知道Faster RCNN与Fast RCNN之间的区别在于提取候选区域的不同,一个是通过训练一个Region Proposal Network
来生成,而另一个则是通过Selective Search
算法来生成。
接下来,我会重点介绍Region Proposal Network
以及其anchor
。
2. Faster RCNN详细网络结构
流程: 将一副任意大小
P
×
Q
P \times Q
P×Q的图像缩放至固定大小
M
×
N
M \times N
M×N,然后将
M
×
N
M \times N
M×N大小的图像输入网络;其中conv layers
包含了13个conv层+13个relu层+4个pooling层;RPN网络首先经过3x3卷积,再分别生成foreground anchors
与bounding box regression
偏移量,然后计算出proposals
;而Roi Pooling层则利用proposals以及feature maps,提取proposal feature送入后续全连接和softmax
网络作classification
。
2.1 conv layers
conv layers
部分共有13个conv
层,13个relu
层,4个pooling
层(VGG网络中最后一个max pooling前的层)
- 所有的
conv
层都是:kernel_size=3 , padding=1 ,stride=1
,因此conv
层不改变原图大小 - 所有的
pooling
层都是:kernel_size=2 ,padding=0 , stride=2
,pooling
层将原图缩小为原来的一半 - 经过
conv layer
后,一个MxN
大小的矩阵将变为(M/16)x(N/16)
2.2 Region Proposal Network
RPN网络分为2条线,上面一条通过softmax
分类anchors
获得foreground
和background
(检测目标是foreground),下面一条用于计算anchors
的bounding box regression
偏移量,以获得精确的proposal
。最后的Proposal层则负责综合foreground anchors
和bounding box regression
偏移量获取proposals
2.2.1 anchors
anchor为由一个中心点,周围生成了9个矩形,其矩形的有3种不同的尺寸,每个尺寸有3种不同的比例,分别为1:1, 1:2, 2:1
,这样共9个不同的矩形,如下图左上角所示。
RPN
遍历conv layers
生成的feature maps
,为feature map
上的每一个点都配备这9种anchor
作为初始的检测框,效果如下图右所示。这样做获得检测框很不准确,之后将会在RPN
层,以及最后进行2次的bounding box regression
修正检测框位置
如下图,对于每一个点的
k
k
k个anchor
来说,从feature maps
提取出得特征具有256维,对于每一个anchor
,需要分foreground
与background
,因此共有
2
k
2k
2k个score
,对于每一个anchor共有
(
x
1
,
y
1
,
x
2
,
y
2
)
(x_1,y_1,x_2,y_2)
(x1,y1,x2,y2)四个坐标值。因此共有
4
k
4k
4k个coordinates
。
2.2.2 softmax判定foreground与background
确定候选区域标签的规则
- 与某个ground truth(GT)的IoU最大的区域的分配正标签
- 与任意GT的IoU大于0.7的区域分配正标签
- 与所有GT的IoU都小于0.3的区域分配负标签
2.2.3 bounding box regression原理
见RCNN论文详解中的第6部分
2.2.4 RPN流程
- 生成
anchors
- 按照输入的
foreground softmax scores
由大到小排序anchors
,提取前pre_nms_topN
个anchors
- 限定超出图像边界的
foreground anchors
为图像边界 - 剔除非常小(面积和scores)的
foreground anchors
- 进行
NMS
,按照nms
后的foreground softmax scores
由大到小排序foreground anchors
,提取前post_nms_topN
个anchors
2.2.5 RPN 训练
整个网络的Loss
如下:
L
(
p
i
,
t
i
)
=
1
N
c
l
s
∑
i
L
c
l
s
(
p
i
,
p
i
∗
)
+
λ
1
N
r
e
g
∑
i
p
i
∗
L
r
e
g
(
t
i
,
t
i
∗
)
L(p_i,t_i)=\frac {1} {N_{cls}}\sum_{i}L_{cls}(p_i,p_i^*)+\lambda \frac {1}{N_{reg}}\sum_{i}p_i^*L_{reg}(t_i,t_i^*)
L(pi,ti)=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
其中:
-
i i i表示
anchors index
-
p i p_i pi表示
foreground softmax probability
-
p i ∗ p_i^* pi∗代表对应的
GT predict
概率(如果anchor
与GT
间IOU>0.7,为1;反之IOU<0.3,为0;至于0.3<IOU<0.7不参与训练) -
t t t代表
predict bounding box
-
t ∗ t^* t∗代表对应
foreground anchor
对应的GT box
-
cls loss
,即softmax loss
-
reg loss
,即soomth L1 loss
。注意在该loss
中乘了 p i ∗ p_i^* pi∗相当于只关心foreground anchors
的回归
3. RoI Pooling layer
见FAST RCNN论文详解中的第3部分