Label Studio で YOLO ML backend を使用して物体検出のデータセットを作成

1. 概要

自宅近くにある鳥羽川で撮影した野鳥の写真に物体検出のアノーテーションを付け、データセットを作成しました。撮影した野鳥の種類とそれを囲む矩形領域のアノーテーションを付けました。

アノーテーションを付ける際、Label Studio を使用しました。Label Studio には YOLO 等の機械学習モデルとの連携機能があり、この機能を利用してアノーテーションを付けました。

このページにはその手順を記します。

使用した Label Studio のバージョンは v1.15.0、機械学習モデルとの連携に使用する Label Studio ML backend のバージョンは 2.0.1dev0 です。

野鳥を撮影した画像は、SONY のデジタルカメラ Alpha 6000 で撮影した 6,000 x 4,000 pixel の画像を 640 x 427 pixel にリサイズして使用しました。

2. Label Studio のインストールと設定

Windows 11 上の WSL2 の Ubuntu 24.04 にインストールしました。

2.1. Label Studio のインストールと起動

下記のコマンドで Label Studio をインストールし、起動しました。使用した python のバージョンは 3.12.3、pip のバージョンは 24.0 です。

補足:
Label Studio のインストールとは別件になりますが、Ubuntu 24.04 で上記のバージョンの pip をインストールした際、下記の手順で venv の環境を用意して pip を使用するようにしました。pip をインストールした直後に pip install label-studio で Label Studio をインストールしようとしたところ、PEP 668 の仕様についてのメッセージが表示され、そのままではインストールできなかったためです。

まず、下記のコマンドを実行し、pip をインストール後、venv を使用できるようにしました。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python3-pip
$ sudo apt-get install python3-full

次に、下記のコマンドを /home/username ディレクトリで実行しました。

$ python3 -m venv .python3_venv

その後、/home/username/.bashrc の末尾に下記の行を追加し、Ubuntu 24.04 にログインし直しました。

source $HOME/.python3_venv/bin/activate

ログインし直したところ、ターミナルのプロンプトが下記の例のようなプロンプトから

username@LAPTOP-LQJ83VHB:~$

下記の例のようなプロンプトに変わるのを確認しています。

(.python3_venv) username@LAPTOP-LQJ83VHB:~$

下記のコマンドで Label Studio をインストールし、起動します。

$ pip install label-studio
$ label-studio start &

上記のコマンド実行後、ブラウザで http://localhost:8080/ を開くと、Label Studio をブラウザから使用することができます。

一つ目の画像の右下の Sign Up のリンクをクリックし、二つ目の画像のページでアカウントを作成します。アカウント作成後は三つ目の画像のようなページが表示されます。

2.2. プロジェクトの作成

一つ目の画像のページで Create Project をクリックし、二つ目の画像のページで Project Name, Description に必要事項を入力して Save をクリックします。三つ目の画像のページが表示されます。

2.3. PCのフォルダに置いた画像の読み込み

Windows 11 の C:\dev\data\tobagawa\tobagawa-2025-01\images フォルダに読み込む画像を置きます。このフォルダは、WSL2 の Ubuntu からはディレクトリ /mnt/c/dev/data/tobagawa/tobagawa-2025-01/images として参照されます。

Local Storage に記載された手順で PC のフォルダに置いた画像を読み込むため、一度、Label Studio を停止させます。

Label Studio を起動した Ubuntu のターミナルから fg コマンドと Ctrl + C キーを入力し、Label Studio を停止させます。ターミナルは下記のようになります。

(.python3_venv) username@LAPTOP-LQJ83VHB:~$ fg
label-studio start
^C(.python3_venv) username@LAPTOP-LQJ83VHB:~$

次に /home/username/.bashrc の末尾に下記の行を追加し、Ubuntu 24.04 にログインし直しましす。LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT で指定したディレクトリのサブディレクトリに読み込む画像を置きました。

export LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true
export LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/mnt/c/dev/data/tobagawa/tobagawa-2025-01

再ログイン後、下記のコマンドで Label Studio をもう一度起動します。

$ label-studio start &

Label Studio の再起動後、一つ目の画像のページが表示されます。Project を選択すると二つ目の画像のページになります。右上の Settings をクリックすると三つ目の画像のページになります。

設定画面の左にある Cloud Storage を選択すると下の画像リストの一つ目の画像のページになります。

Add Source Storage をクリックし、二つ目の画像のように入力します。Storage Type で Local files を選択し、Storage Title に適当なタイトルを入力します。Absolute local path に画像を置いたディレクトリのパスを入力します。ここで指定するディレクトリは LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT で指定したディレクトリのサブディレクトリになるようにします。画像では途中で消えていますが、今回指定した例では /mnt/c/dev/data/tobagawa/tobagawa-2025-01/images です。File Filter Regex には対象とする画像ファイルの名前の正規表現を入力します。この例では拡張子 JPG のファイルを対象としています。JPG 画像ファイルを対象としているため、Treat every bucket object as a source file を有効にします。Add Storage または Save をクリックし、ポップアップ画面を閉じます。

