091、YOLO 检测结果后处理:NMS/Soft-NMS/DIoU-NMS 的适用场景与效果对比
091、YOLO 检测结果后处理:NMS/Soft-NMS/DIoU-NMS 的适用场景与效果对比
从一次线上事故说起
去年做智慧交通项目,摄像头架在十字路口,YOLOv8检测车辆和行人。白天跑得挺好,一到傍晚,车流密集时,检测框开始“打架”——同一辆车被框了三四次,NMS阈值调到0.45还是压不住。更离谱的是,行人被车框直接吞掉,漏检率飙升。当时我盯着终端输出的框坐标,脑子里只有一个念头:NMS这玩意儿,真不是调个阈值就能解决的。
后来排查发现,问题出在密集场景下,常规NMS对重叠框的“一刀切”太粗暴。于是我把NMS换成了DIoU-NMS,漏检率从12%降到3%,推理速度几乎没变。今天这篇笔记,就聊聊这三种后处理方法的真实差异——不是教科书上的公式对比,而是你调试时真正会踩的坑。
NMS:最原始,但别迷信它
NMS的逻辑简单到让人放松警惕:选置信度最高的框,干掉所有IoU大于阈值的框,重复直到没框可删。代码写起来三五行,但实际跑起来,你会遇到两个经典问题。
第一个问题:密集目标被误杀。比如一群人站在一起,每个人的框IoU可能超过0.7,NMS会直接保留置信度最高的那个,把其他人全删了。你调低阈值到0.3?那更惨,连稍微靠近的框都被干掉。调高到0.7?重叠框全留着,检测结果像贴了狗皮膏药。我见过有人把阈值设成0.9,结果一张图输出200个框,后处理比推理还慢。
第二个问题:遮挡目标被漏检。车流中,一辆车被另一辆车挡住一半,置信度只有0.4,但它的框
