06-NMS非极大值抑制:去重、重叠框筛选原理与优化

📅 2026/8/9 3:00:13
06-NMS非极大值抑制:去重、重叠框筛选原理与优化
NMS非极大值抑制:去重、重叠框筛选原理与优化作者:黒漂技术佬一、为什么需要NMS?假设你在无人售货柜里放了一瓶可乐,YOLO模型扫了一眼,输出结果让你哭笑不得——同一瓶可乐被画了七八个框,每个框都信心十足地写着"可乐 0.95"、“可乐 0.93”、“可乐 0.91”……这不是模型眼花了,恰恰相反,这是模型"太认真"的结果。网格划分时相邻格子都可能对同一目标产生响应,加上锚框的尺寸冗余,最终就会产生大量高度重叠的候选框。这种现象在密集场景(比如货柜里挤满饮料瓶)尤其严重。NMS(Non-Maximum Suppression,非极大值抑制)就是来解决这个"一物多框"问题的。它的核心思路简单到粗暴:在同一目标的一堆候选框里,只留一个最好的,其余全部干掉。二、NMS标准算法流程来看看NMS是怎么干活的:按置信度排序——把所有检测框按Score(置信度分数)从高到低排好队挑大佬——取出当前分数最高的框A,把它请进"最终保留区"算IoU,踢小弟——遍历剩余所有框,计算它们与大佬框A的IoU(交并比),超过阈值的统统视为"同一目标",直接删除循环往复——从剩下的框中再挑分数最高的,重复步骤2-3,直到没有框为止用伪代码表达就是:defnms(boxes,scores,iou_threshold):""" boxes: 候选框列表,每个框为 [x1, y1, x2, y2] scores: 每个框的置信度分数 iou_threshold: IoU阈值,超过即视为重叠 """# 按分数降序排列,拿到索引order=scores.argsort