WBF:检测任务NMS后虑框新方式?
论文:Weighted boxes fusion: Ensembling boxes from different object detection models
代码:https://link.zhihu.com/?target=https%3A//github.com/ZFTurbo/Weighted-Boxes-Fusion
前言
最近在实际任务中,同个目标被多个同类框重复框选,这个毕竟不同框比例差距大,NMS无法覆盖这样的场景,可以看看下图
NMS和soft-NMS的方法都是排除框,不会改变框的值和新生成框,而WBF(Weighted Boxes Fusion)加权框融合,就是把框都加权融合成一个新的框,如下图所示,非常直观:
另外这个方案,可以直接
pip instal ensemble-boxes
这个包里包括了nms, soft_nms, non_maximun_weighted, weighted_boxed_fusion多个功能,非常好用。实测速度上,nms是远快于soft-nms。而这个ensemble-boxes存在两个问题:
1、boxes里的x1,y1,x2,y2需要归一化到[0:1]。
执行归一化的操作是需要计算时间的,不高效,如果想不执行归一化的话,需要修改ensemble-boxes里的源码,对于nms和soft-nms方法,只需要注释掉ensemble_boxes_nms.py中的192行:
# Fix coordinates and removed zero area boxes
boxes, scores, labels = prepare_boxes(boxes, scores, labels)
2、ensemble-boxes的方法不会放回过滤后的indexs,而有的场景又需要怎么办??
对于nms和soft-nms方法,修改ensemble_boxes_nms.py中205行开始,原始是:
if method != 3:
keep = cpu_soft_nms_float(boxes_by_label.copy(), scores_by_label.copy(), Nt=iou_thr, sigma=sigma, thresh=thresh, method=method)
else:
# Use faster function
keep = nms_float_fast(boxes_by_label, scores_by_label, thresh=iou_thr)
final_boxes.append(boxes_by_label[keep])
final_scores.append(scores_by_label[keep])
final_labels.append(labels_by_label[keep])
final_boxes = np.concatenate(final_boxes)
final_scores = np.concatenate(final_scores)
final_labels = np.concatenate(final_labels)
修改为, 即可:
final_keep = []
if method != 3:
keep = cpu_soft_nms_float(boxes_by_label.copy(), scores_by_label.copy(), Nt=iou_thr, sigma=sigma, thresh=thresh, method=method)
else:
# Use faster function
keep = nms_float_fast(boxes_by_label, scores_by_label, thresh=iou_thr)
final_keep.append(keep)
final_boxes.append(boxes_by_label[keep])
final_scores.append(scores_by_label[keep])
final_labels.append(labels_by_label[keep])
final_boxes = np.concatenate(final_boxes)
final_scores = np.concatenate(final_scores)
final_labels = np.concatenate(final_labels)
return final_boxes, final_scores, final_labels, final_keep
3、在使用weight boxes fusion这个函数的时候一样会检测boxes里的x1,y1,x2,y2是否归一化到[0:1],可以注释掉ensemble_boxes_wbf.py文件里35~64行即可使用。
4、实测效果。下面给出在多个公开数据集下,各种滤框方案和不同参数对ap的影响
coco测试集 |
P |
R |
mAP@0.5 |
mAP@0.5:0.95 |
nms use time |
Soft-type |
Fusion_type |
skip_box_thr |
NMS |
0.7068 |
0.5759 |
0.6154 |
0.4228 |
47.11s |
|
|
0.001 |
|
0.7068 |
0.5758 |
0.6138 |
0.421 |
93.01ms |
|
|
0.0001 |
Soft-NMS |
0.7204 |
0.5606 |
0.5968 |
0.4202 |
211.09 |
Gauss-0.01 |
|
0.0001 |
|
0.7218 |
0.5597 |
0.6012 |
0.4264 |
206.27 |
Gauss-0.01 |
|
0.001 |
|
0.7183 |
0.5714 |
0.6133 |
0.4265 |
218.7s |
Gauss-0.05 |
|
0.0001 |
|
0.7219 |
0.5705 |
0.6163 |
0.4324 |
212.0s |
Gauss-0.05 |
|
0.001 |
|
0.7035 |
0.5529 |
0.5995 |
0.4159 |
222.92s |
Gauss-0.1 |
|
0.0001 |
|
0.7066 |
0.5728 |
0.6212 |
0.4304 |
293.8 |
Gauss-0.1 |
|
0.001 |
|
0.450 |
0.4655 |
0.4025 |
0.2906 |
241.71 |
linear |
|
0.0001 |
|
0.4936 |
0.4656 |
0.4287 |
0.3082 |
242.23 |
linear |
|
0.001 |
Weight Boxes Fusion |
0.6847 |
0.5639 |
0.5801 |
0.3794 |
405.68s |
|
avg |
0.0001 |
|
0.6803 |
0.5672 |
0.5821 |
0.3795 |
440.64s |
|
avg |
0.001 |
|
0.7093 |
0.5762 |
0.6161 |
0.4240 |
426.4s |
|
max |
0.0001 |
|
0.7093 |
0.5762 |
0.6171 |
0.4256 |
380.84s |
|
max |
0.001 |
|
0.6847 |
0.5639 |
0.5801 |
0.3794 |
418.29 |
|
box_and_model_avg |
0.0001 |
|
0.6802 |
0.5672 |
0.5821 |
0.3794 |
466.73 |
|
box_and_model_avg |
0.001 |
|
0.6847 |
0.5639 |
0.5801 |
0.3794 |
419.35 |
|
absent_model_aware_avg |
0.0001 |
|
0.6802 |
0.5672 |
0.5821 |
0.3794 |
449.18 |
|
absent_model_aware_avg |
0.001 |
- 点赞
- 收藏
- 关注作者
评论(0)