1 前言
后处理方法是很重要的,我在学习训练COCO数据集时深有体会,这里用笔记记录一下后处理的相关知识~
2 南溪使用的的后处理方法
南溪使用后处理操作流程:
阈值过滤(低阈值去框,提速nms)
→
\rightarrow
→
(进行NMS之前目前不进行其它,因为不同框的分数不同,会影响NMS的效果)
按类别NMS(能量场效应)
→
\rightarrow
→
按类别Top-K (提高准确率)(暂停使用,待测试)
→
\rightarrow
→
整体Top-K(暂停使用,待测试)
2.1 阈值过滤——最简单的后处理
设置一定的阈值范围对boxes进行过滤,感觉0.5一般是不错的选择;
2.2 NMS——最常用的后处理方法
参考YOLOV4和TextBox的NMS方法;
2.3.1 NMS算法的思考
对于NMS算法来说,是基于“同类目标框重叠的可能性较小的先验信息的”,具体来说,就是bboxes之间的IoU值;
2.3.2 Simple NMS算法
Nms算法实现,已经torchvision.ops
中进行了实现:
torchvision.ops.nms
2.3.3 Soft-NMS算法
Ref:PaddleDetection在CornerNet-Squeeze模型中使用了Soft-NMS算法;
Soft-NMS原始论文:《Soft-NMS – Improving Object Detection With One Line of Code》
算法分析:
原始论文中的伪代码如下
代码实现:(参考PaddleDetection-post_process-soft_nms)
def soft_nms(dets, sigma, thres):
dets_final = []
while len(dets) > 0:
# 将候选框按照得分高低降序排序
# Tip:np.argmax()会返回数组中最大元素的索引
maxpos = np.argmax(dets[:, 0])
# 将得分最高的候选框放入最终结果dets_final中
dets_final.append(dets[maxpos].copy())
# 获取最佳bbox的各个属性
ts, tx1, ty1, tx2, ty2 = dets[maxpos]
# 获得所有候选框的得分
scores = dets[:, 0]
# force remove bbox at maxpos
# (通过将maxpos的score置为-1),从而将其删除
scores[maxpos] = -1
x1 = dets[:, 1]
y1 = dets[:, 2]
x2 = dets[:, 3]
y2 = dets[:, 4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
xx1 = np.maximum(tx1, x1)
yy1 = np.maximum(ty1, y1)
xx2 = np.minimum(tx2, x2)
yy2 = np.minimum(ty2, y2)
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas + areas[maxpos] - inter)
weight = np.exp(-(ovr * ovr) / sigma)
scores = scores * weight
idx_keep = np.where(scores >= thres)
dets[:, 0] = scores
dets = dets[idx_keep]
dets_final = np.array(dets_final).reshape(-1, 5)
return dets_final
2.3.4 顶会算法学习
Weighted Boxes Fusion方法
原始论文:Weighted boxes fusion: Ensembling boxes from different object detection models
官方实现:ZFTurbo-Weighted-Boxes-Fusion
2.4 Top-K——“也还挺简单的”
2.4.1按类别top-K——“根据统计先验的处理方法”
可以按照类别对boxes进行top-K的筛选;
2.4.2 全局Top-K
(暂时不考虑使用“全局Top-K”,这个方法的物理含义还不是很明显)
3 阈值的超参数搜索
Conf的取值范围:
(
0.25
,
0.95
)
,
s
t
r
i
d
e
=
0.05
(0.25,0.95), stride = 0.05
(0.25,0.95),stride=0.05
搜索次数:
15
×
15
=
225
次
15\times15=225\text{次}
15×15=225次
搜索方法:网格搜索