我竟然還是從草稿夾中把這篇給翻出來填坑…。上次搞這個都是一年前了,但最近又被重新 assign 了這個 project,也只能重新去把記憶給找回來了。嘖…要回想一年多前做了什麼事情真是難倒我了==
上次看的時候時候版本還是 1.0,現在都 1.6 啦…不過筆記應該沒有差多少?應該…
Label Studio(圖片來源: GitHub)
Overview
故事的開始好像是從 CVAT 開始,它是套是開源的影像標注工具,功能雖然完善但主要專注於影像方面,界面也稍嫌複雜。如果要標注文本或是 NLP 就需要另尋它法…雖然我拿 excel 也能標啦 XDDD
在找標注工具時,大概考慮了幾個點:
- 開源:
大概是因為老闆不想多付錢 XDDD - 友好界面,有 UI 支援更加:都得標文字資料,再不來點 UI 洗洗眼睛,應該很快就膩了。
- 協作功能:相信我不會想要一個人標完整個資料集。
- 管理機制:主要是看訪控權限跟 project 管理機制,免得有天兵砍我資料(也不是沒發生過==。
我是有看到一套我還滿喜歡的 Prodigy,不過它看起來只能標注文本,重點是它不是開源的。Survey 到最後上位的就是 Label Studio 啦~!
What is Label Studio?(圖片來源: Label Studio 官網)
忽然意識到他們有換配色耶,尾巴的顏色也不太一樣了…不過好像舊版的顏色比較合我胃口?
Labeling Workflow
開始看 Label Studio 之前,先看下標注流程,因為無論是要進行人工標注(Human Labeling)或是半監督學習(Semi-supervised Labeling),第一步都是資料標注。
其中人機協作是常見的資料標注流程:
- 資料收集:
通過爬蟲、程式或者其它工具,將資料保存到資料庫中。 - 資料前處理/資料標注:
因為收集回來的資料多是雜亂無章的,若要標注、甚至進行訓練前,都必需先將資料進行清洗。清洗完的資料可以直接用於無監督學習(Unsupervised Labeling)做預訓練模型,也可以將整理後的資料進行標注,變成有標籤資料。
標注的方式與目標,會依照訓練目的而有所不同。例如對於文本的標注有:文本分類、命名實體識別、文本摘要…等;對於音訊可以做講者分類、情緒識別或轉錄…等;對於圖片則可能有圖像分類、物件檢測、語義分割…等。
是說,如果是多人協作標注資料,最好在開始前確定標注原則…至少…確定要使用的標籤,別出現一人標貓、一人標 cat。 - 模型訓練:
有了標注完成的資料後,即可將資料導入,從無到有進行訓練;或者選擇在該領域或是其他領域的模型進行 Fine-Tune 或遷移學習(Transfer Learning)。 - 模型評估:
當訓練完成後,使用測試集或是新收集的資料進行檢驗,若是訓練結果無法有良好的表現,可能需要調整參數重新訓練。 - 重新訓練 or 模型部署:
不斷重複前 1~4 步,以優化模型和資料,提高模型性能。一旦取得合乎預期的表現後,就可將模型進一步部署在設備端或伺服器上。Usually Labeling Workflow(圖片來源: Towards Data Science)
What is Label Studio?
通常完成上述的步驟需耗時數週到數月的時間,所以 Heartex 的首席技術官希望能整合相關功能到自動化的平台,從而減少技術團隊的產品、機器學習的開發、實驗時間學習生命週期。
Heartex 就是推出 Label Studio 的公司,而 Label Studio 是一套開源的標注工具,它可應用範圍很廣,包含圖片、音訊、文字、影片…等格式的資料。此外它還提供簡明 UI 可快速配置多種資料,能在 10 分鐘內準備好工具,用以標注文本、音訊或圖像…等資料格式。
它另外一個宣傳點則是可將 Label Studio 與機器學習模型進行集成。機器學習可以用來協助標注,以提供標籤預測(預標籤),並可執行持續的主動學習。
不過有些我希望的功能,例如:訪控權限,並不是在開源版本中,不過我這還能接受 XDDD
Usually Labeling Workflow(圖片來源: Towards Data Science)
Components and Architecture
根據 Label Studio 的軟體架構圖,系統可以大致分成:Frontend、Backend、Task、ML Backend 4 個部份:
Label Studio Architecture(圖片來源: Label Studio Documentation)
顧名思義,各元件負責前端、執行標注、標籤資料與任務管理、以及串接 ML Backend 的部份。各個元件基本都有提供 Source Code,方便開發者自行客製化。
從表中也可以看到各元件的實做方法中,其中大概除了 MST 我可能找不到替罪同事外,其他應該都可以?而且授權看來都是 Apache 2.0 LICENSE,所以可以放心改 XDDD
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.(圖片來源: GitHub)
這專案可讓使用者輕鬆探索資料集,可以選擇如何查看與顯示的資料,如:網格和列表視圖…等。當然這個專案必須跟前端集成,因為 DataManager 使用 LabelStudio API 進行操作。
LabelStudio API Workflow(圖片來源: dm2|GitHub)
Machine Learning Backends
Machine Learning Backends 是一個 SDK,可讓使用者封裝機器學習程式碼並將其變成換為 Web 服務器。最後將該服務器連接到 Label Studio Instance 以執行 2 個任務:
- 基於模型推理結果動態預標注資料
- 根據最近注釋的資料重新訓練或微調模型
Label Studio Enterprise Edition
官網是建議,在客製化之前先參考下 Label Studio Enterprise Edition 咩,有了它就可以不用自己造輪子了呦~!不過我沒研究過他的收費標準,有考慮的可能得查一下。
Label Studio Features(圖片來源: Label Studio Documentation)
是說…那個訪控權限跟標注 review 的功能,看起來就很棒!
Data Type
它們能支援的格式或說標注動作還不少,以資料類型來說大致包含了 Images、 Audio、 Text、 Time Series、 Multi-Domain、 Video:
- Images
- 支援圖片分類、物體檢測、語義分割。
- Audio
- 支援音源分類、講者分類、情緒識別、轉錄。
- Text
- 支援文檔分類、NER、問答、情緒分析。
- Time Series
- 支援時間序列分類、分割、事件識別。
- Multi-Domain
- 支援對話處理(呼叫中心錄音可以同時轉錄和處理為文本)、OCR、將影像或音檔分割時間序列數。
- Video
- 支援影像分類、物件追蹤、輔助標記。
Label every data type.(圖片來源: Label Studio)
各資料所能接受的資料格式如下,不過我好像沒看到 video 的資料格式?是還沒更新上去嗎(video 是 1.6 版新增的)?
Types of data you can import(圖片來源: Label Studio Documentation)
Pros and Cons
稍微玩了下這套工具,簡單列些優缺點。不過在開始前先看看官方給的優點:
-
簡單:
沒有複雜的配置,並且易於集成到機器學習管道中。 -
可針對多種資料類型快速配置:
可在 10 分鐘內準備好工具,以在標記文本、音源與圖像之間切換。甚至可以同時標注三種類型,不過這種複合式的用法得自製 template 才可用。同時標注三種類型
-
機器學習集成
它能與所有眾多的機器學習框架和模型集成。ML 有許多不同的約束條件應用程序,Label Studio 必須足夠靈活以處理它們並提供幫助,而不是使其複雜化。
玩完後,它確實可以稱得上它所宣稱的優點:
- 界面相對漂亮
這套算是我玩過工具中,界面比較漂亮的。 - 部署方便
它提供了 2~3 種的部署方式,且每種方式的部署也都還滿簡單的。 - 配置方便,且有多種內置模板與支持多種資料類型
這前面說過了,就不再提了。 - 機器學習集成
可以串接訓練好的推論服務,達到輔助標注的目的。
至於缺點的部份,除了權限機制跟 plug-in 的部份(好吧,這其實也不太算是缺點,是閹割的結果)外,我覺得比較麻煩的是的是它的錯誤訊息難以閱讀,這蟲要抓會很麻煩 XDDD
Label Studio 界面(圖片來源: Label Studio Documentation)
Quick start
OK,來試著安裝它吧!先貼傳送門,等等應該用的上:
System requirements
安裝前先確定下安裝環境,主要是儲存空間的部份,特別是如果是要作為 production 那空間需要特別注意:
- 軟體要求
- Python 3.6 +(不過我覺得應該要 Python 3.7 + 才對?)
- Linux、Windows or MacOSX
- PostgreSQL 11.5 版 or SQLite 3.35 +
- 空間
- 使用 SQLite 資料庫時,100 萬筆的標注任務佔用大約 2.3GB 的硬碟空間。若是要作為 production,建議使用 50GB 的硬碟空間。
- 至於記憶體的部份至少使用 8GB RAM,但建議使用 16GB RAM。
Install Label Studio & Start Label Studio
他的安裝方式有 4 種,可以依照需要的方式來安裝:
-
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
6DJANGO_DB=default POSTGRE_NAME=postgres POSTGRE_USER=postgres POSTGRE_PASSWORD= POSTGRE_PORT=5432 POSTGRE_HOST=db
另外,還有個參數我覺得應該也能派上用場:
LABEL_STUDIO_BASE_DATA_DIR
/--data-dir
,前者用在環境變數、後者用在命令列,不過目的是一樣,從文件中看來這個值應該可以讓每次啟動都讀到相同的資料庫…不然每次啟動都要重標資料?怎麼可能啦 XDDD - 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_DATABASE
、LABEL_STUDIO_BASE_DATA_DIR
這兩個環境變數使用。不過我這次在玩 1.6 時候會遇到,一連串
OpenBLAS blas_thread_init
的 error: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
(艹皿艹 ) -
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
-
Source Code
這邊通常用有需要改動程式碼的時候會用到。例如若要更改前端,可以進入修改frontend/
文件夾,不過改完後後,記得重 build:1
2
3
4
5cd label_studio/frontend/ npm ci npx webpack cd ../.. python label_studio/manage.py collectstatic --no-input
是說,如果文件建議改這份前端的話,所以前端是以這份為主?
改完後有兩種用法:
- 直接運行:
1
2
3
4
5
6
7
8git 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
- 包成 Docker image:
因為我要部署上伺服器,所以我傾向會把它包成 image。在 source code 中有現成的 dockerfile,所以可以直接 build 了,不過需要注意的是,跟 Docker 一樣 Docker Engine 太低會 build 不起來,不然你會發現它 apt update 會一直 fail。
- 直接運行:
啟動完成後就可以看倒吊的…老鼠(!?)
Label Studio 界面(圖片來源: Label Studio Documentation)
喔,查了一下原來牠是負鼠(opossums),而且人家是女孩子,名叫海蒂(Heidi)XDDD
Hi, Heidi(圖片來源: Label Studio)
Labeling workflow
安裝完成並啟動 Label Studio 後,就可以開始嘗試標注:
Step1: Create accounts for Label Studio.
開始前須先註冊並建立一個帳戶,以開始標記資料和設置專案。目前有兩種方式可以註冊:
-
UI
就會看到剛剛那隻爬爬走的負鼠,在頁面中有一個 sing up 的選項。 -
terminal
另一種是在啟動 Label Studio 時在指令順便建立一個帳號:1
1
$ label-studio start --username <username> --password <password> [--user-token <token-at-least-5-chars>]
如果是用 docker 則是加上
LABEL_STUDIO_USERNAME
與LABEL_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.
- Set up your labeling project
- Set up your labeling interface
- Get data into Label Studio
- Label and annotate data
先針對要標記的資料,定義標記類型並配置專案設置:
- 建立專案:
- 導入資料以進行標注任務:
從文件看來資料來源可以是:雲端儲存體,如:Amazon S3、 Google Cloud Storage、 Microsoft Azure Blob storage…等, Redis database、 URL 與 Local storage。
其中從 Local 端上傳資料是比較簡單的做法:
- labeling interface
上傳完資料後,就可以開始配置標注模板,制定模板的方式有兩種。一是使用現成的模板,能選擇的方式還頗多,基本上就是參考 Data Type 的支援。
因為我手邊的是貓狗資料集,所以我這邊選擇影像分類:
另一種起相同標注模板的方式是使用 Template 撰寫:
如果現有的標注模板不符合使用需求,可以自定義符合需求的 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>
同時標注三種類型
- Label and annotate the data.
設定完後就可以嚕貓了 XDDD順便試試物件偵測:
跟車牌標注:
- 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
或是指令。
我這邊使用指令方式安裝:
- 首先先 Clone the repo
1
$ git clone https://github.com/heartexlabs/label-studio-ml-backend
- 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
- 根據範例腳本初始化 ML 後端。
1
$ label-studio-ml init my_ml_backend --script label_studio_ml/examples/simple_text_classifier.py
此 ML 後端是 Label Studio 提供的 example。
- Start ML 後端 server
1
$ label-studio-ml start my_ml_backend
- 最後啟動 Label Studio 後,前往在專案設置頁面的機器學習部分,添加指向
http://localhost:9090
機器學習模型後端的連結。
Demo 畫面
最後附上幾張看起來超級酷的 demo 畫面。
題外話
是說…我真的覺得綠色那隻比較好看欸?你們覺得呢?
海蒂小姐真的還滿可愛的 XDDD
參考資料
- secsilm (2020-11-10)。试用开源标注平台 Label Studio_Alan Lee。檢自 CSDN博客 (2021-08-04)。
- 協同撰寫 (2021-07-28)。heartexlabs/label-studio。檢自 GitHub (2021-08-04)。
- Nikolai Liubimov (2020-01-28)。Introducing Label Studio, a swiss army knife of data labeling。檢自 Towards Data Science (2021-08-04)。
- Johnson7788 (2020-12-28)。安利一个开源的好工具Label Studio, 闭环数据标注和模型训练。檢自 知乎 (2021-08-04)。
- Components and Architecture。檢自 Label Studio Documentation (2022-12-09)。
- 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 起稿