feat(detect): 训练期的验证也约束预测框互不重叠

ultralytics 没有可用的开关:yolo26 是端到端模型,non_max_suppression 对它早退
(utils/nms.py 里 end2end 分支),只按置信度与 max_det 截断,传入的 iou 和 agnostic
都不参与 IoU 抑制;agnostic_nms 只作用于检测头 top-k(每个 anchor 取一个类别),
压不掉不同 anchor 产生的重叠框。

所以给 DetectionValidator.postprocess 包一层 filter_overlapping_outputs。训练期验证、
早停、best.pt 的选择都随之遵守这条约束,指标与最终推理一致。配置项 train.max_overlap
(默认 0,负数关闭),由 detect.py 摘出后自行实现,不传给 ultralytics。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Shaun Zhou
2026-09-18 11:30:48 +08:00
co-authored by Claude Opus 5
parent eba533a5b2
commit 9439cbb56a
4 changed files with 133 additions and 2 deletions
+7
View File
@@ -48,6 +48,13 @@ train:
hsv_s: 0.3
hsv_v: 0.3
# 真值里一处缺陷只有一个框、零重叠(实测 11211 张图、151 张多框图,重叠为 0),
# 所以验证时也把预测约束成互不重叠:早停与 best.pt 的选择才和最终推理一致。
# 负数=不约束。注意这不是 ultralytics 的参数,由 detect.py 自己实现。
max_overlap: 0.0
# 端到端头的 top-k 每个 anchor 只取一个类别,压掉同一处缺陷被两个类别各框一次
agnostic_nms: true
plots: true # results.png / PR 曲线 / 混淆矩阵 / val_batch 预测图
save_period: -1