检测与 NMS:阈值是现场活
score 阈值和 NMS IoU 决定 operating point;mAP 积分掩盖产线真正用的那一个 (threshold, IoU) 点。

1. 平均精度零点八五和产线误检可能是两回事
安全场景宁可漏报也不乱报——我会固定工作点报精确率召回率,而不是只贴通用数据集平均精度。平均精度是对精确率召回率曲线积分,掩盖产线真正用的那一组分数与交并比阈值。客户问误检率多少,你答平均精度零点八五,对话已经错位。产线真正关心的是 固定误检预算下的召回,或 固定召回下的误检——这是工作点问题,不是榜单问题。
代价不对称 决定阈值:安防宁可漏报,产线质检宁可漏检也不能误检停线。这不是算法问题,是工作点选择。
2. OpenCV 推理后处理
out = net.forward()
boxes, confidences, classIds = parse_yolo_output(out)
idxs = cv2.dnn.NMSBoxes(
bboxes, confidences,
score_threshold=0.5,
nms_threshold=0.4)分类别非极大值抑制在拥挤同类场景更安全——类无关抑制会把相邻同类实例当一个。软非极大值抑制降重叠框分数而非删除,召回更好,但 OpenCV 内置无软模式,需在训练导出或后处理自实现。
3. 输出解析陷阱
YOLO 导出 ONNX 后 output layout 因工具链而异——后处理必须 match training,否则框坐标系错、非极大值抑制形同虚设。中央处理器 fallback 与设备端结果对照是上线前必做项。
4. 软非极大值抑制与拥挤场景
标准非极大值抑制对重叠遮挡会 误杀 相邻实例。软非极大值抑制降重叠框分数而非删除,召回更好——OpenCV 内置无软模式,自实现或在导出图里带非极大值抑制。预非极大值抑制限制候选数防延迟尖峰;移动端常限制三百个提议。拥挤场景降低非极大值抑制交并比阈值会误杀相邻实例——要在召回与误杀之间用工作点显式权衡,不能靠默认值碰运气。
5. 与跟踪的衔接
检测抖则轨迹碎。字节跟踪等用低分框挽救,但上限仍是检测质量。非极大值抑制和分数阈值是检测侧第一道旋钮——跟踪调参前应先 stabilize 检测工作点。
6. 跨班次阈值漂移
固定误检预算反查工作点,比追榜单平均精度更接近客户问题。产线检测置信度会随曝光、白平衡漂移——同一模型早班和晚班最优分数阈值可能差零点一,应写进部署配置并监测跨班次误检率。
7. 案例:质检误检停线
表面缺陷检测平均精度零点九,产线把分数阈值设零点五以保召回,误检率导致每班停线三次。固定误检预算后反查:分数零点七二、非极大值抑制交并比零点四五时召回仍满足,误检降七成。榜单分数与产线工作点是两个数——汇报时要把工作点 写清楚,别只贴一个平均精度。
8. 验收
- 固定误检预算下的精确率召回率曲线
- 最差误检片段逐帧标注根因
- 延迟百分之九十九分位
- 跨班次阈值漂移监测
- 中央处理器与设备端后处理 golden 对照
非极大值抑制和阈值是 现场旋钮。把分数与非极大值抑制交并比写进部署契约,像参数声明一样可审计。YOLO 不同 export 的 xywh/xyxy 混用是产线 silent failure 高发区——上线 checklist 必须含 layout 验证。
相关
也可以看看
johan's blog