# 在人工修正过的弱监督框上训练 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]