Files
ModelTrainEval/scripts/retrain_from_label_studio.sh
T
Shaun ZhouandClaude Opus 5 e61fd5887c feat(ml-backend): Start Training 按钮真正触发重训,启动/重训脚本进 scripts/
原先点 Label Studio 的 Start Training 只是把计数加一:START_TRAINING 和普通标注事件
走同一条阈值判断,没配 RETRAIN_COMMAND 时更是静默什么都不做。实际使用中用户点了按钮、
以为在训练,其实权重一直没变。

- Start Training 无条件触发重训;攒够 RETRAIN_AFTER 条新标注也自动触发。
- 只数 ANNOTATION_CREATED:UPDATED / DELETED 是对已有标注的修改,不该把阈值顶到。
- 已有重训在跑时重复点击被忽略,不叠加启动。
- 没配 RETRAIN_COMMAND 时打警告说明不会真的训练,并在返回值里说清楚。
- 子进程输出重定向到 RETRAIN_LOG(默认 /tmp/retrain.log),训练进度有地方看。

scripts/start_ml_backend.sh、scripts/retrain_from_label_studio.sh 放进仓库,
可从工作区直接启动。重训末尾把 runs/detect/current.pt 软链接指向新权重,
启动脚本默认读它,换模型不必改脚本。

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

51 lines
2.1 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"
bash "$REPO/scripts/start_ml_backend.sh"
echo "===== [$(date '+%F %T')] 重训完成:$WORK_DIR ====="
echo "指标见 $WORK_DIR/metrics.json,曲线见 $WORK_DIR/results.png"