# Label Studio ML Backend:用训练好的 YOLO 做预标注 把 `runs/detect//weights/best.pt` 接进 Label Studio,打开任务时自动给出框, 人工只需修正而不是从零画。标注攒够数量还能自动触发重训,形成"边标边训"的闭环。 ## 为什么要单独的虚拟环境 `label-studio-ml` 会把 jinja2 降到 3.0.3、带进 Flask 1.1.2,而 label-studio 1.23 需要 jinja2 3.1。装进主环境会直接弄坏 Label Studio。它本来就是个独立服务,单独建环境最省事。 另外 **PyPI 上的 `label-studio-ml` 是 2023 年的 1.0.9,不要用**,要装 GitHub 上的现行版本 (本文档基于 2.0.1.dev0 验证)。 ```bash uv venv .venv-ml --python 3.12 # --no-deps 装本体:它把 label-studio-sdk pin 到了 GitHub 某个提交, # 那个仓库大、容易传输中断(服务器上实测失败过),依赖全部走 PyPI 更稳 VIRTUAL_ENV=.venv-ml uv pip install --no-deps \ "label-studio-ml @ git+https://github.com/HumanSignal/label-studio-ml-backend.git" VIRTUAL_ENV=.venv-ml uv pip install \ "flask>2.3" "colorama~=0.4" "requests~=2.31" "semver~=3.0.2" \ "label-studio-sdk>=2.1" ultralytics ``` ## 启动 ```bash bash scripts/start_ml_backend.sh ``` 脚本会停掉旧进程、带齐环境变量重启,并打印权重、日志位置与网页端要填的 URL。 所有参数都能用环境变量覆盖,例如 `YOLO_WEIGHTS=... bash scripts/start_ml_backend.sh`。 它内部用 `python _wsgi.py` 而不是 `label-studio-ml start .`:后者用 PATH 上的 python 起子进程,在独立环境里会 `ModuleNotFoundError`。 `LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT` 必须和启动 Label Studio 时的值一致——任务里的图片是 `/data/local-files/?d=...`,后端要靠它把 URL 还原成磁盘路径。图片若来自上传或云存储, 则改为设置 `LABEL_STUDIO_URL` 与 `LABEL_STUDIO_API_KEY`,后端会自行下载。 健康检查: ```bash curl http://localhost:9090/health # {"model_class":"FilmDefectDetector","status":"UP"} ``` ## 接入项目 Label Studio 里:Settings → **Model** → Connect Model,URL 填 `http://localhost:9090`。 - 勾选 **Interactive preannotations** 后,打开任务就会实时调用模型; - 也可以在 Data Manager 里选中若干任务 → Actions → **Retrieve Predictions** 批量拉取。 **类别名必须和 labeling config 里的 `