目标检测中的非极大值抑制(NMS):步骤与Python实现
目标检测中的非极大值抑制(NMS):步骤与Python实现
非极大值抑制(Non-Maximum Suppression, NMS)是目标检测中用于去除多余边界框的关键步骤。在目标检测任务中,模型通常会为每个目标预测多个边界框,这些边界框可能会有重叠。NMS通过保留最佳的边界框并移除其他重叠的边界框来减少冗余。
NMS的步骤
- 置信度排序:按照每个边界框的置信度(通常是物体存在的得分)进行降序排序。
- 选择最高得分的边界框:从排序后的列表中选择置信度最高的边界框,将其添加到最终的检测结果中。
- 计算交并比(IoU):对于剩余的每个边界框,计算它与已选择边界框的IoU。
- 移除重叠边界框:如果某个边界框与已选择的边界框的IoU超过了预设的阈值(如0.5),则认为这两个框表示的是同一个目标,移除置信度较低的边界框。
- 重复:继续选择剩余边界框中置信度最高的,重复计算IoU和移除过程,直到所有边界框都被检查过。
NMS的Python实现
以下是使用Python和NumPy库实现NMS的示例代码:
import numpy as np
def iou(boxA, boxB):
# 计算两个边界框的交集
xA = max(boxA[0], boxB[0])
yA = max(boxA[1], boxB[1])
xB = min(boxA[2], boxB[2])
yB = min(boxA[3], boxB[3])
interArea = max(0, xB - xA) * max(0, yB - yA)
boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])
boxBArea = (boxB[2] - boxB[0]) * (boxB[3] - boxB[1])
iou = interArea / float(boxAArea + boxBArea - interArea)
return iou
def non_max_suppression(boxes, scores, iou_threshold=0.5):
"""
非极大值抑制
boxes: 边界框列表,每个框是一个[x1, y1, x2, y2]的数组
scores: 每个边界框对应的得分列表
iou_threshold: IoU阈值
"""
# 按得分排序
idxs = np.argsort(scores)[::-1]
selected = []
while len(idxs) > 0:
# 选取得分最高的边界框
current = idxs[0]
selected.append(current)
# 计算与其他边界框的IoU
for i in range(1, len(idxs)):
if iou(boxes[current], boxes[idxs[i]]) > iou_threshold:
break
else: # 如果没有超过阈值的框,继续
idxs = idxs[1:]
return selected
# 示例数据
boxes = np.array([[100, 100, 210, 210], [120, 120, 220, 220], [150, 150, 250, 250]])
scores = np.array([0.9, 0.8, 0.7])
selected_boxes = non_max_suppression(boxes, scores, iou_threshold=0.5)
print("Selected boxes:", selected_boxes)
在这段代码中,我们首先定义了一个函数iou
来计算两个边界框的交并比。然后,我们实现了non_max_suppression
函数,它接受边界框列表、得分列表和一个IoU阈值,返回经过NMS处理后的边界框索引列表。
结论
NMS是目标检测中不可或缺的一步,它通过移除多余的边界框来提高检测的准确性。通过上述代码示例,我们可以在Python中轻松实现NMS算法,以优化目标检测模型的性能。
✅作者简介:热爱科研的人工智能开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多人工智能资料可点击链接进群领取,谢谢支持!👇
点击领取更多详细资料