Survey|Label Studio

我竟然還是從草稿夾中把這篇給翻出來填坑…。上次搞這個都是一年前了,但最近又被重新 assign 了這個 project,也只能重新去把記憶給找回來了。嘖…要回想一年多前做了什麼事情真是難倒我了==

上次看的時候時候版本還是 1.0,現在都 1.6 啦…不過筆記應該沒有差多少?應該…

Label Studio Label Studio(圖片來源: GitHub

Overview

故事的開始好像是從 CVAT 開始,它是套是開源的影像標注工具,功能雖然完善但主要專注於影像方面,界面也稍嫌複雜。如果要標注文本或是 NLP 就需要另尋它法…雖然我拿 excel 也能標啦 XDDD

在找標注工具時,大概考慮了幾個點:

  1. 開源大概是因為老闆不想多付錢 XDDD
  2. 友好界面,有 UI 支援更加:都得標文字資料,再不來點 UI 洗洗眼睛,應該很快就膩了。
  3. 協作功能:相信我不會想要一個人標完整個資料集。
  4. 管理機制:主要是看訪控權限跟 project 管理機制,免得有天兵砍我資料(也不是沒發生過==。

我是有看到一套我還滿喜歡的 Prodigy,不過它看起來只能標注文本,重點是它不是開源的。Survey 到最後上位的就是 Label Studio 啦~!

What is Label Studio? What is Label Studio?(圖片來源: Label Studio 官網

忽然意識到他們有換配色耶,尾巴的顏色也不太一樣了…不過好像舊版的顏色比較合我胃口?

Labeling Workflow

開始看 Label Studio 之前,先看下標注流程,因為無論是要進行人工標注(Human Labeling)或是半監督學習(Semi-supervised Labeling),第一步都是資料標注。

其中人機協作是常見的資料標注流程:

  1. 資料收集
    通過爬蟲、程式或者其它工具,將資料保存到資料庫中。
  2. 資料前處理/資料標注
    因為收集回來的資料多是雜亂無章的,若要標注、甚至進行訓練前,都必需先將資料進行清洗。清洗完的資料可以直接用於無監督學習(Unsupervised Labeling)做預訓練模型,也可以將整理後的資料進行標注,變成有標籤資料。

    標注的方式與目標,會依照訓練目的而有所不同。例如對於文本的標注有:文本分類、命名實體識別、文本摘要…等;對於音訊可以做講者分類、情緒識別或轉錄…等;對於圖片則可能有圖像分類、物件檢測、語義分割…等。

    是說,如果是多人協作標注資料,最好在開始前確定標注原則…至少…確定要使用的標籤,別出現一人標貓、一人標 cat。
  3. 模型訓練
    有了標注完成的資料後,即可將資料導入,從無到有進行訓練;或者選擇在該領域或是其他領域的模型進行 Fine-Tune 或遷移學習(Transfer Learning)。
  4. 模型評估
    當訓練完成後,使用測試集或是新收集的資料進行檢驗,若是訓練結果無法有良好的表現,可能需要調整參數重新訓練。
  5. 重新訓練 or 模型部署
    不斷重複前 1~4 步,以優化模型和資料,提高模型性能。一旦取得合乎預期的表現後,就可將模型進一步部署在設備端或伺服器上。

    Usually Labeling Workflow Usually Labeling Workflow(圖片來源: Towards Data Science

What is Label Studio?

通常完成上述的步驟需耗時數週到數月的時間,所以 Heartex 的首席技術官希望能整合相關功能到自動化的平台,從而減少技術團隊的產品、機器學習的開發、實驗時間學習生命週期。


Heartex 就是推出 Label Studio 的公司,而 Label Studio 是一套開源的標注工具,它可應用範圍很廣,包含圖片、音訊、文字、影片…等格式的資料。此外它還提供簡明 UI 可快速配置多種資料,能在 10 分鐘內準備好工具,用以標注文本、音訊或圖像…等資料格式。

它另外一個宣傳點則是可將 Label Studio 與機器學習模型進行集成。機器學習可以用來協助標注,以提供標籤預測(預標籤),並可執行持續的主動學習。

不過有些我希望的功能,例如:訪控權限,並不是在開源版本中,不過我這還能接受 XDDD

Usually Labeling Workflow Usually Labeling Workflow(圖片來源: Towards Data Science

Components and Architecture

根據 Label Studio 的軟體架構圖,系統可以大致分成:FrontendBackendTaskML Backend 4 個部份:

Label Studio Architecture Label Studio Architecture(圖片來源: Label Studio Documentation

顧名思義,各元件負責前端、執行標注、標籤資料與任務管理、以及串接 ML Backend 的部份。各個元件基本都有提供 Source Code,方便開發者自行客製化。

從表中也可以看到各元件的實做方法中,其中大概除了 MST 我可能找不到替罪同事外,其他應該都可以?而且授權看來都是 Apache 2.0 LICENSE,所以可以放心改 XDDD

Label Studio Components Label Studio Components(圖片來源: Label Studio Documentation

Label Studio Backend

基本上,Backend 是它主體了 XDDD 在這份 Source Code 中,你可以找到 frontend 跟 data_manager。安裝所用的 docker 與 docker-compose 都出自於這一份。

Label Studio Frontend

A 混在 Backend 的 project 內,安裝 Backend 時會順便起起來,如果要直接起則是 B。但目前從 commit 看來兩邊專案似乎不齊頭?

這個專案所使用到的技術,就是我們在上表看到的 React 跟 MST(mobx-state-tree)。

Data Manager

Data exploration tool for Label Studio. Data exploration tool for Label Studio.(圖片來源: GitHub

這專案可讓使用者輕鬆探索資料集,可以選擇如何查看與顯示的資料,如:網格和列表視圖…等。當然這個專案必須跟前端集成,因為 DataManager 使用 LabelStudio API 進行操作。

LabelStudio API Workflow LabelStudio API Workflow(圖片來源: dm2|GitHub

Machine Learning Backends

Machine Learning Backends 是一個 SDK,可讓使用者封裝機器學習程式碼並將其變成換為 Web 服務器。最後將該服務器連接到 Label Studio Instance 以執行 2 個任務:

  1. 基於模型推理結果動態預標注資料
  2. 根據最近注釋的資料重新訓練或微調模型

Label Studio Enterprise Edition

官網是建議,在客製化之前先參考下 Label Studio Enterprise Edition 咩,有了它就可以不用自己造輪子了呦~!不過我沒研究過他的收費標準,有考慮的可能得查一下。

Label Studio Features Label Studio Features(圖片來源: Label Studio Documentation

是說…那個訪控權限跟標注 review 的功能,看起來就很棒!

Data Type

它們能支援的格式或說標注動作還不少,以資料類型來說大致包含了 Images、 Audio、 Text、 Time Series、 Multi-Domain、 Video

  1. Images
    • 支援圖片分類、物體檢測、語義分割。
  2. Audio
    • 支援音源分類、講者分類、情緒識別、轉錄。
  3. Text
    • 支援文檔分類、NER、問答、情緒分析。
  4. Time Series
    • 支援時間序列分類、分割、事件識別。
  5. Multi-Domain
    • 支援對話處理(呼叫中心錄音可以同時轉錄和處理為文本)、OCR、將影像或音檔分割時間序列數。
  6. Video
    • 支援影像分類、物件追蹤、輔助標記。

Label every data type. Label every data type.(圖片來源: Label Studio

各資料所能接受的資料格式如下,不過我好像沒看到 video 的資料格式?是還沒更新上去嗎(video 是 1.6 版新增的)?

Types of data you can import Types of data you can import(圖片來源: Label Studio Documentation

Pros and Cons

稍微玩了下這套工具,簡單列些優缺點。不過在開始前先看看官方給的優點:

  1. 簡單
    沒有複雜的配置,並且易於集成到機器學習管道中。

  2. 可針對多種資料類型快速配置
    可在 10 分鐘內準備好工具,以在標記文本、音源與圖像之間切換。甚至可以同時標注三種類型,不過這種複合式的用法得自製 template 才可用。

    同時標注三種類型 同時標注三種類型

  3. 機器學習集成
    它能與所有眾多的機器學習框架和模型集成。ML 有許多不同的約束條件應用程序,Label Studio 必須足夠靈活以處理它們並提供幫助,而不是使其複雜化。


玩完後,它確實可以稱得上它所宣稱的優點:

  1. 界面相對漂亮
    這套算是我玩過工具中,界面比較漂亮的。
  2. 部署方便
    它提供了 2~3 種的部署方式,且每種方式的部署也都還滿簡單的。
  3. 配置方便,且有多種內置模板與支持多種資料類型
    這前面說過了,就不再提了。
  4. 機器學習集成
    可以串接訓練好的推論服務,達到輔助標注的目的。

至於缺點的部份,除了權限機制跟 plug-in 的部份(好吧,這其實也不太算是缺點,是閹割的結果)外,我覺得比較麻煩的是的是它的錯誤訊息難以閱讀,這蟲要抓會很麻煩 XDDD

Label Studio 界面 Label Studio 界面(圖片來源: Label Studio Documentation

Quick start

OK,來試著安裝它吧!先貼傳送門,等等應該用的上:

System requirements

安裝前先確定下安裝環境,主要是儲存空間的部份,特別是如果是要作為 production 那空間需要特別注意:

  1. 軟體要求
    • Python 3.6 +(不過我覺得應該要 Python 3.7 + 才對?)
    • Linux、Windows or MacOSX
    • PostgreSQL 11.5 版 or SQLite 3.35 +
  2. 空間
    • 使用 SQLite 資料庫時,100 萬筆的標注任務佔用大約 2.3GB 的硬碟空間。若是要作為 production,建議使用 50GB 的硬碟空間。
    • 至於記憶體的部份至少使用 8GB RAM,但建議使用 16GB RAM

Install Label Studio & Start Label Studio

他的安裝方式有 4 種,可以依照需要的方式來安裝:

  1. pip
    這大概是最簡單的安裝方式,不過需要注意下 Python 版本,文件中有說需要 Python 3.7 + 的版本:

    1
    2
     $ pip install -U label-studio
     $ label-studio
    


    啟動時,默認 Web 瀏覽器會在 http://localhost:8080。 這個方式在啟動時是資料庫是使用 SQLite,如果要用 PostgreSQL 可以在啟動時設定:

    1
     $ label-studio start my_project --init -db postgresql
    

    不過還需要設定點環境變數:

    1
    2
    3
    4
    5
    6
     DJANGO_DB=default
     POSTGRE_NAME=postgres
     POSTGRE_USER=postgres
     POSTGRE_PASSWORD=
     POSTGRE_PORT=5432
     POSTGRE_HOST=db
    


    另外,還有個參數我覺得應該也能派上用場: LABEL_STUDIO_BASE_DATA_DIR / --data-dir,前者用在環境變數、後者用在命令列,不過目的是一樣,從文件中看來這個值應該可以讓每次啟動都讀到相同的資料庫…不然每次啟動都要重標資料?怎麼可能啦 XDDD

  2. Docker
    這個大概是我比較常用的方法:
    1
     $ docker run -it -p 8080:8080 -v `pwd`/mydata:/label-studio/data heartexlabs/label-studio:latest
    

    在 mount 進去的 mydata 資料夾後,會看到存放資料的資料夾 media 跟與標籤存放的 label_studio.sqlite3。若要換成 PostgreSQL 或是指定資料庫的話可以用 -e 的參數搭配 LABEL_STUDIO_DATABASELABEL_STUDIO_BASE_DATA_DIR 這兩個環境變數使用。


    不過我這次在玩 1.6 時候會遇到,一連串 OpenBLAS blas_thread_init 的 error:

    Label Studio 界面 Label Studio 界面(圖片來源: Label Studio Documentation

    對於這個我有點莫名奇妙,想想看當你上一秒用 1.0 跑得很愉快的時候,下一秒發現有更新,就順手換到 1.6 版,然後就 GG 了…你能想像這有多崩潰阿 XDDD

    而且最悲劇的是,我在 Label Studio Documentation 找不到相關的訊息,還好最後 git 的 docs 有找到,謝天謝地!

    簡而言之,就是 Docker Engine 的版本太低了,文件中要求 Docker Engine 需要 >= 20.10.12。不過我實驗用的環境是 Ubuntu 16.04,Docker Engine 升不上 20.10.12 (艹皿艹 )

  3. Docker Compose
    是說如果真要部署 production ,應該用 Docker Compose 比較適合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ git clone https://github.com/heartexlabs/label-studio.git
    $ cd label-studio
    $ docker-compose up -d
    Creating network "label-studio_default" with the default driver
    Creating volume "label-studio_static" with default driver
    ...
    Creating label-studio_db_1 ... done 
    Creating label-studio_app_1 ... done
    Creating label-studio_nginx_1 ... done
    

    完成後可以看到有 3 容器被啟動:

    • Label Studio:就是本體阿。
    • Nginx:proxy web server 是用於加載各種靜態資料,包括上傳的音檔、圖像…等。
    • PostgreSQL:這邊是用於替代性能較低的 SQLite3。

    各容器的詳細設定就直接看看 docker-compose.yml 吧。

    1
    2
    3
    4
    5
    $ docker ps
    CONTAINER ID        IMAGE                                         COMMAND                  CREATED              STATUS              PORTS                    NAMES
    fdd6ea6bb8b8        nginx:latest                                  "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp     label-studio_nginx_1
    de66bb2f5bfc        heartexlabs/label-studio:latest               "./deploy/docker-ent…"   About a minute ago   Up About a minute   8080/tcp                 label-studio_app_1
    b4108f4d947f        postgres:11.5                                 "docker-entrypoint.s…"   About a minute ago   Up About a minute   5432/tcp                 label-studio_db_1
    
  4. Source Code
    這邊通常用有需要改動程式碼的時候會用到。例如若要更改前端,可以進入修改 frontend/ 文件夾,不過改完後後,記得重 build:

    1
    2
    3
    4
    5
    cd label_studio/frontend/
    npm ci
    npx webpack
    cd ../..
    python label_studio/manage.py collectstatic --no-input
    

    是說,如果文件建議改這份前端的話,所以前端是以這份為主?


    改完後有兩種用法:

    1. 直接運行
      1
      2
      3
      4
      5
      6
      7
      8
       git clone https://github.com/heartexlabs/label-studio.git
       cd label-studio
       # Install all package dependencies
       pip install -e .
       # Run database migrations
       python label_studio/manage.py migrate
       # Start the server in development mode at http://localhost:8080
       python label_studio/manage.py runserver
      
    2. 包成 Docker image
      因為我要部署上伺服器,所以我傾向會把它包成 image。在 source code 中有現成的 dockerfile,所以可以直接 build 了,不過需要注意的是,跟 Docker 一樣 Docker Engine 太低會 build 不起來,不然你會發現它 apt update 會一直 fail


啟動完成後就可以看倒吊的…老鼠(!?)

Label Studio 界面 Label Studio 界面(圖片來源: Label Studio Documentation


喔,查了一下原來牠是負鼠(opossums),而且人家是女孩子,名叫海蒂(Heidi)XDDD

Hi, Heidi Hi, Heidi(圖片來源: Label Studio

Labeling workflow

安裝完成並啟動 Label Studio 後,就可以開始嘗試標注:

Step1: Create accounts for Label Studio.

開始前須先註冊並建立一個帳戶,以開始標記資料和設置專案。目前有兩種方式可以註冊:

  1. UI
    就會看到剛剛那隻爬爬走的負鼠,在頁面中有一個 sing up 的選項。

  2. terminal
    另一種是在啟動 Label Studio 時在指令順便建立一個帳號:

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

    如果是用 docker 則是加上 LABEL_STUDIO_USERNAMELABEL_STUDIO_PASSWORD 兩個環境變數:

    1
     $ docker run -it -p 8080:8080 -v `pwd`/mydata:/label-studio/data -e LABEL_STUDIO_USERNAME=<my-email>  -e LABEL_STUDIO_PASSWORD=<my-password> heartexlabs/label-studio:latest
    


    如果要禁用註冊頁面,讓僅有人使用邀請鏈接人使用,在啟動 Label Studio 前加上環境變數:

    1
     $ export LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK=true
    

    再用指令啟動並建立一個基礎帳戶,以用於登入 Label Studio:

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

    或是直接在 docker 啟動指令上加上環境變數:

    1
     $ docker run -it -p 8080:8080 -v `pwd`/mydata:/label-studio/data -e LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK=true -e LABEL_STUDIO_USERNAME=<my-email>  -e LABEL_STUDIO_PASSWORD=<my-password> heartexlabs/label-studio:latest
    

    登入 Label Studio 後,再邀請協作者。

Step2: Set up the labeling project/Set up the labeling interface.

先針對要標記的資料,定義標記類型並配置專案設置:

  1. 建立專案:

    建立專案

  2. 導入資料以進行標注任務:

    從文件看來資料來源可以是:雲端儲存體,如:Amazon S3、 Google Cloud Storage、 Microsoft Azure Blob storage…等, Redis databaseURLLocal storage

    其中從 Local 端上傳資料是比較簡單的做法:

    從 Local 端上傳資料 從 Local 端上傳資料

  3. labeling interface

    上傳完資料後,就可以開始配置標注模板,制定模板的方式有兩種。一是使用現成的模板,能選擇的方式還頗多,基本上就是參考 Data Type 的支援。

    因為我手邊的是貓狗資料集,所以我這邊選擇影像分類:

    labeling interface

    labeling interface


    另一種起相同標注模板的方式是使用 Template 撰寫:

    labeling interface

    labeling interface


    如果現有的標注模板不符合使用需求,可以自定義符合需求的 template,像是之前提過的標注三種類型的 template:

    自定義 template:
     <View>
     <!-- Image with Polygons -->
     <View style="padding: 25px;
                 box-shadow: 2px 2px 8px #AAA">
     <Header value="Label the image with polygons"/>
     <Image name="img" value="$image"/>
     <Text name="text1"
             value="Select label, start to click on image"/>
    
     <PolygonLabels name="tag" toName="img">
         <Label value="Airbus" background="blue"/>
         <Label value="Boeing" background="red"/>
     </PolygonLabels>
     </View>
     <!-- Text with multi-choices -->
     <View style="margin-top: 20px; padding: 25px;
                 box-shadow: 2px 2px 8px #AAA;">
     <Header value="Classify the text"/>
     <Text name="text2" value="$text"/>
     <Choices name="choices1" toName="img" choice="multiple">
         <Choice alias="wisdom" value="Wisdom"/>
         <Choice alias="long" value="Long"/>
     </Choices>
     </View>
    
     <View style="margin-top: 20px; padding: 25px;
                 box-shadow: 2px 2px 8px #AAA;">
     <Header value="Named entity"/>
     <Labels name="label" toName="text">
         <Label value="Person" background="red"/>
         <Label value="Organization" background="darkorange"/>
         <Label value="Fact" background="orange"/>
         <Label value="Money" background="green"/>
         <Label value="Date" background="darkblue"/>
         <Label value="Time" background="blue"/>
         <Label value="Ordinal" background="purple"/>
         <Label value="Percent" background="#842"/>
         <Label value="Product" background="#428"/>
         <Label value="Language" background="#482"/>
         <Label value="Location" background="rgba(0,0,0,0.8)"/>
     </Labels>
    
     <Text name="text" value="$text"/>
     </View>
     </View>
     

    同時標注三種類型 同時標注三種類型

  4. Label and annotate the data.
    設定完後就可以嚕貓了 XDDD

    貓狗影像分類


    順便試試物件偵測:

    物件偵測


    跟車牌標注:

    貓狗影像分類

  5. Export the labeled data or the annotations

    因為只有企業版本才能從 UI 會出標注結果,所以我們只能用指令來匯出:

    1
    $label-studio export <project-id> <export-format> --path=<output-path>
    

Machine Learning Backends

這邊試著設置 ML Backends。文件中提供了兩種安裝方法:docker-compose 或是指令。

我這邊使用指令方式安裝:

  1. 首先先 Clone the repo
    1
     $ git clone https://github.com/heartexlabs/label-studio-ml-backend  
    
  2. Setup environment。建議使用venv,不過我在 label studio 的容器內執行,所以我就沒管它了。
    1
    2
    3
     $ cd label-studio-ml-backend
     $ pip install -U -e .
     $ pip install -r label_studio_ml/examples/requirements.txt
    
  3. 根據範例腳本初始化 ML 後端。
    1
     $ label-studio-ml init my_ml_backend --script label_studio_ml/examples/simple_text_classifier.py
    

    此 ML 後端是 Label Studio 提供的 example

  4. Start ML 後端 server
    1
     $ label-studio-ml start my_ml_backend
    
  5. 最後啟動 Label Studio 後,前往在專案設置頁面的機器學習部分,添加指向 http://localhost:9090 機器學習模型後端的連結。

    連接 ML 後端

Demo 畫面

最後附上幾張看起來超級酷的 demo 畫面。

Demo1

Demo1

Demo1

Demo1

題外話

是說…我真的覺得綠色那隻比較好看欸?你們覺得呢?

題外話


海蒂小姐真的還滿可愛的 XDDD

題外話

參考資料

  1. secsilm (2020-11-10)。试用开源标注平台 Label Studio_Alan Lee。檢自 CSDN博客 (2021-08-04)。
  2. 協同撰寫 (2021-07-28)。heartexlabs/label-studio。檢自 GitHub (2021-08-04)。
  3. Nikolai Liubimov (2020-01-28)。Introducing Label Studio, a swiss army knife of data labeling。檢自 Towards Data Science (2021-08-04)。
  4. Johnson7788 (2020-12-28)。安利一个开源的好工具Label Studio, 闭环数据标注和模型训练。檢自 知乎 (2021-08-04)。
  5. Components and Architecture。檢自 Label Studio Documentation (2022-12-09)。
  6. Label Studio features。檢自 Label Studio Documentation (2022-12-09)。

更新紀錄

最後更新日期:2023-12-20
  • 2023-12-20 更新:更新 API Workflow 圖片來源。
  • 2023-02-16 發布
  • 2022-12-14 完稿
  • 2021-08-04 起稿