2

一 前言

本文将针对以下几个问题讲述关于label studio的使用

  1. 如何使用label studio 进行标注
  2. 如何通过API推送原始数据到lable studio
  3. 如何导出标注后的数据
  4. webhook

二 label studio 是什么?

Label Studio 是一款开源数据标记工具,在一个平台上支持多个项目、用户和数据类型。它允许您执行以下操作:

使用多种数据格式执行不同类型的标记。
将 Label Studio 与机器学习模型集成,为标签 (预标签) 提供预测,或执行持续主动学习。

label studio 项目列表界面:
image.png
项目下数据管理器界面:
image.png
标注中界面:
image.png

三 如何使用label studio 进行标注

安装label studio

label studio 支持多种安装方法 label studio install

使用 pip 安装
使用 Docker 安装
在 Ubuntu 上安装
从源代码安装
使用 Anaconda 安装

使用docker 安装的具体步骤如下:

docker run -it -p 8080:8080 -v ${PWD}/mydata:/label-studio/data heartexlabs/label-studio:latest label-studio --log-level DEBUG

${PWD}是一个环境变量,代表当前命令提示符(或终端)所在的目录。因此,${PWD}/mydata指的是当前目录下的mydata文件夹。
执行完上述命令后:打开http://localhost:8080即可看见label studio 的登录界面
image.png

添加用户

您还可以在启动 Label Studio 时从命令行创建帐户。

label-studio start --username <username> --password <password> [--user-token <token-at-least-5-chars>]

note!: --user-token参数是可选的。如果您未设置用户令牌,则会自动为用户生成一个。使用用户令牌进行 API 访问。令牌的最小长度为 5 个字符。

四 如何通过API推送原始数据到lable studio

项目设置工作流程

启动 Label Studio并创建帐户后,创建一个项目以开始标记您的数据。

创建项目
将数据导入Label Studio。
导入数据后,您就可以为您的项目设置标签界面。

创建项目

curl -H Content-Type:application/json -H 'Authorization: Token abc123' -X POST 'https://localhost:8080/api/projects'     --data '{"title": "My project", "label_config": "<View></View>"}'

请求body例子:

{
  "title": "My project",
  "description": "My first project",
  "label_config": "<View>[...]</View>",
  "expert_instruction": "Label all cats",
  "show_instruction": true,
  "show_skip_button": true,
  "enable_empty_annotation": true,
  "show_annotation_history": true,
  "reveal_preannotations_interactively": true,
  "show_collab_predictions": true,
  "maximum_annotations": 0,
  "color": "#FFFFFF",
  "control_weights": {...}
}

label_config: XML格式的标签配置
enable_empty_annotation:是否允许空标注
show_annotation_history: 显示历史标注
maximum_annotations: 最大注解数 (0表示不受限制)

将数据导入Label Studio。

curl -H 'Content-Type: application/json' -H 'Authorization: Token abc123' \
-X POST 'https://localhost:8080/api/projects/1/import' --data '[{"text": "xxx"}]'

其中的数据data 的数据的在下图中红框中的内容显示
image.png

设置标签界面 (即1中的XML格式的标签配置)

{
  "header": "This is a different header for each task",
  "textlabel": "This is the text that needs to be labeled"
}

使用以下标签配置引用数据字段:

<View>
  <Header value="$header"></Header>
  <Text name="text" value="$textlabel"></Text>
  <Choices name="sentiment" toName="text" choice="single" showInLine="true">
   <Choice value="Positive"/>
   <Choice value="Negative"/>
   <Choice value="Neutral"/>
  </Choices>
</View>

然后你的标签界面看起来就像这样:
image.png

五 如何导出标注后的数据

对于项目,单击导出。
选择可用的导出格式。
单击“导出”即可导出数据。

image.png
导出的JSON格式的数据如下:

[
  {
    "id": 31,
    "annotations": [
      {
        "id": 8,
        "completed_by": 1,
        "result": [
          {
            "original_width": 1600,
            "original_height": 900,
            "image_rotation": 0,
            "value": {
              "x": 10.2701005025126,
              "y": 15.7453936348409,
              "width": 16.9597989949749,
              "height": 11.892797319933,
              "rotation": 0
            },
            "id": "QRSAtN_XA_",
            "from_name": "rect",
            "to_name": "image",
            "type": "rectangle",
            "origin": "manual"
          },
          {
            "original_width": 1600,
            "original_height": 900,
            "image_rotation": 0,
            "value": {
              "x": 10.2701005025126,
              "y": 15.7453936348409,
              "width": 16.9597989949749,
              "height": 11.892797319933,
              "rotation": 0,
              "labels": [
                "air-conditioner"
              ]
            },
            "id": "QRSAtN_XA_",
            "from_name": "type",
            "to_name": "image",
            "type": "labels",
            "origin": "manual"
          },
          {
            "original_width": 1600,
            "original_height": 900,
            "image_rotation": 0,
            "value": {
              "x": 53.9886934673367,
              "y": 21.608040201005,
              "width": 31.3756281407035,
              "height": 23.4505862646566,
              "rotation": 0
            },
            "id": "IvfCkIbfKZ",
            "from_name": "rect",
            "to_name": "image",
            "type": "rectangle",
            "origin": "manual"
          },
          {
            "original_width": 1600,
            "original_height": 900,
            "image_rotation": 0,
            "value": {
              "x": 53.9886934673367,
              "y": 21.608040201005,
              "width": 31.3756281407035,
              "height": 23.4505862646566,
              "rotation": 0,
              "labels": [
                "air-conditioner"
              ]
            },
            "id": "IvfCkIbfKZ",
            "from_name": "type",
            "to_name": "image",
            "type": "labels",
            "origin": "manual"
          },
          {
            "value": {
              "choices": [
                "floor1"
              ]
            },
            "id": "0M1Bg1LgCg",
            "from_name": "air-conditioner-type",
            "to_name": "image",
            "type": "choices",
            "origin": "manual"
          },
          {
            "value": {
              "choices": [
                "equal"
              ]
            },
            "id": "1rbWIjMbpR",
            "from_name": "air-conditioner-status",
            "to_name": "image",
            "type": "choices",
            "origin": "manual"
          }
        ],
        "was_cancelled": false,
        "ground_truth": false,
        "created_at": "2024-10-27T07:08:20.384519Z",
        "updated_at": "2024-10-27T07:08:35.372961Z",
        "draft_created_at": "2024-10-27T07:08:14.239905Z",
        "lead_time": 24.211,
        "prediction": {

        },
        "result_count": 0,
        "unique_id": "b19908b8-8029-4498-87ce-960669d5571a",
        "import_id": null,
        "last_action": null,
        "task": 31,
        "project": 3,
        "updated_by": 1,
        "parent_prediction": null,
        "parent_annotation": null,
        "last_created_by": null
      }
    ],
    "drafts": [],
    "predictions": [],
    "data": {
      "url": "http://127.0.0.1:9000/label/image1027/cjy10_20240512_826.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=bPPKcyDb6oxhKobrSIeG%2F20241027%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241027T070746Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=3088bba7920c4303df41bf0a9a6bb9e2e0d7d28eddce0c83239504977d3bc915",
      "bucket_name": "label",
      "name": "image1027/cjy10_20240512_826.jpeg",
      "my_task_item_id": 76,
      "create_time": 1730012866546
    },
    "meta": {

    },
    "created_at": "2024-10-27T07:07:46.657107Z",
    "updated_at": "2024-10-27T07:08:36.639772Z",
    "inner_id": 1,
    "total_annotations": 1,
    "cancelled_annotations": 0,
    "total_predictions": 0,
    "comment_count": 0,
    "unresolved_comment_count": 0,
    "last_comment_updated_at": null,
    "project": 3,
    "updated_by": 1,
    "comment_authors": []
  }
]

六 webhook

image.png
通过添加webhook, 设置action 使label studio 可以向第三方平台发送消息, 即可更新标注信息。

参考文章

label studio
label studio API文档
希望这边文章对您有所帮助!


吴季分
350 声望12 粉丝