Label Studio 是一个开源的数据标注平台,配合 YOLO ML Backend 可以实现:
本文详细介绍如何使用 Docker Compose 一键部署 Label Studio + YOLO 自动标注后端。
flowchart LR
A[📁 Images<br>Dataset] --> B[🏷️ Label Studio<br>Web UI :8006]
B --> C[🔗 YOLO ML<br>Backend :9090]
C --> D[🤖 YOLO Model<br>Inference]
style A fill:#e1f5fe
style B fill:#fff3e0
style C fill:#e8f5e9
style D fill:#ffebee
label-studio-yolo/
├── docker-compose.yml
├── models/ # YOLO 模型目录
│ └── my_model.pt
├── data/server/ # Label Studio 数据
├── cache_dir/ # 缓存
├── images/ # 待标注图片
└── label-studio/data/ # Label Studio 存储
version: '3.8'
services:
label-studio:
image: heartexlabs/label-studio:latest
container_name: label-studio
ports:
- "8006:8080"
environment:
- LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true
- LABEL_STUDIO_LOCAL_FILES_ROOT=/label-studio/data
volumes:
- ./label-studio/data:/label-studio/data
- ./images:/images:ro
restart: unless-stopped
yolo-backend:
container_name: yolo
image: heartexlabs/label-studio-ml-backend:yolo-20250811.131142-master-c3d746b
environment:
# 基础认证(可选)
- BASIC_AUTH_USER=admin
- BASIC_AUTH_PASS=admin+123
# 日志级别
- LOG_LEVEL=DEBUG
# 服务参数
- WORKERS=1
- THREADS=8
# 模型目录
- MODEL_DIR=/data/models
- MODEL_ROOT=/app/models
- PYTHONPATH=/app
# Label Studio 连接配置
# ⚠️ 不要使用 localhost 或 127.0.0.1,Docker 容器内无法访问
# 使用实际 IP 或 host.docker.internal
- LABEL_STUDIO_HOST=http://192.168.0.179:8006/
- LABEL_STUDIO_API_KEY=你的API密钥
# YOLO 参数
- ALLOW_CUSTOM_MODEL_PATH=true
- DEBUG_PLOT=false
- MODEL_SCORE_THRESHOLD=0.5
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- "9090:9090"
volumes:
- ./data/server:/data
- ./models:/app/models
- ./cache_dir:/app/cache_dir
restart: unless-stopped
| 配置项 | 说明 | 示例 |
|---|---|---|
LABEL_STUDIO_HOST |
Label Studio 地址(容器内可访问) | http://192.168.0.179:8006/ |
LABEL_STUDIO_API_KEY |
Label Studio API 密钥 | Settings → Account → API Key |
MODEL_ROOT |
YOLO 模型存放目录 | /app/models |
MODEL_SCORE_THRESHOLD |
置信度阈值 | 0.5(过滤低置信度预测) |
BASIC_AUTH_USER/PASS |
后端访问认证 | admin / admin+123 |
⚠️ 注意:
LABEL_STUDIO_HOST必须使用实际 IP,不能用localhost,因为 Docker 容器之间通过网络通信。
将训练好的 YOLO 模型文件放到 models/ 目录:
mkdir -p models
# 放入你的模型,如 best.pt 或 yolov8n.pt
cp /path/to/your/custom_model.pt models/my_model.pt
模型在标注配置的 model_path 参数中指定,无需在 docker-compose.yml 中配置。
| 要求 | 说明 |
|---|---|
| 格式 | .pt(PyTorch)或 .onnx |
| 框架 | Ultralytics YOLO 系列(v8/v11) |
| 存放位置 | ./models/ 目录 |
<View>
<Image name="image" value="$image"/>
<RectangleLabels name="label" toName="image"
model_path="fire_20260512.pt"
model_score_threshold="0.1"
model_nms_threshold="0.3">
<Label value="fire" background="green"/>
<Label value="smoke" background="blue"/>
<Label value="other" background="#FFA39E"/>
</RectangleLabels>
</View>
关键参数说明:
| 参数 | 说明 | 示例值 |
|---|---|---|
model_path |
模型文件名(放在 ./models/ 目录) |
fire_20260512.pt |
model_score_threshold |
置信度阈值,越低检测越多 | 0.1 |
model_nms_threshold |
NMS 非极大值抑制阈值 | 0.3 |
⚠️ 注意:模型文件需要预先放入
models/目录,并在 ML Backend 中完成连接配置。
docker compose up -d label-studio
等待启动完成后访问 http://localhost:8006,注册账号并登录。
docker compose up -d yolo-backend
http://localhost:9090创建 tasks.json 格式的导入文件:
[
{"image": "/images/img001.jpg"},
{"image": "/images/img002.jpg"},
{"image": "/images/img003.jpg"}
]
或者使用 Python SDK:
from label_studio_sdk import Client
ls = Client(
url='http://localhost:8006',
api_key='your-api-key'
)
project = ls.get_project(id=1)
# 批量导入
import glob
images = glob.glob('./images/*.jpg')
for img_path in images:
project.create_task(data={'image': img_path})
导出为 YOLO 格式:
# 在 Label Studio UI 中
# Project → Export → YOLO ZIP
导出的目录结构:
yolo_export/
├── classes.txt
├── images/
│ ├── img001.jpg
│ └── img002.jpg
└── labels/
├── img001.txt
└── img002.txt
classes.txt 内容:
person
car
dog
cat
img001.txt 内容(YOLO 格式):
0 0.5 0.5 0.3 0.4
1 0.2 0.3 0.1 0.2
格式说明:class_id x_center y_center width height(归一化)
如果使用 GPU 加速,修改 docker-compose.yml:
services:
yolo-backend:
image: heartexlabs/label-studio-ml-backend:yolo-20250811.131142-master-c3d746b
runtime: nvidia # 添加这行
environment:
- CUDA_VISIBLE_DEVICES=0
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
确保安装了 NVIDIA Container Toolkit。
# 检查服务状态
docker compose ps
# 查看日志
docker compose logs yolo-backend
# 检查端口是否占用
netstat -tlnp | grep 9090
确保 Label Studio 的标签名与 YOLO 模型输出的类别名一致,或使用 predicted_values 属性映射。
# 检查模型文件是否存在
ls -la models/
# 手动测试模型
docker exec -it yolo python -c "from ultralytics import YOLO; YOLO('/app/models/yolov8n.pt')"
使用更小的模型或在标注配置中降低 model_score_threshold:
model_score_threshold="0.3"
| 模型 | 用途 | 参数量 | 推荐场景 |
|---|---|---|---|
| yolov8n.pt | 快速测试 | 3.2M | 演示、快速迭代 |
| yolov8s.pt | 一般任务 | 11.2M | 日常标注 |
| yolov8m.pt | 精度优先 | 25.9M | 高精度需求 |
| yolov8l.pt | 高精度 | 53.7M | 专业级标注 |
| yolov8n-seg.pt | 实例分割 | 6.3M | 分割任务 |
| yolov8n-pose.pt | 关键点检测 | 6.3M | 姿态估计 |
label-studio-yolo/
├── docker-compose.yml
├── README.md
├── models/ # YOLO 模型目录
│ └── my_model.pt # 你的自定义模型
├── data/
│ └── server/ # Label Studio 数据
├── cache_dir/ # 缓存目录
├── images/ # 待标注图片
└── label-studio/
└── data/ # Label Studio 存储
注意:不需要自定义 Dockerfile,使用官方预构建的
yolo-20250811.131142-master-c3d746b镜像即可,该镜像已包含 YOLO 支持。
#!/bin/bash
# 创建目录
mkdir -p models data/server cache_dir images label-studio/data
# 下载默认模型(可选)
# wget -O models/yolov8n.pt \
# https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt
# 启动服务
docker compose up -d
echo "======================================"
echo " Label Studio: http://localhost:8006"
echo " YOLO Backend: http://localhost:9090"
echo "======================================"
echo ""
echo "首次使用需要:"
echo "1. 访问 http://localhost:8006 注册账号"
echo "2. Settings → Account → 获取 API Key"
echo "3. 更新 docker-compose.yml 中的 LABEL_STUDIO_API_KEY"
echo "4. Settings → ML Backend → 添加后端 http://localhost:9090"
首次部署后记得修改 LABEL_STUDIO_API_KEY 为你的实际密钥!
使用 Docker Compose 部署 Label Studio + YOLO 自动标注后端,可以快速搭建一个完整的 AI 辅助标注系统。
关键点:
predicted_values 映射标签models/ 目录runtime: nvidia有问题欢迎留言讨论!