Label Studio ML 后端是一个 SDK,它允许您包装您的机器学习代码并将其转换为 Web 服务器。该 Web 服务器可以连接到正在运行的 Label Studio 实例,以实现标注任务的自动化。
如果您只需要将静态的预标注数据加载到 Label Studio 中,运行 ML 后端可能有些大材小用。相反,您可以导入预标注数据。
要开始使用模型,请使用 docker-compose 来运行 ML 后端服务器。
使用以下命令在 http://localhost:9090 启动 ML 后端服务:
git clone https://github.com/HumanSignal/label-studio-ml-backend.git
cd label-studio-ml-backend/label_studio_ml/examples/{MODEL_NAME}
docker-compose up
将 {MODEL_NAME} 替换为您想要使用的模型名称(见下文)。
在大多数情况下,您需要设置 LABEL_STUDIO_URL 和 LABEL_STUDIO_API_KEY 环境变量,以允许 ML 后端访问 Label Studio 中的媒体数据。在文档中了解更多。
此仓库支持以下模型。其中一些无需任何额外设置即可工作,而另一些则需要设置额外的参数。
查看 必需参数 列,了解是否需要设置任何额外参数。
| 模型名称 | 描述 | 预标注 | 交互模式 | 训练 | 必需参数 | 标签类型(任意或固定) |
|---|---|---|---|---|---|---|
| bert_classifier | 使用 Huggingface 进行文本分类 | ✅ | ❌ | ✅ | 无 | 任意 |
| easyocr | 自动化 OCR。使用 EasyOCR | ✅ | ❌ | ❌ | 无 | 固定(字符) |
| flair | 使用 flair 进行 NER | ✅ | ❌ | ❌ | 无 | 任意 |
| gliner | 使用 GLiNER 进行 NER | ❌ | ✅ | ✅ | 无 | 任意 |
| grounding_dino | 带提示的目标检测。详情见 GroundingDINO | ❌ | ✅ | ❌ | 无 | 任意 |
| grounding_sam | 结合 Prompts 和 SAM 2 的目标检测 | ❌ | ✅ | ❌ | 无 | 任意 |
| huggingface_llm | 使用 Hugging Face 进行 LLM 推理 | ✅ | ❌ | ❌ | 无 | 任意 |
| huggingface_ner | 使用 Hugging Face 进行 NER | ✅ | ❌ | ✅ | 无 | 任意 |
| interactive_substring_matching | 简单的关键词搜索 | ❌ | ✅ | ❌ | 无 | 任意 |
| langchain_search_agent | 结合 Google 搜索和 Langchain 的 RAG 管道 | ✅ | ✅ | ✅ | OPENAI_API_KEY, GOOGLE_CSE_ID, GOOGLE_API_KEY | 任意 |
| llm_interactive | 使用 OpenAI、Azure LLMs 进行提示工程 | ✅ | ✅ | ✅ | OPENAI_API_KEY | 任意 |
| mmdetection | 使用 OpenMMLab 进行目标检测 | ✅ | ❌ | ❌ | 无 | 任意 |
| nemo_asr | 使用 NVIDIA NeMo 进行语音 ASR | ✅ | ❌ | ❌ | 无 | 固定(词汇和字符) |
| paddleocr | 使用 PaddleOCR (PP-OCRv5) 进行 OCR | ✅ | ❌ | ❌ | 无 | 固定(字符) |
| segment_anything_2_image | 使用 SAM 2 进行图像分割 | ❌ | ✅ | ❌ | 无 | 任意 |
| segment_anything_model | 使用 Meta 进行图像分割 | ❌ | ✅ | ❌ | 无 | 任意 |
| sklearn_text_classifier | 使用 scikit-learn 进行文本分类 | ✅ | ❌ | ✅ | 无 | 任意 |
| spacy | 使用 SpaCy 进行 NER | ✅ | ❌ | ❌ | 无 | 固定(参见文档) |
| tesseract | 交互式 OCR。详情见 Tesseract | ❌ | ✅ | ❌ | 无 | 固定(字符) |
| timeseries_segmenter | 使用小型 LSTM 网络进行时间序列分割 | ✅ | ✅ | ✅ | 无 | 固定 |
| watsonX | 使用 WatsonX 进行 LLM 推理并与 WatsonX.data 集成 | ✅ | ✅ | ❌ | 无 | 任意 |
| yolo | 支持所有 YOLO 任务:YOLO | ✅ | ❌ | ❌ | 无 | 任意 |
要开始开发您自己的 ML 后端,请按照以下说明操作。
从仓库下载并安装 label-studio-ml:
git clone https://github.com/HumanSignal/label-studio-ml-backend.git
cd label-studio-ml-backend/
pip install -e .
label-studio-ml create my_ml_backend
您可以进入 my_ml_backend 目录并修改代码以实现您自己的推理逻辑。
目录结构应如下所示:
my_ml_backend/
├── Dockerfile
├── docker-compose.yml
├── model.py
├── _wsgi.py
├── README.md
└── requirements.txt
Dockerfile 和 docker-compose.yml 用于通过 Docker 运行 ML 后端。
model.py 是主文件,您可以在其中实现自己的训练和推理逻辑。
_wsgi.py 是一个辅助文件,用于通过 Docker 运行 ML 后端(您无需修改它)。
README.md 是一个包含如何运行 ML 后端说明的自述文件。
requirements.txt 是一个包含 Python 依赖项的文件。
在您的模型目录中,找到 model.py 文件(例如,my_ml_backend/model.py)。
model.py 文件包含一个继承自 LabelStudioMLBase 的类声明。该类提供了 Label Studio 用于与 ML 后端通信的 API 方法的包装器。您可以重写这些方法以实现自己的逻辑:
def predict(self, tasks, context, **kwargs):
"""为任务进行预测。"""
return predictions
predict 方法用于为任务进行预测。它使用以下参数:
tasks: JSON 格式的 Label Studio 任务context: JSON 格式的 Label Studio 上下文 - 用于交互式标注场景predictions: JSON 格式的预测结果数组一旦您实现了 predict 方法,就可以在 Label Studio 中看到来自已连接 ML 后端的预测。
您还可以实现 fit 方法来训练您的模型。fit 方法通常用于在已标注数据上训练模型,尽管它也可以用于任何需要数据持久化的任意操作(例如,将标注数据存储在数据库中、保存模型权重、保留 LLM 提示历史等)。
默认情况下,在 Label Studio 中的任何数据操作(如创建新任务或更新标注)时都会调用 fit 方法。您可以从项目设置的 Webhooks 部分修改此行为。
要实现 fit 方法,您需要在 model.py 文件中重写 fit 方法:
def fit(self, event, data, **kwargs):
"""在已标注数据上训练模型。"""
old_model = self.get('old_model')
# 编写更新模型的逻辑
self.set('new_model', new_model)
其中:
event: 事件类型可以是 'ANNOTATION_CREATED'、'ANNOTATION_UPDATED' 等。data: 从事件接收到的负载(更多信息请查看 Webhook 事件参考)此外,还有两个辅助方法可用于从 ML 后端存储和检索数据:
self.set(key, value) - 将数据存储在 ML 后端中self.get(key) - 从 ML 后端检索数据这两种方法都可以在 ML 后端代码的其他地方使用,例如,在 predict 方法中获取新的模型权重。
LabelStudioMLBase 类中还有其他可用的方法和参数:
self.label_config - 以 XML 字符串形式返回 Label Studio 标注配置。self.parsed_label_config - 以 JSON 形式返回 Label Studio 标注配置。self.model_version - 返回当前模型版本。self.get_local_path(url, task_id) - 此辅助函数用于下载并缓存通常存储在 task['data'] 中的 URL,并返回其本地路径。该 URL 可以是:LS 上传的文件、LS 本地存储、LS 云存储或任何其他 http(s) URL。为了不使用 Docker 运行(例如,用于调试目的),您可以使用以下命令:
label-studio-ml start my_ml_backend
修改 my_ml_backend/test_api.py 以确保您的 ML 后端按预期工作。
要修改端口,请使用 -p 参数:
label-studio-ml start my_ml_backend -p 9091
开始之前:
gcloud auth login
GCP_REGION 与您的默认区域添加到环境变量中。开始部署:
label-studio-ml deploy gcp {ml-backend-local-dir} \
--from={model-python-script} \
--gcp-project-id {gcp-project-id} \
--label-studio-host {https://app.heartex.com} \
--label-studio-api-key {YOUR-LABEL-STUDIO-API-KEY}
如果您在 Windows 上运行 docker-compose up --build 时遇到类似以下错误:
exec /app/start.sh : No such file or directory
exited with code 1
此问题很可能是由于 Windows 处理文本文件中的行尾方式引起的,这可能会影响像 start.sh 这样的脚本。要解决此问题,请按照以下步骤操作:
在克隆仓库之前,请确保您的 Git 配置为在检出文件时不自动将行尾转换为 Windows 样式 (CRLF)。这可以通过将 core.autocrlf 设置为 false 来实现。打开 Git Bash 或您首选的终端并执行以下命令:
git config --global core.autocrlf false
如果您在调整 Git 配置之前已经克隆了仓库,则需要再次克隆以确保行尾正确保留:
导航到您克隆的仓库中包含 Dockerfile 和 docker-compose.yml 的相应目录。然后,继续执行 Docker 命令:
docker-compose build 以基于 docker-compose.yml 中指定的配置构建 Docker 容器。docker-compose up 启动容器。.gitattributes 文件(如果存在),因为它也会影响 Git 如何处理文件中的行尾。通过遵循这些步骤,您应该能够解决由于行尾转换导致 Docker 在 Windows 上无法识别 start.sh 脚本的问题。
有时,您希望重置 pip 缓存以确保安装依赖项的最新版本。例如,Label Studio ML Backend 库在 requirements.txt 中被用作 label-studio-ml @ git+https://github.com/HumanSignal/label-studio-ml-backend.git。假设它已更新,并且您希望在您的 Docker 镜像中使用 ML 模型的最新版本。
您可以使用以下命令从头开始重建 Docker 镜像:
docker compose build --no-cache
Bad Gateway 和 Service Unavailable 错误如果您发送多个并发请求,可能会看到这些错误。
请注意,提供的 ML 后端示例是以开发模式提供的,不支持生产级别的推理服务。
您必须确保 ML 后端可以访问您的 Label Studio 数据。如果不能,您可能会遇到以下问题:
no such file or directory 错误。