1. NMS原理深度解析
非极大值抑制(Non-Maximum Suppression,简称NMS)是计算机视觉目标检测中的核心后处理算法。它的核心任务是解决同一个目标被多个检测框(bounding box)重复检测的问题。想象一下拍照时人脸被多个矩形框同时标出的场景——这正是NMS需要处理的典型情况。
NMS的工作原理基于"优胜劣汰"的自然选择法则。算法首先对所有检测框按置信度(confidence score)排序,将最高分的检测框作为基准,计算其与剩余所有框的交并比(IoU)。当IoU超过预设阈值时,认为这些框检测的是同一目标,保留得分最高的框,抑制其他冗余框。这个过程迭代进行,直到处理完所有检测框。
关键细节:IoU计算的是两个矩形框交集面积与并集面积的比值,公式为:IoU = Area of Overlap / Area of Union。通常阈值设为0.5-0.7之间,这个参数直接影响检测的召回率和准确率。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. NMS算法实现细节
2.1 输入输出规范
标准NMS的输入包含:
- 检测框坐标(通常为[x1,y1,x2,y2]格式)
- 对应置信度分数(confidence scores)
- IoU阈值(通常0.5-0.7)
输出为筛选后的检测框索引列表。值得注意的是,现代实现往往采用NumPy进行向量化计算,相比纯Python循环有百倍以上的性能提升。
2.2 核心计算步骤
- 按置信度降序排序所有检测框
- 选取最高分框加入最终结果集
- 计算该框与剩余所有框的IoU
- 删除IoU超过阈值的框
- 对剩余框重复步骤2-4直到处理完毕
python复制def calculate_iou(box1, box2):
"""计算两个矩形框的交并比"""
# 确定相交区域的坐标
x1 = max(box1[0], box2[0])
y1 = max(box1[1], box2[1])
x2 = min(box1[2], box2[2])
y2 = min(box1[3], box2[3])
# 计算相交区域面积
inter_area = max(0, x2 - x1) * max(0, y2 - y1)