Add Target Storage をクリックし、三つ目の画像のページのように入力します。Absolute local path には画像を置いたディレクトリのパスを入力します。

追加した Source Storage と Target Storage の Sync Storage ボタンをクリックすると四つ目の画像のページになります。

2.4. 野鳥の物体検出のアノーテーション (ML backend なし)

設定画面の左にある Labeling Interface を選択すると一つ目の画像のページになります。Browse Templates をクリックし、Object Detection with Bounding Boxes を選択します(二つ目の画像)。Add label names の欄にラベル名を入力し、Add をクリックします(三つ目の画像)。三つ目の画像で Save をクリックし、設定を保存します。

設定画面で画面上部のプロジェクト名 Tobagawa-2025-01-with-YOLO をクリックするとプロジェクトのページに移ります(一つ目の画像)。

画像の一つをクリックし、アノーテーションを付けます。画像下側のラベル名を選択後、マウスドラッグ操作で矩形領域のアノーテーションを追加できます(二つ目の画像)。

Submit をクリックし、アノーテーションを保存します。

3. Ultralytics YOLO を Label Studio の ML backend として設定

Label Studio の ML backend を使用すると、機械学習モデルによる推定結果を利用してアノーテーションを付けることができます。

YOLO ML backend for Label Studio に記載された手順で、YOLO の学習済み物体検出ニューラルネットワークの推定結果を利用してアノーテーションを付けました。

3.1. YOLO ML backend を docker compose で起動

下記のコマンドで Label Studio を起動したのとは別の Windows Terminal タブで Ubuntu 24.04 のターミナルを開きます。(下の画像)

$ label-studio start &
補足:
Label Studio および ML backend とは別件になりますが、まだ Docker および Docker Compose をインストールしていなければ、下記のページの手順でインストールします。

https://docs.docker.com/engine/install/ubuntu/

# Add Docker's official GPG key:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update

# Install the Docker packages
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

新しいタブで下記のコマンドを実行します。

$ git clone https://github.com/HumanSignal/label-studio-ml-backend.git
$ cd label-studio-ml-backend/label_studio_ml/examples/yolo

yolo ディレクトリに置かれた docker-compose.yml の LABEL_STUDIO_URL と LABEL_STUDIO_API_KEY に値をセットします。

LABEL_STUDIO_URL は Label Studio をブラウザで開く際の URL です。ただし、Docker からアクセスする際には localhost を指定してアクセスすることはできません。

下記のように ifconfig コマンドで docker0 に対応する IP アドレスを調べ、それをセットします。下記の例の場合、LABEL_STUDIO_URL には http://172.17.0.1:8080 をセットします。

(.python3_venv) fukagai@LAPTOP-LQJ83VHB:~/label-studio-ml-backend/label_studio_ml/examples/yolo$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:26:b4:7a:e5  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

LABEL_STUDIO_API_KEY は下記の手順で参照します。

Label Studio をブラウザで開いたページの右上にあるユーザーアイコンをクリックし、Account & Settings を選択します(一つ目の画像)。二つ目の画像で黄緑色で塗りつぶされた箇所に表示されている Access Token が、LABEL_STUDIO_API_KEY にセットする文字列になります。

docker-compose.yml をエディターで開き、LABEL_STUDIO_URL と LABEL_STUDIO_API_KEY に値をセットした後、下記のコマンドを実行します。

$ sudo docker compose up --build
3.2. ML backend を利用した Label Studio の設定

ブラウザで開いた Label Studio の Settings – Labeling Interface で ML backend を利用するように設定します。

下記の設定のうち、bird は YOLO ML backend のデフォルトの物体検出モデルが鳥を検出する際のラベル名です。bird で検出された物体検出の結果を、後でカルガモ、オオバン、マガモ(オス)、ダイサギ、アオサギ、カワウのいずれかに変更します。

<View>
  <Image name="image" value="$image"/>
  <RectangleLabels name="label" toName="image" model_score_threshold="0.25">
    <Label value="bird" background="red"/>
    <Label value="カルガモ" background="brown"/>
    <Label value="オオバン" background="gray"/>
    <Label value="マガモ(オス)" background="green"/>
    <Label value="ダイサギ" background="white"/>
    <Label value="アオサギ" background="blue"/>
    <Label value="カワウ" background="black"/>
  </RectangleLabels>
</View>

次に、Label Studio の Settings – Model で ML backend を利用するように設定します。

一つ目の画像のページで Connect Model をクリックします。

二つ目の画像のページで画像の例のように入力します。Backend URL は http://localhost:9090、Interactive preannotations を有効にします。その後、Validate and Save をクリックします。

