最近在看Faster RCNN的源码,按照数据的计算过程,绘制了数据的流程图
根据一下内容:
- CSDN讲解文章:睿智的目标检测27——Pytorch搭建Faster R-CNN目标检测平台
- 视频讲解: 手把手带你实战操作,Faster-RCNN(代码解析+理论集合+多年累积的经验)先到先得噢!人工智能/计算机视觉/深度学习/机器学习
- github源码: faster-rcnn-pytorch
下面是根据源码绘制的Faster RCNN的数据流程图
训练过程
- 输入图像img首先被resize为 ( 3 , 600 , 600 ) (3,600,600) (3,600,600)
- ResNet50网络如下图所示,在Faster-RCNN中被分成两块
e
x
t
r
a
c
t
o
r
(
3
,
4
,
5
)
extractor(3,4,5)
extractor(3,4,5)和
c
l
a
s
s
i
f
i
e
r
(
3
)
classifier(3)
classifier(3).
- img经过
e
x
t
r
a
c
t
o
r
extractor
extractor特征提取后,得到基础特征
b
a
s
e
_
f
e
a
t
u
r
e
base\_feature
base_feature,接着进行处理,得到
r
p
n
_
l
o
c
s
rpn\_locs
rpn_locs和
r
p
n
_
s
c
o
r
e
s
rpn\_scores
rpn_scores。
r
p
n
_
l
o
c
s
rpn\_locs
rpn_locs与anchors进行函数名为
l
o
c
2
b
b
o
x
loc2bbox
loc2bbox计算,就可以得到Faster RCNN的ROI区域,即建议框proposal。在这一步可以有两种方法,单独训练这部分,然后在Faster RCNN训练的时候固定这一部分,另一种方法是先单独训练这一部分,然后在Faster RCNN训练的时候同时训练这一部分,Faster RCNN数据流程图中的loss1和loss2就是为了训练这部分的损失函数。
这一步中需要注意, r p n _ l o c s rpn\_locs rpn_locs与anchors进行函数名为 l o c 2 b b o x loc2bbox loc2bbox计算,就可以得到Faster RCNN的ROI区域,那反过来说,anchors和ROI区域进行反向 b b o x 2 l o c bbox2loc bbox2loc计算,就可以得到 r p n _ l o c s rpn\_locs rpn_locs,而我们希望的是ROI区域和真实的预测框相同,所以在计算损失函数时,ROI区域用真实的bbox来代替。 - 得到ROI之后,就是进行一堆计算,包括NMS、剔除掉超过图像大小的预测框等步骤,选出前600或者前300的proposal框(训练时选择前600个,预测时选择前300个),然后按照数据流程图中的顺序,进行一系列的处理,得到了roi_loc。roi_loc和proposal进行
l
o
c
2
b
b
o
x
loc2bbox
loc2bbox计算,就可以得到最终的bbox了。
在这一步中,我们将proposal当做了anchor,而最终的输出roi_loc对anchor进行偏移、放缩等一系列的处理(loc2bbox)处理,就可以得到最终的bbox了。
预测过程
1.首先得到图像的ROI区域,接着对ROI区域进行处理,得到roi_loc。roi_loc和ROI区域进行loc2bbox处理,就得到了bbox。
整个过程中的输出rpn_loc和roi_loc都是输出,但是这些输出是作用在anchor和roi区域框上,才可以得到bbox
需要注意的一点是,训练过程的图像被resize为(600,600),但是预测过程中的图像尺寸是多种多用的。例如输入图像的尺寸为(1024,2048),Faster RCNN的策略是选择短边,将其变为600,然后维持原图的长宽比,将长边也进行变换,在这个例子中,原图的长宽比ratio = 1024/2048=1/2,短边变成600,那么长边就需要变成1200。因此原图被resize为(600,1200)进行处理,得到的bbox是相对于(600,1200)的图像的,因此需要将其按比例变成(1024,2048)下的bbox。