Files
ModelTrainEval/configs/detect/film.yaml
T
Shaun ZhouandClaude Opus 5 9439cbb56a 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>
2026-09-18 11:30:48 +08:00

67 lines
2.6 KiB
YAML

# 在人工修正过的弱监督框上训练 YOLO 检测模型。
#
# 前置步骤:
# uv run python scripts/generate_boxes.py --method shap --out runs/boxes_shap # 生成弱监督框
# uv run python scripts/prepare_label_studio.py --source runs/boxes_shap # 复核材料
# 在 Label Studio 里修正标签,导出 YOLO 格式
# uv run python scripts/build_yolo_dataset.py --export data/film_yolo_shap.zip \
# --images runs/boxes_shap_label_studio/images --out data/film_yolo
#
# 用法:
# uv run python detect.py --config configs/detect/film.yaml
# uv run python detect.py --config configs/detect/film.yaml --eval-only \
# --checkpoint runs/detect/film/weights/best.pt
work_dir: runs/detect/film
seed: 42
device: auto
data:
yaml: data/film_yolo/data.yaml
model:
# CLAUDE.md 的"只用 convolution 模型"只约束聚类与数据集生成阶段,检测这一步不受限,
# 所以用最新的 YOLO26。它是端到端的(NMS-free),推理侧少一道后处理。
# n 是最小的一档:数据只有 1.1 万张且标签是弱监督的,模型大了容易把标注噪声也学进去。
weights: yolo26n.pt
train:
epochs: 500
imgsz: 640
batch: 16
workers: 8
optimizer: auto
patience: 20 # 20 轮没提升就早停
cos_lr: true
fraction: 1.0 # 只取训练集的一部分;冒烟测试时调小,如 0.02
amp: true # 非 CUDA 后端 ultralytics 会自行退回关闭
# 数据增强。翻转按聚类阶段的结论开着(缺陷没有固定朝向);
# 但 mosaic/mixup 关掉——它们会把四张图拼在一起,而我们每张图只有一个弱监督框,
# 拼接后小目标被缩得更小,对 blackdot / whitedot 这类本来就只占千分之几面积的类别是伤害。
fliplr: 0.5
flipud: 0.5
degrees: 0.0
mosaic: 0.0
mixup: 0.0
hsv_h: 0.0 # 单色/近单色的薄膜图,色相扰动没有意义
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
swanlab:
enabled: true
project: film-detect
name: null
mode: local
tags: [detect, yolov8s, gradcam-boxes]