この記事の目次
画像のアノテーションが終われば、海洋画像のセグメンテーションモデルの学習自体は始められます。ただし、信頼できるモデルと評価結果を得るには、アノテーションデータを検証し、取得単位の情報を保ったままデータを分割し、クラスIDを統一したうえで、実際の運用を表す評価データを設計する必要があります。
この記事では、海洋画像をAIの学習データにする:Label StudioとSAMで始めるアノテーションの次の段階として、再現可能なモデル開発に必要なデータ仕様と、学習・評価時の確認方法を説明します。
セグメンテーションが学習するもの
セマンティックセグメンテーションは、各画素にクラスを割り当てます。インスタンスセグメンテーションは、同じクラスの個体も別々に識別します。海洋・水産分野では、魚体計測、底生環境の地図化、生物の計数、海洋ごみ調査、水中設備の点検などに使われています。
必要な出力に合わせて、アノテーションの形式を選びます。魚の画素をすべて一色で塗ったセマンティックマスクからは、魚と背景を分けるモデルを学習できます。ただし、魚どうしが重なっている場合、どこまでが1匹目でどこからが2匹目なのかは判別できません。個体の区別が必要なら、インスタンスマスクを使います。

公開データセットからデータ構成を学ぶ
DeepFish computer vision datasetの論文では、魚のインスタンスセグメンテーション、分類、サイズ推定に使える水産データセットが報告されています。公開データセットは6か月かけて収集されたJPEG画像1,320枚からなり、そのうち1,291枚にアノテーションが付いています。収録されている魚は7,339個体、59種で、これを60のラベルで表しています。アノテーションには、画素単位のインスタンスマスクと個体情報が含まれます。データ本体は、論文からZenodoのレコードへリンクされています。
このように、画像、個体、クラス、サイズの基準、取得日を対応づけて管理する設計は、自分のデータセットを組み立てるときの参考になります。公開データをダウンロードまたは再配布する前には、その時点の公開レコード、ライセンス、引用の依頼、用途上の制限を必ず確認します。
市場の計測トレーで撮影した画像と、水中ROVで撮影した画像では、モデルが扱う条件が大きく異なります。トレー画像で高い精度が出ても、それだけでROV映像でも同じ性能が得られるとは言えません。背景や照明、カメラと対象の距離、遮蔽、濁り、対象の向きが変わると、画像の見え方だけでなく、対象を見つけて境界を分ける難しさも変わるためです。ROVで利用するなら、ROV映像を含むテストデータを用意するか、少なくとも実運用に近い条件で追加評価する必要があります。
学習前にデータセットの仕様を固定する
例えば、画像ごとのラベルと取得条件を、プログラムから読み取れる形式のマニフェストに次のように記録します。
image_id
image_path
mask_path or annotation_path
class_map_version
site_id / trip_id / dive_id / batch_id
observed_at
annotation_version
split
マニフェストを使って、データセットが次の条件を満たしていることを確認します。
- 画像IDが重複せず、後から変わらない
- 画像とマスクの幅・高さが一致する
- 定義済みのクラスIDだけがラベルに使われている
- 同じ画像内でインスタンスIDが重複しない
- 分割に必要な取得単位が記録されている
- アノテーションとクラス対応表のバージョンが明記されている
- 各ファイルが1つのパーティションにだけ属している
学習処理では、ディレクトリ名から取得単位を推測するのは避けます。取得単位はマニフェストに明示して検証し、そのマニフェストを学習・評価の実行記録と一緒に保管します。
学習前にアノテーションを監査する
アノテーションの誤りは、誤った正解情報としてそのまま学習に使われます。まず自動検査を行います。
- 画像とマスクの両方を読み込める
- 画像とマスクの幅・高さが一致している
- ラベルに、クラス対応表で定義した整数だけが使われている
- 定義した各インスタンスに、対応する画素が存在している
- マスクに未定義のIDが含まれていない
- 背景だけの画像を、意図したルールで扱っている
- ポリゴンやRLEが変換後も保持されている
- 除外した画像や不確実な画像を、暗黙に背景として扱っていない
次に、条件ごとに抽出した画像を目視で確認します。全クラス、密集した場面、画像の端、低コントラスト、小さい対象、一部しか写っていない対象、複数のアノテーターが担当した画像を含めます。マスクを半透明で重ね、元画像は原寸でも確認します。
アノテーター同士の判断が一致していても、それだけで正しいとは限りません。一方、判断が分かれた箇所は、アノテーション基準が曖昧な部分を示します。アノテーターごとに対象の境界の決め方が分かれてしまう前に、アノテーションガイドラインを見直してから本格的な作業に進みます。
データを加工する前に、元画像の単位で分割する
学習用・検証用・テスト用への分割は、データを加工して数を増やす前に行います。まず元画像や同じ取得単位に属する画像を各パーティションへ分け、その後で切り出し、タイル化、反転、色変換などの加工を行います。同じ元画像から作った派生データは、すべて元画像と同じパーティションに入れます。
こうしないと、ほとんど同じ画像が学習用と評価用の両方に入り、モデルの性能を実際より高く見積もるおそれがあります。
動画なら、一つのシーケンスまたは一回の潜航のフレームをまとめます。固定カメラのプロジェクトなら、設置期間で分けます。トレー画像なら、取得日やバッチの違いが、背景や取り扱い条件の差を表すことがあります。グループの単位は、実運用で何が未知になるかに合わせて決めます。
海洋データの機械学習で起きるデータリーク:空間・時間を考慮したデータ分割では、グループ・空間・時間分割を詳しく説明しています。分割を確定する前に、グループ別のクラス数・個体数を記録します。確認せずに分割すると、希少クラスがテストから消えたり、一つの取得条件だけに現れたりします。
概念上は三つに分けます。
- 学習:学習用データでモデルのパラメータ(重み)を学習し、正規化などの前処理に使う値も学習用データだけから決める。
- 検証:検証用データを使って、チェックポイント、モデル構成、閾値、ハイパーパラメータを選ぶ。
- テスト:選択を終えたモデルをテストデータで一度だけ評価する。テスト結果をモデルや設定の選択には使わない。
学習条件と実行記録を再現可能にする
学習を再現できるようにするには、スクリプトだけでなく、次の条件も記録します。
- 使用したコードのバージョン
- コンテナイメージまたは実行環境のバージョン
- データセットと分割マニフェストのバージョン
- モデルの構成と初期重みの出典
- 入力画像の解像度と切り出し方法
- データ拡張の内容と設定
- 損失関数とクラスごとの重み
- 最適化手法、学習率のスケジュール、バッチサイズ、エポック数の上限
- 乱数シードと、可能な範囲で結果を再現するための設定
- 使用したハードウェアと計算精度(半精度・単精度)の設定
- チェックポイントを選ぶ基準
実行環境については研究の解析環境を再現可能にする方法:Docker入門、レビューできるコードと実験メタデータについては研究コードの変更履歴と再現性を残す方法:Git・GitHub入門で説明しています。
再現可能であるとは、どのGPUでも浮動小数点の最後のビットまで一致するという意味ではありません。入力、規則、環境、許容する差を明示し、再実行したときに違いを追跡できる状態を指します。
データローダーを単純でテストしやすく保つ
ローダーの役割を一つに絞ります。マニフェストの1行を受け取り、画像テンソル、正解マスクまたはインスタンス情報、識別用メタデータを返すことです。
小さな既知の入力データでテストします。
- 対象が1つだけ写っている画像
- 複数の対象が接している画像
- 検出対象が写っていない画像
- 定義済みのクラスIDのうち、最も大きい値を含むマスク
- パディングが必要なサイズの画像
- データ拡張で対象が画像の端に移動する例
画像とマスクには同じ幾何変換を適用します。明るさや色調の変換は画像だけに適用し、マスクは変えません。マスクを変換するときは、クラスやインスタンスの情報を壊さない方法を選びます。
正規化に使う平均値や標準偏差は、実験条件として記録した値を使います。データセットから計算する場合は、学習用画像だけを使います。
目的に合う評価指標を選ぶ
Intersection over Union(IoU)は、クラスごとの予測マスクと正解マスクの重なりを表す指標です。計算式は次のとおりです。
IoU = 真陽性画素 / (真陽性画素 + 偽陽性画素 + 偽陰性画素)
Diceは次の式です。
Dice = 2 × 真陽性画素 / (2 × 真陽性画素 + 偽陽性画素 + 偽陰性画素)
セグメンテーションの評価値を報告するときは、データセットのバージョン、分割方法、クラスの扱い、平均の取り方、存在しないクラスの処理を明記します。
セマンティックセグメンテーションでは、クラスごとのIoUに加えて、マクロ平均または頻度加重平均を用います。平均の計算方法も明記します。背景が画像の大部分を占めると、画素単位の精度だけが高く見えることがあります。
インスタンスセグメンテーションでは、出力形式と利用目的に合った個体単位の評価を使います。画素の重なりが良くても、2匹の魚を1匹としてまとめてしまうことがあり、個体数や体長を求める用途では問題になります。
空クラスと希少クラスの扱いを明示する
テスト画像にcoralクラスの画素が一つもない場合を考えます。指標の実装によって、そのクラスを無視するもの、未定義値を返すもの、空の予測を完全一致とみなすものがあります。集計の前に、どう扱うかを決めて明記します。
クラスごとに、評価した画像数と個体数も報告します。希少な2個体から求めた平均と、数千個体から求めた平均は、同じようには比較できません。
あるクラスの画像が一つの地点やバッチにしか含まれていないと、モデルがそのクラスを認識できているのか、地点やバッチ特有の背景・条件を学習しただけなのかを区別できません。見かけ上バランスのよい分割を作るためにランダム分割するのではなく、別の地点やバッチのデータを追加するか、そのクラスについての主張の範囲を狭めます。
目視によるエラー分析も評価に含める
集計指標だけでは、モデルがなぜ失敗したのかは分かりません。エラーの原因を調べる際は、次の情報を組み合わせて確認します。
- 元画像
- 正解マスク
- 予測マスクと信頼度
- 偽陽性・偽陰性の重ね合わせ
- 画像ID、グループ、取得メタデータ
- 画像ごとの評価指標や誤差
画像ごとの評価指標が最も良い例、中央値に近い例、最も悪い例に加え、無作為に抽出した例も確認します。メタデータがあれば、クラス、地点、視界、深度、カメラ、対象サイズ、密集度など、条件ごとに抽出して確認します。
次のような、繰り返し現れる失敗を探します。
- ひれや細い構造が欠ける
- 隣り合う個体を一つにまとめてしまう
- 一個体を複数に分けてしまう
- 影、定規、機体の部品、ごみを対象と取り違える
- 小さい対象や、一部しか見えない対象を見逃す
- 対象の実際の境界ではなく、アノテーター特有の境界の引き方を学習してしまう
- 未知の地点や取得バッチで性能が大きく落ちる
失敗例を目視で確認すると、モデル自体を変えるより先に、アノテーション基準を見直す必要があると分かることもあります。
体長や個体数は別の指標で評価する
セグメンテーションの結果を体長や面積、バイオマス指標、個体数の推定に使う場合は、セグメンテーションの精度とは別に、それぞれの計測結果を検証する必要があります。IoUが高くても、下流の計測値が正確になるとは限りません。
体長を推定する場合は、校正方法を明記し、予測値を基準値と適切な誤差指標で比較します。個体数を数える場合は、複数個体を一つにまとめた誤り、ひとつの個体を分割した誤り、見逃し、重複検出をそれぞれ報告します。セグメンテーションの指標と下流の計測誤差を並べて示すことで、両者の関係やトレードオフを確認できます。
モデル評価の根拠をまとめて残す
リリース候補のモデルごとに、次の情報を残します。
- データセットとアノテーションのバージョン
- 分割マニフェストと取得単位の概要
- 学習設定と実行ログ
- 採用したチェックポイントのハッシュ値
- 評価に使ったコードのバージョン
- クラス別・取得単位別の評価指標
- 代表的な例を目視確認した記録
- 既知の制約と想定する運用範囲
最良モデルのファイルだけを残してはいけません。元データと評価条件が分からなければ、そのモデルを使った科学的な結論を裏づけたり、評価結果を再確認したりできないからです。
まずは信頼できるベースラインを作る
セグメンテーションを初めて試す場合は、次の手順で進めると、結果を解釈しやすいベースラインを作れます。
- 対象クラスを絞り、対象のどこまでをマスクに含めるかを定める。
- アノテーションデータを自動検査と目視で確認する。
- 実運用で未知になる取得単位をテスト用に分ける。
- 本格的なチューニングを始める前に、手順を記録したベースラインモデルを一つ学習する。
- 検証データだけでモデルや設定を選ぶ。
- 固定したテストデータで一度だけ評価する。
- クラス別の指標と取得単位ごとの性能のばらつきを記録する。
- 代表的な失敗例を確認し、モデルを適用できる条件と限界を記録する。
データリークを招く分割方法で多くのモデル設定を試すより、まずこのベースラインで評価した方が、モデルの実力と改善点を正しく把握できます。
この学習・評価の流れを自組織だけで進めるのが難しい場合は、下の問い合わせ導線から、モデル学習・評価設計の支援についてもご相談いただけます。
お問い合わせ
構築・実装支援とアノテーション業務
環境構築や設計・実装の支援、アノテーション業務の委託について、ご相談いただけます。
よくある質問
アノテーション画像は何枚あれば十分ですか?
必要な枚数を一律には決められません。画像の総数よりも、クラス、地点、条件、取得グループの多様性が性能を左右することもあります。まずは学習曲線を確認し、エラーを分析します。
SAMが作ったマスクを正解として扱えますか?
いいえ。SAMの出力は提案にすぎません。アノテーションガイドラインに沿って人が確認し、レビュー結果と修正内容も記録します。
mean IoUだけで十分ですか?
十分ではありません。クラス別結果、グループ間のばらつき、空クラスの扱い、目視で確認した失敗例を確認します。計数・サイズ推定に使うなら、それらの誤差も加えます。
論文のスコアと直接比較できますか?
データセットのバージョン、分割方法、前処理、クラス、指標実装が一致するときだけ比較できます。条件が一つでも違えば、数値が表す性能も異なります。
