Files
ModelTrainEval/configs/detect/film.yaml
T
Shaun ZhouandClaude Opus 5 2a92275317 feat(detect): 固定 160x160 输入,只用裁剪与镜像填充,禁止缩放
产线要求送进模型的图固定为 N×N 且不许 resize——缺陷的绝对尺度是判别依据,
拉伸会把"5 像素的黑点"变成别的东西。

- engine/tiling.py:切片几何。边长 < N 镜像填充(reflect,真镜像,原图居中);
  边长 >= N 按步长裁剪、末片贴边保证全覆盖。框跟着平移裁剪,露出面积低于
  min_visibility 的丢弃;to_source 反向映射供推理时拼回原图。
- scripts/tile_dataset.py:整套数据集转换。有框图切出的空片会爆量
  (524x959 能切 24 片),用 --max-empty-ratio 限量;原本无框的真负样本不受限。
- 训练配置 imgsz 改 160,并显式关掉 scale 与 translate——ultralytics 的默认值是
  0.5 / 0.1 而不是 0,不写出来等于一直在做仿射缩放,违反约束。

尺寸正好等于 imgsz 时 letterbox 退化为空操作(r=1、dw=dh=0),核对过源码。
合成数据上验证:所有片正好 160x160、框区域与原图逐像素一致、填充是真镜像。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 12:27:57 +08:00

74 lines
3.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 在人工修正过的弱监督框上训练 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:
# 切成固定 160x160 的片:产线要求模型输入固定尺寸且禁止 resize。
# uv run python scripts/tile_dataset.py --data data/film_yolo/data.yaml \
# --out data/film_yolo_160 --size 160
yaml: data/film_yolo_160/data.yaml
model:
# CLAUDE.md 的"只用 convolution 模型"只约束聚类与数据集生成阶段,检测这一步不受限,
# 所以用最新的 YOLO26。它是端到端的(NMS-free),推理侧少一道后处理。
# n 是最小的一档:数据只有 1.1 万张且标签是弱监督的,模型大了容易把标注噪声也学进去。
weights: yolo26n.pt
train:
epochs: 500
# 必须与数据集的片大小一致。数据已经是 160x160,ultralytics 的 letterbox 这时
# 缩放比 r = min(160/160, 160/160) = 1、填充 dw=dh=0,退化成空操作,不会碰像素。
# 改尺寸时:重跑 tile_dataset.py,再同步改这里。
imgsz: 160
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
# 以下几何增强都会重采样像素,全部关掉。
# 注意 scale 与 translate 的 ultralytics 默认值是 0.5 / 0.1(不是 0),
# 不显式写出来就等于一直在做仿射缩放平移。
scale: 0.0
translate: 0.0
degrees: 0.0
mosaic: 0.0
mixup: 0.0
hsv_h: 0.0 # 单色/近单色的薄膜图,色相扰动没有意义
hsv_s: 0.3
hsv_v: 0.3
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]