训练过程
1.数据:
(1)image/labels/bboxes(每张图至少有一个检测目标,有几个检测目标对应几个 label 和 bbox )
(2)图像预处理(augment / resize)/归一化
2.网络结构:
(1)网络输出 (要注意的是: locs 对应的四个值是dx/dy/dw/dh)
pred_cls(feat_size,feat_size,num_anchors,num_classes)
pre_locs(feat_size,feat_size,num_anchors,loc_offsets)
(2)先验框 anchor_layers : 每一种 feat_size 上,在每个位置都生成数量为 num_anchors 的先验框,先验框的表示为 (x,y,w,h)
3.groundtruth 与 anchors 之间的 encode
groundtruth 坐标的形式是(y1,x1,y2,x2)和 网络输出(dx,dy,dw,dh)的表示形式不同,
所以要将 groundtruth 和 anchors 结合,来表示anchor_layers 上每个位置的分类 label 和坐标偏移loc(即网络的输出)。
4.计算损失
经过上一步,groundtruth 已经和 pred_locs 的形式相同,可以用 smoth_L1 loss 计算坐标偏移之间的损失。
分类损失分为 pos_cross_entropy 和 neg_cross_entropy ,正负样本数目为 1:3。
预测过程
1.将预处理(resize / 归一化)后的图像输入到网络,得到预测类别 pred_cls 和坐标偏移 pre_locs。
2.得到 anchor_layers 。
3.将网络输出的坐标偏移 pre_locs 和 anchors 进行decode,因为 pre_locs 和 anchors 的表示形式都为(x,y,w,h),所以在 anchors 的基础上直接与网络输出的坐标偏移进行调整,把每个 anchor 都转换成真实值(y1,x1,y2,x2)的形式。
4.选择 pred_cls 大于 threshold 的框作为候选结果,利用非极大值抑制(NMS)得到最终结果。
5.将结果resize到原图,可视化最终结果。