解放双手!LabelStudio 智能标注实战
上一篇分享了 LabelStudio 的部署以及手动标注流程,本文分享另一个功能:智能标注(预标注),通过对接 ML 后端实现自动标注,解放双手。
LabelStudio 中使用智能标注(预标注)的大致流程如下:
1)准备模型部署
2)模型服务接入 LabelStudio
3)配置标注模板时特殊处理
4)开始智能标注
ps:这里说的预标注/自动标签/智能标注都是指:让 ML/AI 模型自主预测标签,然后人工进行审查。
智能标注流程:
1)用户打开任务
2)Label Studio将请求发送到 ML 后端
3)ML 后端执行预测并返回结果
4)预测被加载到 LabelStudio UI 中展示
1. 准备模型服务
要是有模型进行智能标注,自然得先部署一个模型服务才行。
需要注意的是:对接到 Label Studio 的模型服务需要满足一定规范才行。
可以通过 Label Studio ML backend SDK 将我们自己的模型服务转换为一个 Web 服务,然后将该 Web 服务连接到 LabelStudio 以实现智能标注。
是有内置 example 模型服务
实现自己的模型服务
本次演示,直接使用内置的 yolo 服务做为 Backend。
1.1自定义模型服务
1)clone 并安装 repo
2)初始化项目
3)实现自己的预测逻辑
安装 repo
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/
├── Dockerfile
├── .dockerignore
├── docker-compose.yml
├── model.py
├── _wsgi.py
├── README.md
├── requirements-base.txt
├── requirements-test.txt
├── requirements.txt
└── test_api.py
只需要关注以下几个文件:
model.py:在该文件中实现自定义预测逻辑
test_api.py:测试文件
实现自定义预测逻辑
model.py
中有一个继承自 LabelStudioMLBase
的 class,该 class 实现了 Label Studio 通信所需的方法。我们可以重新其中的 predict
方法实现自己的预测逻辑。
def predict(self, tasks, context, **kwargs):
"""Make predictions for the tasks."""
return predictions
这样我们就实现了自己的 ML Backend.
1.2 使用内置服务
构建镜像
先 clone 该项目
git clone https://github.com/HumanSignal/label-studio-ml-backend
然后使用 yolo example 构建镜像
cd label-studio-ml-backend
cd label_studio_ml/examples/yolo/
# 构建镜像
DOCKER_BUILDKIT=1 docker build -t humansignal/yolo:v0 -f Dockerfile .
启动服务
使用上一步构建镜像启动服务,完整 yaml 如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: yolo
labels:
app: yolo
spec:
replicas: 1
selector:
matchLabels:
app: yolo
template:
metadata:
labels:
app: yolo
spec:
containers:
- name: yolo
image: humansignal/yolo:v0
ports:
- containerPort: 9090
env:
- name: BASIC_AUTH_USER
value: ""
- name: BASIC_AUTH_PASS
value: ""
- name: LOG_LEVEL
value: "DEBUG"
- name: ANY
value: "PARAMETER"
- name: WORKERS
value: "1"
- name: THREADS
value: "8"
- name: MODEL_DIR
value: "/data/models"
- name: PYTHONPATH
value: "/app"
- name: LABEL_STUDIO_URL
value: "http://host.docker.internal:8080"
- name: LABEL_STUDIO_API_KEY
value: ""
- name: ALLOW_CUSTOM_MODEL_PATH
value: "true"
- name: DEBUG_PLOT
value: "false"
- name: MODEL_SCORE_THRESHOLD
value: "0.5"
- name: MODEL_ROOT
value: "/app/models"
volumeMounts:
- name: data-volume
mountPath: /data
- name: models-volume
mountPath: /app/models
- name: cache-volume
mountPath: /app/cache_dir
volumes:
- name: data-volume
emptyDir: {}
- name: models-volume
emptyDir: {}
- name: cache-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: yolo-service
spec:
type: NodePort # 根据需求可改为 LoadBalancer
selector:
app: yolo
ports:
- protocol: TCP
port: 9090
targetPort: 9090
nodePort: 30090 # NodePort 范围建议 30000-32767
修改配置
启动前,需要修改部分配置,主要为环境变量,包括 LabelStudio 的信息 URL 和 API Key 需要修改为真实值,其他可以保持原状。
- name: LABEL_STUDIO_URL
value: "http://172.20.150.246:30808"
- name: LABEL_STUDIO_API_KEY
value: "887037f586e2021f345ed062c9d119d07afb8c89"
其中 API Key 获取方式如下:
启动
然后 apply 即可
kubectl apply -f yolo-ml.yaml
验证
查看运行情况
[root@label-studio-k8s ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
yolo-9b48946d4-pz75v 1/1 Running 0 9m30s
[root@label-studio-k8s ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
yolo-service NodePort 10.100.45.164 <none> 9090:30090/TCP 9m33s
验证
[root@label-studio-k8s ~]# curl http://10.100.45.164:9090/health
{"model_class":"YOLO","status":"UP"}
至此,模型服务启动成功。
2. 体验智能标注
2.1 创建项目
创建 PreLabel 项目用于测试智能标注。
2.2 ML Backend 接入到 Label Studio
在 Project Setting 中 Model 栏目中添加上一步中启动的模型
ps:LabelStudio 和模型服务在同一个集群,这里直接使用 ClusterIP 对接。
保存即可
2.3 导入待标注文件
上传待标记数据
2.4 配置标注模版(重要)
使用不同的 ML Backend、不同的数据类型等等对于的标签都不相同,具体参考官方文档:Configure labeling interface
这里使用图片问题识别 + yolo 模型,配置标注模板为以下格式
<View>
<Image name="image" value="$image"/>
<RectangleLabels name="label" toName="image" model_score_threshold="0.25">
<Label value="Car" background="blue" predicted_values="jeep,cab,limousine,truck"/>
</RectangleLabels>
</View>
其中的 values 选项可以调整,但是标签一定要使用 RectangleLabels。
比如这里将 value 修改为 Cat、Dog 和 Other 三个
<View>
<Image name="image" value="$image"/>
<RectangleLabels name="animal_label" toName="image" model_score_threshold="0.25">
<Label value="Cat" background="green" predicted_values="kitten,tabby,persian"/>
<Label value="Dog" background="orange" predicted_values="puppy,retriever,husky"/>
<Label value="Other" background="gray" predicted_values="bird,rabbit,unknown"/>
</RectangleLabels>
</View>
效果如下
2.5 开始智能标注
选中 Task 点击 Retrieve Predictions 触发任务
过一会就会生成预测结果,查看
模型预测结果为 0.95 概率是 Cat,然后选择结果也是 Cat,并且框出了范围。
我们需要做的就是检查作业了:
- 如果模型标注正确,直接提交即可
- 如果模型标注错误,手动修改并提交
从而极大的减少工作量。
3. 小结
LabelStudio 接入 ML Backend 即可实现智能标注,由模型服务先完成标注,然后人工检查,从而减少工作量。
大致流程如下:
1)准备模型部署
2)模型服务接入 LabelStudio
3)配置标注模板时特殊处理
4)开始智能标注
可以基于 Label Studio ML backend SDK 实现自己的 ML Backend,从而实现自己的模型服务完成智能标注。
智能标注详细流程:
1)用户打开任务
2)Label Studio将请求发送到 ML 后端
3)ML 后端执行预测并返回结果
4)预测被加载到 LabelStudio UI 中展示