リモート開発メインのソフトウェア開発企業のエンジニアブログです

Label Studio で教師データ作成

機械学習にとってはデータが重要です。本記事では、機械学習の教師データを作成するときに使える Label Studio というオープンソースのツールについて紹介します。

最初に、Label Studio 自体の説明を、その後、具体例としてテキストの分類をやってみます。

Label Studio とは

Swiss army knife?

GitHub の README(以下のリンク)によれば、「Label Studio は、データのラベリング・アノテーションのためのスイス製アーミーナイフ」(適当な訳)だそうです。要は、データのラベル・アノテーションタスクに使える万能ツールだそうです。

heartexlabs/label-studio: Label Studio is a multi-type data labeling and annotation tool with standardized output format

以下の英文ブログポストに、簡単な使い方などが紹介されています。

Introducing Label Studio, a swiss army knife of data labeling | by Nikolai Liubimov | Towards Data Science

Label Studio で対応しているタスク

README の Use Cases の項に大体書いてあります、以下のような機械学習タスクのデータ作成に使えるようです。

  • 画像
    • 分類
    • 物体検知
    • セグメンテーション
    • 姿勢推定
  • テキスト
    • 分類
    • 要約
    • HTML Tagging
  • 音声
    • 分類
    • 発話者認識
    • 感情認識
    • 文字起こし
  • 動画
    • 分類
  • 比較
    • 対となってるデータのどちらが良いか
    • ソート

まぁ、一般的なものは殆ど網羅されていると思います。

主な機能

  • 入力ファイル形式は、JSON, CSV, TSV 及び、RAR と ZIP アーカイブ
  • それらの入力データに対して、画面上でラベル付けができる
  • 入出力のデータ形式など、細かく設定可能
  • 単にファイルを入出力するだけで無く、機械学習フレームワークと

大まかな流れ

単体で使う場合

Label Studio を単体で使う場合の流れは以下の通りです。

  1. 入出力データの形式を定義する
  2. Label Studio を起動する
  3. 入力データを読み込ませる
  4. 画面上でラベル付けする
  5. ラベル付けした結果を出力する

上述の通り、データ形式は JSON, CSV, TSV など、基本的なものには対応しています。

機械学習フレームワークと連携する場合

Label Studio は単体で使うだけで無く、”ML backend server” というのを立ち上げて、それと接続することが出来ます。それにより、以下のような場合に使えると書いてあります。

  • Pre-labeling: 人間が正確なラベリングをする前の、大雑把なラベル付けを行う(例えば、画像のセグメンテーションなど)
  • Auto labeling: 学習済みモデルを使い、自動的にラベル付けを行う
  • オンライン学習: ラベル結果を随時 ML backend server に渡して、再学習をする
  • 能動学習: (詳しくは分かりません)
  • 予測サービス: 学習済みモデルを使った API サーバーのようなもの?

(上のリストのコロン以後の文は私のコメントです。)

実際に使えるのは最初の3つかなと思いました。API サーバーを作るのであれば、違う技術を選択すると思います。

また、NLP ライブラリの Transformers というのがあるのですが、それと接続するための label-studio-transformers というのがあるのですが、それについては別の機会に書こうと思います。

heartexlabs/label-studio-transformers: Label data using HuggingFace’s transformers and automatically get a prediction service

インストール、起動方法

インストール

Label Studio は、ブラウザ経由で操作するサーバー型のソフトウェアです。インストールといっても大したことはなく、以下のいずれかの方法で行います。

  • pip install label-studio
  • docker run .... heartexlabs/label-studio:latest ...
  • docker-compose up
  • git clone して、python コマンドで直接実行

一番簡単なのは、docker run か docker-compose up だと思いますが、好みの方法で行って下さい。

プロジェクトファイルの初期化

Label Studio を起動する際には「プロジェクトファイル」が必要です。初回の起動の際には、初期化のためのオプションをつけて、プロジェクトファイルを初期化します。

上述の通り、Label Studio の起動方法は何通りかあり、それによって初期化のオプションは異なりますが、以下、pip でインストールした場合の例を載せます。

label-studio init /path/to/my_project --template=text_classification

--template= の後には、プロジェクトファイルのテンプレートを指定します。指定できるテンプレートは、恐らく以下のディレクトリの中にあるものです。

label-studio/label_studio/examples at master · heartexlabs/label-studio

ちなみに、何も指定しないと、空のファイルが作成されます。

実際の使い方の例(テキスト分類)

入出力データの形式の定義

まずはどのようなデータがあって、それをどう分類するのか、といった定義をします。具体的には、プロジェクトディレクトリの中にある config.xml というファイルを修正します。

