Files
ModelTrainEval/scripts/retrain_from_label_studio.sh
T
Shaun ZhouandClaude Opus 5 8fa7a9d142 fix(ml-backend): 重训后真正切到新权重
重训脚本是 ML backend 的子进程,继承了后端 export 的 YOLO_WEIGHTS。启动脚本里
${YOLO_WEIGHTS:-默认值} 于是让旧值赢了——实测重训完成后后端仍加载旧权重,
current.pt 软链接形同虚设。同样被继承的还有 RETRAIN_EXTRA_SET,会让下次训练
沿用上次的冒烟参数(epochs=1)。

重启时显式传 YOLO_WEIGHTS 并 env -u 清掉 RETRAIN_EXTRA_SET。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 11:03:14 +08:00

55 lines
2.5 KiB
Bash
Executable File
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.
#!/usr/bin/env bash
# 从 Label Studio 的最新标注重新训练检测模型,并让 ML backend 用上新权重。
#
# bash scripts/retrain_from_label_studio.sh
#
# 也由 ML backend 在点击 Start Training 时自动调用(输出见 $RETRAIN_LOG)。
# 四步:导出标注 -> 装配数据集 -> 训练 -> 切换权重并重启后端。
set -euo pipefail
REPO=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
cd "$REPO"
PROJECT="${LS_PROJECT_ID:-39}"
IMAGES="${LS_IMAGES_DIR:-$REPO/runs/boxes_shap_label_studio/images}"
STAMP=$(date +%Y%m%d_%H%M)
EXPORT="${LS_EXPORT_DIR:-/tmp}/ls_export_${STAMP}.zip"
DATASET="$REPO/data/film_yolo_${STAMP}"
WORK_DIR="$REPO/runs/detect/film_${STAMP}"
PYTHON="${REPO_PYTHON:-$REPO/.venv/bin/python}"
# 用跑着 Label Studio 的那个环境导出,确保读的是同一个库
LS_BIN="${LS_BIN:-/home/deep/.v/label/bin/label-studio}"
[ -x "$LS_BIN" ] || LS_BIN="$REPO/.venv/bin/label-studio"
export LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT="${LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT:-/home/deep/labeling}"
# 训练参数的额外覆盖,冒烟测试时用,如 RETRAIN_EXTRA_SET="train.epochs=1 train.fraction=0.02"
EXTRA_SET="${RETRAIN_EXTRA_SET:-}"
echo "===== [$(date '+%F %T')] 开始重训(项目 $PROJECT)====="
echo "--- 1/4 导出标注 -> $EXPORT"
"$LS_BIN" export "$PROJECT" YOLO --export-path="$EXPORT"
echo "--- 2/4 装配数据集 -> $DATASET"
"$PYTHON" scripts/build_yolo_dataset.py \
--export "$EXPORT" --images "$IMAGES" --out "$DATASET" --overwrite
echo "--- 3/4 训练 -> $WORK_DIR"
# shellcheck disable=SC2086 # EXTRA_SET 需要按空格拆成多个参数
"$PYTHON" detect.py --config configs/detect/film.yaml \
--work-dir "$WORK_DIR" \
--set data.yaml="$DATASET/data.yaml" $EXTRA_SET
echo "--- 4/4 切换权重并重启 ML backend"
# 指向最新权重的稳定软链接:启动脚本读它,于是换模型不用改任何脚本
ln -sfn "$WORK_DIR/weights/best.pt" "$REPO/runs/detect/current.pt"
# 必须显式传 YOLO_WEIGHTS 并清掉继承来的变量:本脚本是旧后端的子进程,
# 它环境里已经 export 了 YOLO_WEIGHTS(旧权重)和可能的 RETRAIN_EXTRA_SET(冒烟参数),
# 不清掉的话新后端会继续用旧模型、下次训练也会沿用冒烟参数
env -u RETRAIN_EXTRA_SET YOLO_WEIGHTS="$REPO/runs/detect/current.pt" \
bash "$REPO/scripts/start_ml_backend.sh"
echo "===== [$(date '+%F %T')] 重训完成:$WORK_DIR ====="
echo "指标见 $WORK_DIR/metrics.json,曲线见 $WORK_DIR/results.png"