让 AI 走一遍 NMS:中间框被压掉以后,为何不能继续淘汰第三个框

前天 3阅读

目标检测给出多个重叠框以后,非极大值抑制NMS会保留哪些?若AI把所有“重叠超过阈值”的框连成一组,再整组只留最高分,算出的结果可能与贪心NMS不同。三个框就能把差别走出来。

让 AI 走一遍 NMS:中间框被压掉以后,为何不能继续淘汰第三个框

AI模型生成的概念插图:重叠候选框经过保留与淡化处理;矩形比例不编码正文坐标,不是检测模型的输出截图。

面积按连续坐标算,不额外加一个像素

设同一类别的三个框使用(x₁,y₁,x₂,y₂):A=(0,0,4,2),B=(1,0,5,2),C=(2,0,6,2)。每个面积都是4×2=8。本例采用连续坐标面积,不使用整数像素端点包含式的加一约定。

A与B交集为3×2=6,并集为8+8-6=10,IoU=3/5=0.6;B与C同样为0.6。A与C交集为2×2=4,并集12,IoU=1/3,约0.333333。不要把交集面积直接除以某一个框面积,那算的是另一种比例。

被移除的候选不再成为下一轮抑制者

分数设为A=0.9、B=0.8、C=0.7,阈值0.5。先选最高分A并保留。B与A的IoU为0.6,大于阈值,移除B;C与A的IoU为1/3,继续留在候选队列。

下一轮只剩C,它被选中并保留。最终是[A,C]。尽管B与C的IoU也超过阈值,B已经离开队列,不会再获得一轮抑制C的机会。若先把A-B-C连成重叠链再只留下A,就把算法改成了另一种处理规则。

只把B的分数提高到0.95,框坐标全部不动。此时先保留B,A和C都与B重叠0.6,都会被移除,最后只剩B。结果变化来自贪心选择顺序,不是三组IoU变了。分数相同时还应写清并列规则;Torchvision提醒相同分数的选择在CPU与GPU上未必一致。

恰好等于阈值,应按接口定义判定

回到原分数,将阈值设成精确的3/5。Torchvision文档用的是IoU大于阈值才移除,因此在本例的精确数学计算中,A-B和B-C的0.6都不触发抑制,三个框全部保留。把大于写成大于等于,会在边界产生不同结果。

实际浮点计算不能只看页面上四舍五入后的0.6来断定相等。调试时保留完整坐标、数据类型和阈值,先用远离边界的样本核验主流程,再单独检查临界情况。这里的精确分数不冒充某台设备的内核实测。

让AI交一份逐轮记录:当前最高分、保留框、与它比较的IoU、被移除编号、剩余队列。独立核对最终保留集合时,不要只对框数量,因为[A,C]和[A,B]虽然都是两个,含义不同。

本例先固定同一类别。普通nms接口没有类别参数,直接混入不同类别会按重叠与分数一起处理;是否按类别分别抑制需要调用方另行决定。NMS也不判断框是否真正包住目标,高分框可能定位较差;算法输出只是既定候选与规则的结果。

资料核对日期:2026年10月2日。算例为原创教学设定,已用独立Python计算复核,不代表真实模型训练或性能测试。

参考资料

Torchvision:nms

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。