私の場合は、テキストの分類をしたいので、以下のように修正しました。

<!-- {"title": "Text classification", "category": "text", "complexity": "basic", "order": "!"} -->
<View>
  <Text name="text" value="$body"/>
  <Choices name="category" toName="text" choice="single">
    <Choice value="Category1"/>
    <Choice value="Category2"/>
    <Choice value="Category3"/>
    <Choice value="Category4"/>
  </Choices>
</View>

ここで、<Text> というタグの中に $body という文字列があると思いますが、これは入力データの中の body という値を画面に表示することを意味します。

次の <Choices> タグで、さきほどのテキストが Category1 〜 Category4 のどのカテゴリーに当てはまるのか、その選択肢を表示します。

起動

次に Label Studio を起動します。起動方法は、インストール方法によって異なりますが、pip でインストールした場合には以下のように起動します。

label-studio start /path/to/my_project

起動後は、ブラウザで http://ホスト名:8080/ にアクセスします。ポート番号は設定やコマンドラインオプションで変更可能です。

なお、ブラウザでアクセスしても画面がなかなか出てこない場合があります。それの対処法についてはページの後ろの方に記載したので、同じ現象が出ている人は参考にして頂ければ幸いです。

入力データを読み込ませる

次に、データを Label Studio に読み込ませます。今回は、JSON ファイルを読み込ませることにします。画面上部のメニューから「Import」を選択して、その後、JSON ファイルを選択します。

上述の config.xml で、入力ファイルの中の $body という値を表示し、それに対してラベル付けをしていくように設定しましたが、入力ファイルの JSON には body という要素が含まれている必要があります。

上述の Label Studio のブログ記事には以下のような説明画像があります。

Label Studio のブログ記事より引用

これに倣うと、入力データは以下のような形式である必要があります。

{
  body: "このテキストを分類します",
  id: 1,
  some_other_field: "foo"
}

ただ、実際には、ラベル付けすべきデータが1件だけというのはあり得ないので、以下のような配列形式になっている必要があります。

[
  {
    body: "このテキストを分類します",
    id: 1,
    some_other_field: "foo"
  },
  {
    body: "このテキストも分類して欲しいです",
    id: 2,
    some_other_field: "bar"
  },
]

画面上でラベル付けする

ここまで出来たら、後は画面上でポチポチラベル付けをしていくだけです。今回の例であれば、分類対象のテキストの下に選択肢が表示されるので、どれか1つを押して「Submit」します。

ラベル付けした結果を出力する

ラベル付けが終わったら、画面上部のメニューから「Export」を選択し、任意の形式で出力できます。特に難しいところはないので、詳細は省きます。

以上、Label Studio の一通りの使い方を説明しました。

その他

関連ソフトウェア

今回紹介したのは Label Studio 本体ですが、関連するソフトウェアとして以下のものがあります。

  • label-studio-frontend : 自前のアプリケーションに組み込んで使う事の出来る Label Studio のフロントエンドらしい
  • label-studio-converter : 他の機械学習ライブラリに合わせて出力形式を変換するコンバーターとのこと
  • label-studio-transformers : 前述の通り、NLP ライブラリの Transformers と接続するためのライブラリ。ラベル付け → Transformers のトレーニング → 学習済みモデルのデプロイ → 予測、という流れを簡単に実現できるっぽい

Transformers 単体は、弊社の miyamonz が色々いじっていたので、私も触ってみようと思います。

画面のロードに異様に時間がかかる場合の対処法

Label Studio を起動してブラウザでアクセスしても、画面がなかなか表示されない場合があります。弊社内でも複数人が経験しています。

原因としては、内部で使用している Flask (web サーバー)に同梱の WSGI サーバーである Werkzeug が(デフォルトでは)シングルスレッドで動作しているためのようです。

それに対して PR を作成し、手元の環境では問題は解決していますので、同じ問題で困っている人がいれば、こちらの修正を試してみて下さい。

Use gevent’s WSGIServer instead of plain Flask by k4200 · Pull Request #351 · heartexlabs/label-studio

(2020/7/26現在、PR は10日間くらい放置されているので、このままマージされない可能性が高そうです。)

まとめ

Label Studio は、画像・テキスト・音声など、さまざまなデータのラベル付けタスクに使用できるウェブアプリケーションです。今回はテキストの分類タスクを例に、インストール・設定・実際の利用まで説明しました。

NLP ライブラリである Transformers と連携も出来るようなので、今後はそちらも試してみようと思います。

← 前の投稿

Scalaのコレクションで遅延処理を行う

次の投稿 →

TypeScriptを手軽に実行できるPlayground環境の作り方

コメントを残す