三つ目の画像のページのようになります。

4. Label Studio で YOLO の物体検出のデータセットを作成
4.1. 野鳥の物体検出のアノーテーション (ML backend あり)

Label Studio のプロジェクトに戻り、画像を選択します。

一つ目の画像のように初期状態では学習済みの物体検出モデルにより bird が検出されています。検出された bird の矩形領域をクリックした後、鳥の種類のラベルをクリックすると鳥の種類のラベルを付けることができます。

Ctrl キーを押しながら矩形領域をクリックすると、二つ目の画像のように複数の矩形領域を選択できます。二つ目の画像の状態でカルガモを選択すると三つ目の画像のようになります。

下の一つ目の画像のように矩形領域を選択後、矩形領域の範囲を修正することもできます。二つ目の画像の右下の Regions で余分に追加したラベルがないか確認します。

学習済みの物体検出モデルが検出できなかった鳥は手動で矩形領域を描いてラベル付けします。間違って検出された bird の矩形領域は、矩形領域を選択して Backspace をクリックすると取り除くことができます。

Submit をクリックし、アノーテーションを保存します。

4.2. 使用しない画像をプロジェクトから削除

Label Studio のプロジェクトに取り込んだ画像のうち、使用しない画像は下記の手順で削除します。

まず、画像一覧のページで削除する画像の左端のチェックボックスを選択します(一つ目の画像)。
次に、画面左上の Tasks をクリックし、Delete Tasks を選択します(二つ目の画像)。

4.3. Label Studio で物体検出のデータセット(YOLOフォーマット)を出力

全ての画像データのアノーテーションが完了したら、物体検出のデータセットを出力します。

Label Studio のプロジェクトページ右上にある Export ボタンをクリックします(一つ目の画像)。
YOLO フォーマットの物体検出のデータセットを出力する場合、YOLO を選択して右下の Export ボタンをクリックします(二つ目の画像)。

Windows 11 の C:\Users\username\Downloads フォルダにデータセットの圧縮ファイルが追加されます。

5. 作成したデータセットで YOLO の物体検出モデルを training
5.1. training 用データセットの準備

上記 4.3. で Donwloads フォルダに追加されたデータセットの圧縮ファイルは project-1-at-2025-01-25-10-43-f2cc8f57.zip のような名前になっています。これを展開すると下記のような構成になっています。

- project-1-at-2025-01-25-10-43-f2cc8f57/
                ├─ classes.txt
                ├─ notes.json
                ├─ images/
                │   ├─ DSC00784.JPG
                │   ├─ DSC00785.JPG
                │   ├─ ...
                │   └─ DSC01432.JPG
                └─ labels/
                    ├─ DSC00784.txt
                    ├─ DSC00785.txt
                    ├─ ...
                    └─ DSC01432.txt

classes.txt は下記の内容のテキストファイルになっています。

bird
アオサギ
オオバン
カルガモ
カワウ
ダイサギ
ヒドリガモ(オス)
ヒドリガモ(メス)
マガモ(オス)
マガモ(メス)
補足:
こちらに記載した YOLO フォーマットのデータセット例は、上記 3.2. の Labeling Interface のラベルの設定とは少し異なる設定で出力したデータセットになります。(違うのはラベルの数、種類、順番のみです。)

上記のデータを元に下記の構成のデータを用意しました。

まず、project-1-at-2025-01-25-10-43-f2cc8f57 の images と labels ディレクトリに置かれていたファイルを、それぞれ tobagawa-2025-01/images/train と tobagawa-2025-01/labels/train に移しました。

次に、tobagawa-2025-01/images/train に置かれていた画像ファイルの一部を tobagawa-2025-01/images/val と tobagawa-2025-01/images/test ディレクトリに移しました。
それに合わせ、tobagawa-2025-01/labels/train ディレクトリに置かれていた拡張子を除くと画像ファイルと同じ名前のファイルを tobagawa-2025-01/labels/val と tobagawa-2025-01/labels/test ディレクトリに移しました。

用意したデータセットのディレクトリ構成は下記のようになります。

- tobagawa-2025-01/
      ├─ data.yaml
      ├─ images/
      │   ├─ train/
      │   │   ├─ DSC00784.JPG
      │   │   ├─ DSC00785.JPG
      │   │   ├─ ...
      │   │   └─ DSC01432.JPG
      │   ├─ val/
      │   │   ├─ DSC00801.JPG
      │   │   ├─ DSC00811.JPG
      │   │   ├─ ...
      │   │   └─ DSC01399.JPG
      │   └─ test/
      │       ├─ DSC00804.JPG
      │       ├─ DSC00818.JPG
      │       ├─ ...
      │       └─ DSC01390.JPG
      └─ labels/
          ├─ train/
          │   ├─ DSC00784.txt
          │   ├─ DSC00785.txt
          │   ├─ ...
          │   └─ DSC01432.txt
          ├─ val/
          │   ├─ DSC00801.txt
          │   ├─ DSC00811.txt
          │   ├─ ...
          │   └─ DSC01399.txt
          └─ test/
              ├─ DSC00804.txt
              ├─ DSC00818.txt
              ├─ ...
              └─ DSC01390.txt

