二阶段检测网络

Detection pipeline

RPN 部分

Summary: RPN部分输入feature的由来,如何根据feature与GT生成学习目标

输入图像经过主干网络backbone提取得到高层语义特征,CNN形式的主干网络一般包含卷积、 非线性激活函数、BN层、下采样等得到,高层特征图中每个坐标的特征一般具有较大的感受野, 可以作为目标检测的种子点;特征图增加一个head用于输出每个种子点的前置信度和2D框回归量。

Anchor-based 的方法:在种子点的基础上,设置n个锚点(anchor),对检测目标按大小、 比例进一步拆分,让网络分支只学习更具体、小范围的目标,从而降低学习难度。

Anchor-free的方法:所有的种子点预测检测属性,包括前背景的 置信度、2D框的偏移量,甚至3D属性等。

感受野:直观解释是特征受哪些输入影响,数据解释是梯度反向传导时影响的范围, 其大小的计算方式可以解析估计,也可通过梯度可视化呈现。

RPN训练计算逻辑

FasterRCNN

对于每个种子点所有anchor与GT计算IoU(Inner on Union),大于 一定阈值都可以作为正样本,在预测前背景分类的同时回归2D框, 小于一定阈值作为负样本,只预测分类; 所以这里计算IoU的计算量大约是WxHxAxG(W,H是feature map的长宽, A是anchor个数,G是GT个数) 之后会有一个采样并计算学习目标的过程:

  1. 采样。为了平衡正负样本的比例
  2. 根据anchorgt_box生成2D delta,然后计算gt_mask对应的2D框损失。

YoLo系列

Yolov3中 gt 只与中心点所在的种子点对应的 anchor 计算2D偏移量, 所以学习的 target 计算方式不同;通过GT 2D box下采样得到对应的 种子点坐标,gt box 的位置归一化到原点与anchor 进行IoU计算得到 anchor 的 index,从而可以生成 gt_mask.

RPN 的loss 计算

2D框位置损失,首先确定 target 的计算过程,包括位置和大小的计算过程。

$$ t_x = (x - x_a)/w_a $$

$$ t_w = log(w/w_a) $$

损失的计算:

  1. 预测值与 target 的 smooth l1 损失
  2. target 生成 box 以后计算GIoU损失

TODO: 详细的 GIoU 计算

生成Proposal的过程

RPN 在学习自己网络权重的同时另一个作用是生成Region Proposal, 用于后续 RoI head 的学习,比如 mask、keypoint、3d attribute。

  1. 根据anchor和delta生成输入图像尺度的2D框
  2. 然后对proposal进行 NMS 运算得到一定数量的 proposal

RoI Head

从RPN得到候选区域后,在学习RoI head时,对proposal再次进行了 采样和打标签,标签包括类别、box 偏移量、mask、3D属性等。 采样是按正负样本的比例进行;之后对采样的proposal进行 roialign pooling 得到 对应的 feature 再传入各个head进行推理、训练。

3D roi head 举例

3D属性的推理只会在正样本上进行,所以需要从proposal中筛选出正 样本,然后再筛选出有3D标签的 proposal 进行训练。

Label 的处理时机

在Detectron2中RPN和Head的训练中,label 的生成都是在 Forward 过程中 根据 train or test mode 实时生成的; Caffe2 中RPN部分因为不依赖中间推理结果,在数据加载部分就生成好了, 但是Head部分训练依赖RPN输出的内容,所以有一部分实在推理的时候生成。 Caffe2能节省一部分推理效果;Detectron2 的代码逻辑统一,label与推理 部分模块化比较友好。

Onnx模型导出

在构建网络的时候,模型的输入包含GT instance,不是传统的Tensor, Detectron2 做了JIT处理,在导出的时候能将其转化成基本的数据结构。

pytorch参考链接