[目标检测]Non-Maximum Suppression

在目标检测中,非最大值抑制(Non-Maximum Suppression, NMS)能够有效去除冗余的候选边界框

实现流程

  1. 输入一组候选边界框以及对应的置信度(通常为分类概率)
  2. 通过置信度进行排序
  3. 保留置信度最高的候选边界框
  4. 计算保留的候选边界框和剩余边界框的IoU
  5. 去除IoU超过阈值的剩余边界框
  6. 对剩余的边界框重复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
iou_scores = util.iou(np.array(nms_rects[len(nms_rects) - 1]), rect_array)
# print(iou_scores)
# 去除重叠率大于等于thresh的边界框
idxs = np.where(iou_scores < thresh)[0]
rect_array = rect_array[idxs]
score_array = score_array[idxs]

return nms_rects, nms_scores

实现结果

参考zjZSTU/R-CNNpy/car_detector.py

实现前:

实现后:

相关阅读