建议先阅读之前的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
算法提取候选框速度太慢的问题。
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
。
流程: 将一副任意大小 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
。
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)
RPN网络分为2条线,上面一条通过softmax
分类anchors
获得foreground
和background
(检测目标是foreground),下面一条用于计算anchors
的bounding box regression
偏移量,以获得精确的proposal
。最后的Proposal层则负责综合foreground anchors
和bounding box regression
偏移量获取proposals
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
。
确定候选区域标签的规则
见RCNN论文详解中的第6部分
anchors
foreground softmax scores
由大到小排序anchors
,提取前pre_nms_topN
个anchors
foreground anchors
为图像边界foreground anchors
NMS
,按照nms
后的foreground softmax scores
由大到小排序foreground anchors
,提取前post_nms_topN
个anchors
整个网络的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
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
的回归
见FAST RCNN论文详解中的第3部分