diff --git a/ml_backend/README.md b/ml_backend/README.md new file mode 100644 index 0000000..6bd7b5e --- /dev/null +++ b/ml_backend/README.md @@ -0,0 +1,94 @@ +# 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 +VIRTUAL_ENV=.venv-ml uv pip install \ + "label-studio-ml @ git+https://github.com/HumanSignal/label-studio-ml-backend.git" \ + ultralytics +``` + +## 启动 + +```bash +cd ml_backend +YOLO_WEIGHTS=$PWD/../runs/detect/film/weights/best.pt \ +YOLO_DEVICE=cuda \ +LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/home/deep/labeling \ +../.venv-ml/bin/python _wsgi.py -p 9090 +``` + +**用 `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 里的 `