この記事の目次
海洋分野では、水中カメラ、顕微鏡、遠隔操作型の無人探査機、沿岸調査などから多様な画像が得られます。こうした画像を機械学習へ利用するには、何が写っているか、どの位置にあるかを人が示した正解情報が必要です。このように画像へラベルや領域を付ける作業を、画像のアノテーションと呼びます。
この記事では、アノテーションの役割を整理した後、実際に試すための環境を構築します。画像と作業結果は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は物体が魚かどうかを判定したり、魚種を識別したりするモデルではありません。ラベルの選択や、提案された境界が目的に合っているかの判断は人が行い、最初のマスクが自動で作られた場合も確認が必要です。
この記事で構築する作業の流れ
アノテーションを行う人から見ると、構築後の流れは次のようになります。
- 画像をLabel Studioへ取り込む
- ラベルを選択し、調査対象を囲む
- SAMがGPUを使ってマスク候補を作る
- マスクを確認する
- 完成したアノテーションを保存する
Label StudioとSAMバックエンドはDockerコンテナで動かします。モデルには、MobileSAMやSAM 2ではなく、SAMのViT-H版を使用します。
前提条件と使用するリポジトリ
この手順はUbuntu 24.04で動作確認しています。次のバージョンは動作確認時の環境を記録したもので、最低要件ではありません。
| コンポーネント | 動作確認したバージョン |
|---|---|
| Docker Engine | 29.7.1 |
| Docker Compose | 5.3.1 |
| NVIDIAドライバー | 580.173.02 |
nvidia-smiに表示されたCUDAバージョン | 13.0 |
| NVIDIA Container Toolkit | 1.19.1-1 |
この記事では、運用しやすいように変更が加えられた次のリポジトリを使います。
これらのリポジトリは、HumanSignal Label StudioとHumanSignal 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-admin | Label 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を使います。
- Organization > Access Token Settingsを開く
- Legacy Tokensを有効にする
- Account & Settings > 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を選択して、次のラベル設定を貼り付けます。

<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を開き、次の値で接続を追加します。
| 項目 | 値 |
|---|---|
| Name | Original SAM ViT-H GPU(任意) |
| Backend URL | http://segment_anything_model:9090 |
| Authentication | No Authentication |
| Interactive preannotations | 有効 |

SAMバックエンドはNo Authenticationで接続するため、インターネットへ公開しないでください。
SAMを使ってアノテーションを試す
画像を取り込み、アノテーション画面で開きます。
- Auto-Annotationを有効にする
- 自動補助に対応した囲み枠ツールを選択する
Fishラベルを選択する- 魚一個体を枠で囲む
- Brush形式のマスクが表示されるまで待つ
- アノテーションを確定する


SAMが作成するのは、囲み枠で示した対象領域の候補です。対象が魚かどうかや、どこまでを一個体として扱うかは判断しないため、アノテーションを行う人が結果を確認して確定します。
大量に作業する前にルールを決める
大量のデータへアノテーションを行う前に、代表的な画像を少数選んで作業を試し、次のような扱いを決めておきます。
- 画像の外へ一部が切れている対象
- 重なっている、または一部が隠れている対象
- 透明なヒレ、動きによるぼけ、濁り、曖昧な境界
- 作業対象から除外する画像
- 別の担当者による確認や抜き取り確認
SAMを使うと対象領域を手作業で塗りつぶす負担を減らせますが、提案された境界の確認や、研究上どこまでを一個体として扱うかの判断は人が行います。そのため、利用できるデータセットを作るには、一貫した作業ルールと人による確認が必要です。
アノテーション作業を自組織だけで進めることが難しい場合は、作業の外部委託も選択肢になります。下の問い合わせ導線から、環境構築・実装支援についてもご相談いただけます。
起こりやすい問題
SAMバックエンドでGPUを利用できない場合は、ホスト上のnvidia-smi、CUDAコンテナ内のnvidia-smi、SAMバックエンドのコンテナ内のPyTorchによるCUDA確認の順に見直します。
モデルを接続できてもマスクが表示されない場合は、Interactive preannotationsとAuto-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プロファイルをブラウザで探索するためのツールです。共通しているのは、海洋分野のデータを確認し、より専門的な解析やモデル開発へ進む前の作業を支援する点です。
海洋データを扱う流れについては、海洋データ可視化:手法・実例・ツールも参照してください。
関連記事と公式資料
次に読む記事:
- 研究の解析環境を再現可能にする方法:Docker入門
- 研究コードの変更履歴と再現性を残す方法:Git・GitHub入門
- 海洋データ可視化:手法・実例・ツール
- 海洋データの機械学習で起きるデータリーク:空間・時間を考慮したデータ分割
- 海洋画像のアノテーションからセグメンテーションモデルへ:学習と評価
- 海洋AIにおけるHuman-in-the-loop:予測の確認と学習データの改善
参考資料:
