この記事の目次

海洋分野では、水中カメラ、顕微鏡、遠隔操作型の無人探査機、沿岸調査などから多様な画像が得られます。こうした画像を機械学習へ利用するには、何が写っているか、どの位置にあるかを人が示した正解情報が必要です。このように画像へラベルや領域を付ける作業を、画像のアノテーションと呼びます。

この記事では、アノテーションの役割を整理した後、実際に試すための環境を構築します。画像と作業結果はLabel Studioで管理し、Segment Anything Model(SAM)を使ってセグメンテーションマスクの作成を補助します。水中生物の画像を例として使いますが、海洋ごみ、底生生物、プランクトン画像、設備点検など、ほかの画像にも応用できます。

環境はUbuntu上へDockerを使って構築し、SAMはNVIDIA GPUで実行します。ただし、GPUプログラミングやモデル学習を解説する記事ではありません。インストールからアノテーションまでを再現できるよう、必要な構築手順を掲載しています。

Label Studioで手作業のアノテーションだけを行う場合は、Label Studioのインストールまで進めてください。SAMによるマスク作成の補助も試す場合は、その後の設定まで行います。

この記事では、Label Studioの機能や操作方法全般は扱いません。環境構築と、SAMを使ってアノテーションを試すまでの流れに絞って説明します。

画像のアノテーションとは

画像のアノテーションでは、モデルに学ばせる正解情報を画像へ付けます。どのような情報を付けるかは、取り組む課題によって異なります。

課題画像へ付ける情報答えたいこと
画像分類画像全体に一つのラベルこの画像に調査対象が写っているか
物体検出対象ごとの囲み枠とラベル調査対象がどこにあるか
セグメンテーションピクセル単位の領域とラベルどの画素が調査対象に当たるか

同じ画像を例に、画像全体の分類、物体を囲う物体検出、画素単位で領域を示すセグメンテーションを比較した図

この記事で扱うセグメンテーションでは、Fishラベルを選んで魚を大まかに囲うと、SAMがマスク候補を作成し、人がその内容を確認して保存します。

ここではAIモデルを学習させるのではなく、後からモデルの学習や評価に利用できるラベル付きデータを作成します。

Label StudioとSAMの役割

Label Studioは、オープンソースのアノテーションプラットフォームです。画像の取り込み、ラベルの設定、作業の割り当て、結果の確認、データの書き出しを一か所で行えます。Label Studioを使ったことがない人でも進められるように、インストールから説明します。

Segment Anything Modelは、点や囲み枠などの指示をもとに、物体の領域をマスクとして提案するモデルです。今回の構成では、Label StudioからSAMバックエンドへ囲み枠を送り、SAMバックエンドがSAMを実行してマスクを返します。

SAMは物体が魚かどうかを判定したり、魚種を識別したりするモデルではありません。ラベルの選択や、提案された境界が目的に合っているかの判断は人が行い、最初のマスクが自動で作られた場合も確認が必要です。

この記事で構築する作業の流れ

アノテーションを行う人から見ると、構築後の流れは次のようになります。

  1. 画像をLabel Studioへ取り込む
  2. ラベルを選択し、調査対象を囲む
  3. SAMがGPUを使ってマスク候補を作る
  4. マスクを確認する
  5. 完成したアノテーションを保存する

Label StudioとSAMバックエンドはDockerコンテナで動かします。モデルには、MobileSAMやSAM 2ではなく、SAMのViT-H版を使用します。

前提条件と使用するリポジトリ

この手順はUbuntu 24.04で動作確認しています。次のバージョンは動作確認時の環境を記録したもので、最低要件ではありません。

コンポーネント動作確認したバージョン
Docker Engine29.7.1
Docker Compose5.3.1
NVIDIAドライバー580.173.02
nvidia-smiに表示されたCUDAバージョン13.0
NVIDIA Container Toolkit1.19.1-1

この記事では、運用しやすいように変更が加えられた次のリポジトリを使います。

これらのリポジトリは、HumanSignal Label StudioHumanSignal Label Studio ML Backendをもとに変更されています。この記事では、上記二つのリポジトリの現在の内容を使用します。外部のイメージや依存関係は更新される可能性があるため、長期間運用する場合はリポジトリの内容も確認してください。

Dockerを確認する

使用中のOSに対応するDockerの公式手順(英語)でDocker EngineとComposeプラグインをインストールし、二つのコマンドを確認します。

docker --version
docker compose version

GPUを確認する

UbuntuからNVIDIA GPUを認識できることと、NVIDIA Container Toolkitがインストールされていることを確認します。

nvidia-smi
dpkg -l | grep nvidia-container-toolkit

未導入またはDocker用の設定が済んでいない場合は、NVIDIA Container Toolkitのインストール手順(英語)に従って設定します。

SAMを構築する前に、コンテナからGPUが見えることも確認しておくと、後の問題を切り分けやすくなります。

docker run --rm --gpus all nvidia/cuda:13.0.2-base-ubuntu24.04 nvidia-smi

コンテナ内の出力にGPU名が表示されることを確認してください。

ユーザーとグループを作成する

この環境では、サーバを管理するユーザーとLabel Studioのデータを所有するユーザーを分けます。

ユーザー役割
sys-adminサーバ構築、Docker操作、保守を行う
ops-adminLabel Studioで使用するプロジェクトデータを所有する

例で使うUIDとGIDがサーバ上で未使用であることを確認してから、ユーザーとグループを作成します。

sudo groupadd -g 1003 sys-admin
sudo groupadd -g 1004 ops-admin
sudo groupadd -g 1005 labelstudio

sudo adduser --uid 1003 --gid 1003 sys-admin
sudo usermod -aG sudo,docker,labelstudio sys-admin

sudo adduser --uid 1004 --gid 1004 ops-admin
sudo usermod -aG labelstudio ops-admin

sudo -iu sys-admin

この環境では、リポジトリ内のコンテナユーザーに合わせてUID・GIDを固定しています。すでに同じIDが使われているサーバではそのまま実行せず、リポジトリ側の設定を含めて調整してください。また、Dockerを操作するsys-adminだけをdockerグループへ追加し、ops-adminは追加しません。

Label Studioをインストールする

Dockerネットワークを作成する

共通ネットワークがすでに存在するか確認します。

docker network inspect label-studio

存在しないというエラーが表示された場合は作成します。

docker network create label-studio

Label Studioのリポジトリをcloneする

Label Studioのリポジトリを/optへcloneします。

cd /opt
sudo git clone https://github.com/Lot4Fun/label-studio.git

データ保存用ディレクトリを準備する

Label Studioを初めて起動する前に、データを保存するディレクトリを作成します。

sudo mkdir -p /opt/label-studio/mydata/local_storage
sudo chown -R ops-admin:labelstudio /opt/label-studio/mydata
sudo chmod -R 775 /opt/label-studio/mydata

Label Studioを起動する

サービスを構築・起動します。

cd /opt/label-studio
docker compose -f compose.yaml up -d --build

ブラウザでhttp://SERVER_IP:8080を開きます。Label Studioの画面が表示されたら、最初のアカウントを作成してください。

Label Studioのアクセストークンを取得する

SAMバックエンドがLabel Studioから画像を取得するために、アクセストークンを使用します。今回の連携ではLegacy Tokenを使います。

  1. Organization > Access Token Settingsを開く
  2. Legacy Tokensを有効にする
  3. Account & Settings > Legacy Tokenを開く
  4. トークンをコピーする

Label StudioのLegacy Token画面。トークン本体を伏せた入力欄とコピーボタンが表示されている

Legacy Tokenは自動で失効しないため、不要になったものは手動で無効化します。

SAMバックエンドをインストールする

SAMバックエンドのリポジトリをcloneする

SAMバックエンドのリポジトリをcloneします。

cd /opt
sudo git clone https://github.com/Lot4Fun/label-studio-ml-backend.git

Label Studioのアクセストークンを設定する

SAMバックエンドのComposeファイルを開きます。

sudo vi /opt/label-studio-ml-backend/label_studio_ml/examples/segment_anything_model/docker-compose.yml

アクセストークンの値を、Label Studioで取得したLegacy Tokenへ書き換えます。

environment:
  ...
  - LABEL_STUDIO_ACCESS_TOKEN={YOUR_ACCESS_TOKEN}

実際のトークンを含むComposeファイルは、Gitへcommitしたり公開したりしないでください。

SAMバックエンドを起動する

SAMバックエンドを構築・起動します。

cd /opt/label-studio-ml-backend/label_studio_ml/examples/segment_anything_model
docker compose up -d --build

起動後、SAMバックエンドが応答することを確認します。

curl http://localhost:9090/

次のレスポンスが返れば起動完了です。

{"model_class":"SamMLBackend","status":"UP"}

アノテーションプロジェクトを作成する

Label Studioでプロジェクトを作成し、Custom Templateを選択して、次のラベル設定を貼り付けます。

Label Studioのプロジェクト作成画面で、Labeling SetupタブとCustom templateの選択位置を示した状態

<View>
  <Image name="image" value="$image" zoom="true" zoomControl="true"/>
  <Header value="Segmentation Mask"/>
  <BrushLabels name="brush_labels" toName="image">
    <Label value="Fish" background="#E64A45"/>
  </BrushLabels>
  <Header value="SAM Prompt"/>
  <RectangleLabels name="rectangle_labels" toName="image" smart="true">
    <Label value="Fish" background="#1E3A5F" showInline="true"/>
  </RectangleLabels>
</View>

SAMをプロジェクトへ接続する

Settings > Model > Connect Modelを開き、次の値で接続を追加します。

項目
NameOriginal SAM ViT-H GPU(任意)
Backend URLhttp://segment_anything_model:9090
AuthenticationNo Authentication
Interactive preannotations有効

Label Studioのモデル接続画面でSAMバックエンドのサービスURLを指定し、Interactive preannotationsを有効にした状態

SAMバックエンドはNo Authenticationで接続するため、インターネットへ公開しないでください。

SAMを使ってアノテーションを試す

画像を取り込み、アノテーション画面で開きます。

  1. Auto-Annotationを有効にする
  2. 自動補助に対応した囲み枠ツールを選択する
  3. Fishラベルを選択する
  4. 魚一個体を枠で囲む
  5. Brush形式のマスクが表示されるまで待つ
  6. アノテーションを確定する

Label Studioのアノテーション画面で、Auto-Annotation、自動補助付きの囲み枠ツール、SAM PromptのFishラベルを番号で示した状態

画像上で魚を囲った入力例と、SAMが作成して人が確認したセグメンテーションマスクを左右に比較した図

SAMが作成するのは、囲み枠で示した対象領域の候補です。対象が魚かどうかや、どこまでを一個体として扱うかは判断しないため、アノテーションを行う人が結果を確認して確定します。

大量に作業する前にルールを決める

大量のデータへアノテーションを行う前に、代表的な画像を少数選んで作業を試し、次のような扱いを決めておきます。

  • 画像の外へ一部が切れている対象
  • 重なっている、または一部が隠れている対象
  • 透明なヒレ、動きによるぼけ、濁り、曖昧な境界
  • 作業対象から除外する画像
  • 別の担当者による確認や抜き取り確認

SAMを使うと対象領域を手作業で塗りつぶす負担を減らせますが、提案された境界の確認や、研究上どこまでを一個体として扱うかの判断は人が行います。そのため、利用できるデータセットを作るには、一貫した作業ルールと人による確認が必要です。

アノテーション作業を自組織だけで進めることが難しい場合は、作業の外部委託も選択肢になります。下の問い合わせ導線から、環境構築・実装支援についてもご相談いただけます。

起こりやすい問題

SAMバックエンドでGPUを利用できない場合は、ホスト上のnvidia-smi、CUDAコンテナ内のnvidia-smi、SAMバックエンドのコンテナ内のPyTorchによるCUDA確認の順に見直します。

モデルを接続できてもマスクが表示されない場合は、Interactive preannotationsAuto-Annotation、Legacy Tokenの有効性、XML内の二つのFishラベルを確認します。SAMバックエンドのログはdocker compose logs segment_anything_modelで確認できます。

Label Studioがデータを書き込めない場合は、/opt/label-studio/mydataの所有者と、カスタムイメージで使用するUID・GIDを比較します。恒久的な回避策としてchmod 777を使わないでください。

お問い合わせ

構築・実装支援とアノテーション業務

環境構築や設計・実装の支援、アノテーション業務の委託について、ご相談いただけます。

お問い合わせフォームへ

本番運用へ進む前に

ここで構築するのは、動作確認または管理された研究ネットワークでの利用を想定した環境です。インターネットへ公開する場合は、アクセス制御、HTTPS、データベース認証、バックアップ、秘密情報の管理と、Label Studioのセキュリティガイド(英語)を確認してください。

OceanGraphとの関係

OceanGraphには画像をアノテーションする機能はありません。OceanGraphは、水温、塩分、溶存酸素など、処理済みのArgoプロファイルをブラウザで探索するためのツールです。共通しているのは、海洋分野のデータを確認し、より専門的な解析やモデル開発へ進む前の作業を支援する点です。

海洋データを扱う流れについては、海洋データ可視化:手法・実例・ツールも参照してください。

関連記事と公式資料

次に読む記事:

参考資料: