在目标检测中,非最大值抑制(Non-Maximum Suppression, NMS
)能够有效去除冗余的候选边界框
实现流程
- 输入一组候选边界框以及对应的置信度(通常为分类概率)
- 通过置信度进行排序
- 保留置信度最高的候选边界框
- 计算保留的候选边界框和剩余边界框的
IoU
- 去除
IoU
超过阈值的剩余边界框 - 对剩余的边界框重复
2-5
步,直至剩余边界框清空
阈值设置
通常为0.3-0.5
numpy实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| def nms(rect_list, score_list): """ 非最大抑制 :param rect_list: list,大小为[N, 4] :param score_list: list,大小为[N] """ nms_rects = list() nms_scores = list()
rect_array = np.array(rect_list) score_array = np.array(score_list)
idxs = np.argsort(score_array)[::-1] rect_array = rect_array[idxs] score_array = score_array[idxs]
thresh = 0.3 while len(score_array) > 0: nms_rects.append(rect_array[0]) nms_scores.append(score_array[0]) rect_array = rect_array[1:] score_array = score_array[1:]
length = len(score_array) if length <= 0: break
iou_scores = util.iou(np.array(nms_rects[len(nms_rects) - 1]), rect_array) idxs = np.where(iou_scores < thresh)[0] rect_array = rect_array[idxs] score_array = score_array[idxs]
return nms_rects, nms_scores
|
实现结果
参考zjZSTU/R-CNN的py/car_detector.py
实现前:
实现后:
相关阅读