如何使用 Label Studio 对图像实现半自动化标注
前言
在进行数据集标注时,标注软件能实现自动标注肯定是所有数据标注人员的梦想 —— 以 YOLO 实例分割标注为例,标一个目标平均需要几十个多边形点,而一张图像上甚至能有 10 个需要标注的目标 —— 十分钟都不一定能标注完成一幅图,还不计手酸眼疼屁股痛的问题。本文将以 Ubuntu 22.04.5 LTS 系统为例,讲述如何借助 Label Studio、用于 Ultralytics YOLO 的 Label Studio ML 后端以及训练获得 .pt
/.pth
权重模型来实现半自动标注任务。
标注前准备
检查 Docker 的安装和运行
请确保当前系统中已经安装了 Docker,并能正常拉取 Docker 镜像。关于 Docker 的安装与配置,请参阅 在 Linux 上安装并配置 Docker 一文,本文不予赘述。
克隆 Label Studio 的 YOLO ML 后端
在终端中使用以下命令来克隆 seblful 的 YOLO ML 后端:
git clone https://github.com/seblful/label-studio-yolo-backend.git
如果可以,请为这个项目点一颗星以支持一下原作者。Anawaert 鼓励大家支持开源项目,当然有能力者可以提交 Pull Request,但作为广大使用开源项目的用户,点一颗星就是对原作者最好的认可和奖励,就像 B 站的投币功能那样。
安装必要的依赖
将目录切换至刚才克隆仓库的目录,然后使用 pip 包管理器来安装依赖包:
cd ./label-studio-yolo-backend
pip install -r ./requirements.txt
速度可能有点慢,耐心等待安装完毕即可。
将模型挂载至 /models/
下
在当前目录下,创建一个新目录 /models
,然后将先前训练获得的 .pt
/.pth
模型拷贝至 /models/
下:
mkdir ./models
# [your-original-model-path] 为之前训练获得的模型权重所在路径
cp [your-original-model-path] ./models/
修改 YOLO ML 后端的配置
使用任意编辑器打开目录中的 docker-compose.yml
,该文件的内容应该是这样的:
services:
yolo:
container_name: yolo
build:
context: .
environment:
# Authentification
- BASIC_AUTH_USER=${BASIC_AUTH_USER}
- BASIC_AUTH_PASS=${BASIC_AUTH_PASS}
# Log level
- LOG_LEVEL=${LOG_LEVEL}
# Paths
- PYTHONPATH=/app
- MODEL_DIR=./models
- MODEL_FILENAME=${MODEL_FILENAME}
- LABEL_STUDIO_URL=http://host.docker.internal:${PORT}
- LABEL_STUDIO_API_KEY=${LABEL_STUDIO_API_KEY}
- TASK_TYPE=${TASK_TYPE}
ports:
- "9090:9090"
volumes:
- "./data/server:/data"
develop:
watch:
- action: rebuild
path: ./model.py
target: /app/model.py
需要修改的地方如下面所示,主要是 MODEL_FILENAME
和 LABEL_STUDIO_URL
:
services:
yolo:
container_name: yolo
build:
context: .
environment:
# Authentification
- BASIC_AUTH_USER=${BASIC_AUTH_USER}
- BASIC_AUTH_PASS=${BASIC_AUTH_PASS}
# Log level
- LOG_LEVEL=${LOG_LEVEL}
# Paths
- PYTHONPATH=/app
- MODEL_DIR=./models
# 需要修改:
# <your-model-name> 为 /models/ 下模型权重的名称,比如 best.pt
- MODEL_FILENAME=<your-model-name>
# 需要修改:
# <your-ip-address> 为计算机的 IPv4 地址
- LABEL_STUDIO_URL=http://<your-ip-address>:8080
- LABEL_STUDIO_API_KEY=${LABEL_STUDIO_API_KEY}
# 需要修改:
# 可以填写 segmentation 或 detection,分别对应 实例分割 和 目标检测 任务,笔者填写的是 segmentation
- TASK_TYPE=segmentation
ports:
- "9090:9090"
volumes:
- "./data/server:/data"
develop:
watch:
- action: rebuild
path: ./model.py
target: /app/model.py
有读者可能看到这里有点懵了,模型权重的名称还好理解,那计算机的 IPv4 地址是什么?其实可以这么理解,Label Studio 和这个程序会同时运行在当前系统中,但是这个程序实际上是 Docker 管理的,而 Label Studio 是运行在本机上,所以当需要“跨程序”传递消息的时候,就需要使用本机当前的真实 IP 地址指定 Label Studio 的地址和端口。在进行半自动标注的时候,Label Studio 和这个程序在后台不断地交互,该程序负责推理,并且把推理获得的数据回传 Label Studio,而 Label Studio 会不断将图像数据传递给该程序,然后根据回传的数据对数据集进行标注。通过这样不断交互的方式,最终实现边推理边标注。
那么如何查看当前的 IP (IPv4) 地址呢?可以不使用 ifconfig
命令查看,进入设置,如果您和笔者一样使用有线连接,就可以在设置页面看到当前有线连接对应网卡的 IPv4 地址:
若您采用无线连接,那么也可以在连接到的网络的右侧看到一个齿轮图标,点进去后也可以看到当前的 IPv4 地址:
启动 Label Studio 并获取 API 密钥
启动 Label Studio,然后在 Label Studio 主界面的右上角点击头像,再点击 Account & Settings:
然后在此界面,点击下图所示按钮,拷贝 Label Studio 的 API 密钥:
请不要将此 API 密钥泄露给他人,也不要随意将该 API 密钥应用于其它的程序当中。
创建后端环境文件
复制完 Label Studio 的 API 密钥后,在本目录下使用 touch
命令创建一个名为 .env
的文件:
touch ./.env
然后在该文件中添加以下内容:
BASIC_AUTH_USER= # 填写一个用户名,后面连接至 Label Studio 时使用
BASIC_AUTH_PASS= # 填写上面用户名对应的密码,后面连接至 Label Studio 时使用
LOG_LEVEL=DEBUG
MODEL_FILENAME= # /models/ 下模型权重的名称,比如 best.pt
LABEL_STUDIO_API_KEY= # 填写刚才复制的 Label Studio API 密钥
运行后端程序
在 YOLO 的 ML 后端目录下,使用如下命令来运行后端程序:
docker compose up
Docker 会自动拉取所需的镜像和资源,大小可能很大(约 3-4 GiB),下载时间在 15-75 分钟不等。在获取完所有必需的镜像和资源后,终端将如下显示:
至此,所有的标注前工作都已完成。
开始标注
返回 Label Studio 中,返回主界面,在标注项目的右上角的“···”,选择 Settings 点击进入项目设置:
然后在左侧边栏选定 Model,然后点击右边的 Connect Model:
接下来就会弹出一个窗口,需要填写一些与后端模型连接相关的信息:
- Name(后端模型名称):可以随便填写,符合命名规范即可
- Backend URL(后端的 URL):必填项目,填写 http://localhost:9090 即可
- Select authentication method(选择认证方法):选择 Basic Authentication(基本认证)
- Basic auth user(基本认证用户):填写先前在
.env
文件中为BASIC_AUTH_USER
赋值的用户名即可 - Basic auth pass(基本认证密码):同上
- Any extra params to pass during model connection(在模型连接中任何需要传递的额外参数):若没有需要传递的参数,可为空
- Interactive preannotations(交互式预标注):开启后,Label Studio 就会在我们切换图像的时候为我们自动推理并标注
点击 Validate and Save,即可看到我们成功连接上了 ML 后端模型:
此时,返回至该标注项目的标注界面中,开启下边栏中的 Auto-Annotation,即可看到Label Studio 为我们自动标注了图像上的目标(本例当中,标注目标为辣椒),并且会自动区分它们的类别:
当然,由于推理结果并不是百分之百地准确,像下面图中标注区域有明显锯齿状或者是类别分辨错误的情况也时有发生:
当自动标注出现以下任意一种情况时,应当删除自动标注,改用手动标注来进行校正:
- (多边形)标注区域有明显锯齿状的边缘或突出/凹陷
- (多边形)标注点出现重合或区域交叉,即此时标注轮廓曲线并非为若儿当曲线
- (多边形)标注点之间的疏密差异过大
- (检测框)无法将目标完全覆盖
- 多个目标严重重合或一个目标有不正常的多个类别
暂停 Label Studio 与 YOLO ML 后端
在启动 Label Studio 与 YOLO ML 后端的终端中,分别使用 Ctrl + C 按键即可将 Label Studio 与 YOLO ML 后端对应的 Docker 服务暂停。除了 YOLO ML 后端文件中的 docker-compose.yml
与本机 IPv4 地址相关的内容可能需要经常更改,其它部分基本可以实现“一条命令,长久运行”。
结语
本文介绍了如何在 Ubuntu 22.04.5 LTS 上配置 Label Studio 的 ML 后端,并以修改的 YOLO ML 后端为例,演示了借助已训练获得的 YOLO 模型来实现在 Label Studio 中边标注边推理的功能。这极大地简化了数据标注人员在标注时的压力和时间花费,堪称标注界的正反馈调节,值得所有深度学习从业人员一试。若各位对 Label Studio 上的半自动化标注有其他补充或想法,欢迎在下方评论区留言。最后,不要忘了去 GitHub 上给这位 Label Studio 的 YOLO ML 后端开发者和 Label Studio 的仓库点颗星星,支持开源,共筑梦想!