label studio

吴季分發表於2024-10-27

一 前言

本文將針對以下幾個問題講述關於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文件
希望這邊文章對您有所幫助!

相關文章