data.yaml は下記の内容のテキストファイルになります。文字コードは UTF-8、改行コードは CR LF で試しました。

path: /mnt/c/dev/data/custom/tobagawa/tobagawa-2025-01  # dataset root dir
train: images/train  # train images (relative to 'path')
val: images/val  # val images (relative to 'path')
test: images/test  # test images (relative to 'path')

# Classes
names:
  0: bird
  1: アオサギ
  2: オオバン
  3: カルガモ
  4: カワウ
  5: ダイサギ
  6: ヒドリガモ(オス)
  7: ヒドリガモ(メス)
  8: マガモ(オス)
  9: マガモ(メス)

/mnt/c/dev/data/custom/tobagawa/tobagawa-2025-01 は WSL2 の Ubuntu から見た data.yaml が置かれているディレクトリのパスです。

ラベル名は classes.txt に記載されていた順と同じ順に並べました。各ラベル名の前には 0 から順に一つずつ増加する番号とコロン記号「:」を置きました。

5.2. YOLO 物体検出モデルの training と prediction の確認

こちらのリンク先に記載した方法と同様、WSL2 上の Ubuntu に最新の Ultralytics YOLO をインストールした環境で動作確認しました。

最新の Ultralytics YOLO で確認したため、上記のリンク先とは異なり YOLO11 を使用できるようになっています。

補足:
下記の手順では、NVIDIA GeForce GTX 1650 (GPGPU) をセットしたデスクトップパソコン ESPRIMO WD2/H2 を使用しました。プログラムは Windows 11 の WSL2 上の Ubuntu 22.04 で実行しました。

こちらのページの一番下の表のスペックの PC を使用しました。

5.2.1. YOLO 物体検出モデルの training

作成したデータセットを使用し、野鳥の種類と位置を推定する YOLO 物体検出モデルの training を実施しました。

下記のコマンドで YOLO 物体検出モデルの training を実行しました。

$ yolo train model=yolo11n.pt data=/mnt/c/dev/data/custom/tobagawa/tobagawa-2025-01/data.yaml batch=-1 epochs=40

model で指定した yolo11n.pt は他のデータセットで学習済みの物体検出モデルです。yolo11n.pt は比較的ネットワーク規模の小さいモデルになります。他のデータセットで学習済みの物体検出モデルをベースに、新たなデータセットで training します。

data で指定した /mnt/c/dev/data/custom/tobagawa/tobagawa-2025-01/data.yaml は上記 5.1. で用意したデータセット内のファイルです。

batch では -1 を指定しています。この値を指定すると、使用している GPGPU の GPU メモリのサイズに応じて適切な batch size が選択されます。

epochs ではエポック数を指定します。エポック数はデータセットを与えて繰り返し training を実行する際の training 回数のことです。エポック数が 10, 20, 40 の三通りの条件で確認しましたが、エポック数を増やすにつれて prediction の結果が良くなることを確認しています。

5.2.2. 学習させた YOLO 物体検出モデルによる prediction 結果の確認

学習させた YOLO 物体検出モデルによる prediction を下記のコマンドで実行しました。

$ yolo predict model=./runs/detect/train5/weights/best.pt source=/mnt/c/dev/data/custom/tobagawa/tobagawa-2025-01/images/test/

model で指定した ./runs/detect/train5/weights/best.pt は上記 5.2.1. で training して得られた物体検出モデルです。training で重みが更新された物体検出モデルがどのパスに保存されるかは環境に依存します。私の環境での 5 回目の training 結果なため、train5 がパスに含まれています。

source で指定した /mnt/c/dev/data/custom/tobagawa/tobagawa-2025-01/images/test/ は test 画像が置かれたディレクトリのパスです。上記 5.2.1. で training を実行した際、images/train, images/val 内の画像と labels/train, labels/val 内のラベルが参照されました。images/test 内の画像は training で参照されていない画像になります。

下の画像は上記のコマンドで出力された 10 枚の検出結果の画像です。一部、一羽の鳥を複数の鳥として検出している箇所がありますが、ほぼ正しい検出結果が得られています。

こちらのリンクに今回用意したデータセットの圧縮ファイル tobagawa-2025-01.zip を置きました。

(images/train, images/val, images/test 内に置かれた画像はどれも鳥羽川の堤防から撮影した似たような画像です。もう少し多様な画像を用意して試していけたらと考えています。)

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA