二阶段检测网络
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个数)
之后会有一个采样并计算学习目标的过程:
- 采样。为了平衡正负样本的比例
- 根据
anchor
和gt_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) $$
损失的计算:
- 预测值与 target 的 smooth l1 损失
- target 生成 box 以后计算GIoU损失
TODO: 详细的 GIoU 计算
生成Proposal的过程
RPN 在学习自己网络权重的同时另一个作用是生成Region Proposal, 用于后续 RoI head 的学习,比如 mask、keypoint、3d attribute。
- 根据anchor和delta生成输入图像尺度的2D框
- 然后对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处理,在导出的时候能将其转化成基本的数据结构。