1 过程
之前看过该篇论文但是理解不太深刻,如今结合代码看理解的更深一层。急忙做下记录以备日后复习。
分为六个部分:Backbone、RPNHead、RPNOutput、RPNTopProposals、RoiHead、PostProcess_Detection(test)。
-
Backbone
用于抽取图像特征,如Resnet50-FPN。 -
PRNHead
将抽取的特征图分别经过两个卷积用于二分类和回归,形状分别为: ( N , 1 ∗ n u m _ a n c h o r s , H , W ) (N, 1*num\_anchors, H, W ) (N,1∗num_anchors,H,W)和 ( N , 4 ∗ n u m _ a n c h o r s , H , W ) (N, 4*num\_anchors, H, W) (N,4∗num_anchors,H,W)。 -
RPNOutput
为特征图每个位置标上anchor和target并计算二分类和回归的损失值。anchors的gt_label取值为{-1, 0, 1},-1表示未用于训练。有两种情况设置gt_label=1:- anchor与gt_box的IOU>0.5
- gt_box与所有anchor取得IOU最大值的anchor
-
RPNTopProposals
该部分不需要更新梯度,所以在with torch.no_grad()
下进行,用于选取Top个Proposals并且去掉小的proposals,用于接下来的多分类和回归。因为生成的proposals多达20万左右,在nms前,先去除一部分proposals,训练或测试时只保留前 2000 ∗ k 2000*k 2000∗k个,(k表示level个数)设置 r p n . n m s . t h r e s h = 0.7 rpn.nms.thresh=0.7 rpn.nms.thresh=0.7。 -
RoiHead
上一层的proposals经过RoiAlign+classification+regression。 -
PostProcess_Detection(test)
此阶段只在测试阶段才执行。
此时每一类的proposals仍有多个,首先去除较低分数(小于0.05)的边框,然后在每类上再次经过NMS,设置 b o x _ n m s _ t h r e s h = 0.5 box\_nms\_thresh=0.5 box_nms_thresh=0.5,取top(100)作为最终的结果。