画像セグメンテーションの基礎 - 領域分割の原理と応用を理解する
画像セグメンテーションとは - ピクセル単位で画像を理解する技術
画像セグメンテーションとは、画像の各ピクセルにラベル (カテゴリ) を割り当て、画像を意味のある領域に分割する技術です。物体検出がバウンディングボックス (矩形) で物体の位置を示すのに対し、セグメンテーションはピクセル単位の精密な境界を提供します。
セグメンテーションの 3 つのタイプ:
- セマンティックセグメンテーション: 各ピクセルをカテゴリ (人、車、道路、空など) に分類する。同じカテゴリの複数オブジェクトは区別しない。例: 画像内の全ての「人」ピクセルが同じラベルを持つ
- インスタンスセグメンテーション: 同じカテゴリの個別オブジェクトを区別する。例: 画像内の「人 A」「人 B」「人 C」をそれぞれ別のマスクとして出力
- パノプティックセグメンテーション: セマンティックとインスタンスを統合。数えられるもの (人、車) はインスタンス単位で、数えられないもの (空、道路) はセマンティック単位で分割
Web での活用事例:
- 背景除去 (ポートレートモード、ビデオ会議の仮想背景)
- 画像編集ツール (選択範囲の自動検出)
- EC サイトの商品画像自動切り抜き
- 医療画像の病変領域検出
- 自動運転の環境認識
近年は深層学習の発展により、セグメンテーションの精度が飛躍的に向上しました。特に 2023 年に Meta が公開した SAM (Segment Anything Model) は、事前学習なしであらゆる画像に対してゼロショットでセグメンテーションを実行できる汎用モデルとして注目を集めています。
古典的手法 - 閾値処理とエッジ検出によるセグメンテーション
深層学習以前のセグメンテーション手法は、ピクセルの色値やエッジ情報に基づく規則ベースのアプローチでした。計算コストが低く、特定の条件下では今でも有効です。
閾値処理 (Thresholding): 最もシンプルな手法で、ピクセル値が閾値を超えるかどうかで前景と背景を分離します。大津の方法 (Otsu's method) は、クラス間分散を最大化する最適な閾値を自動決定するアルゴリズムで、OpenCV の cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) で簡単に実装できます。背景と前景のコントラストが明確な画像 (文書スキャン、X 線画像など) で効果的です。
エッジ検出ベース: Canny エッジ検出器で輪郭を抽出し、閉じた輪郭で囲まれた領域をセグメントとする手法です。Sobel フィルタや Laplacian フィルタでエッジの勾配を計算し、非極大値抑制とヒステリシス閾値処理で精密なエッジを検出します。
領域成長法 (Region Growing): シード点から開始し、隣接ピクセルが類似条件 (色差が閾値以内) を満たす場合に領域を拡張していく手法です。均一な色の領域を正確に抽出できますが、シード点の選択に依存し、テクスチャの多い画像では過分割が発生しやすい欠点があります。
GrabCut アルゴリズム: ユーザーが大まかな矩形を指定すると、ガウス混合モデル (GMM) とグラフカットで前景と背景を分離するインタラクティブな手法です。OpenCV の cv2.grabCut で利用可能で、背景除去ツールの基盤技術として広く使われてきました。精度は深層学習に劣りますが、学習データが不要で軽量に動作する利点があります。
深層学習ベースの手法 - FCN から U-Net、DeepLab まで
2015 年以降、深層学習ベースのセグメンテーション手法が急速に発展し、古典的手法を大幅に上回る精度を達成しています。主要なアーキテクチャの進化を追います。
FCN (Fully Convolutional Network, 2015): 画像分類用の CNN (VGG, ResNet など) の全結合層を畳み込み層に置き換え、ピクセル単位の予測を可能にした先駆的モデルです。アップサンプリングにデコンボリューション (転置畳み込み) を使用し、入力と同じ解像度の出力マップを生成します。
U-Net (2015): エンコーダ・デコーダ構造にスキップ接続を追加したアーキテクチャです。エンコーダで抽出した高解像度の特徴マップをデコーダに直接接続することで、細かい境界の復元精度が大幅に向上しました。医療画像セグメンテーションで特に高い性能を発揮し、少量の学習データでも良好な結果が得られます。
DeepLab シリーズ (2016-2018): Atrous Convolution (Dilated Convolution) を導入し、受容野を拡大しながら解像度を維持する手法です。DeepLab v3+ では ASPP (Atrous Spatial Pyramid Pooling) でマルチスケールの文脈情報を統合し、PASCAL VOC 2012 で mIoU 89.0% を達成しました。
Transformer ベース (2021-): SegFormer、Mask2Former などの Vision Transformer ベースのモデルが登場し、CNN ベースを上回る精度を達成しています。自己注意機構により画像全体の文脈を捉えられるため、大きなオブジェクトや複雑なシーンでの性能が向上しています。ただし、計算コストが高く、リアルタイム処理には工夫が必要です。
SAM (Segment Anything Model) - 汎用セグメンテーションの革命
SAM (Segment Anything Model) は Meta AI が 2023 年に公開した基盤モデルで、11 億枚の画像と 11 億個のマスクで事前学習されています。特定のタスクやドメインに特化せず、あらゆる画像に対してゼロショットでセグメンテーションを実行できる汎用性が最大の特徴です。
SAM のアーキテクチャ:
- Image Encoder: ViT-H (Vision Transformer Huge) ベース。画像を 1 回エンコードすれば、複数のプロンプトに対して再利用可能
- Prompt Encoder: ポイント (クリック位置)、ボックス (矩形選択)、テキスト、マスクなど多様なプロンプトを受け付ける
- Mask Decoder: 軽量な Transformer デコーダで、プロンプトに対応するマスクを高速に生成
SAM の活用パターン:
- インタラクティブセグメンテーション: ユーザーがクリックした点を含むオブジェクトのマスクを即座に生成。画像編集ツールの「マジック選択」機能に最適
- 自動セグメンテーション: 画像全体にグリッド状のポイントプロンプトを配置し、全オブジェクトのマスクを一括生成
- ゼロショット転移: 医療画像、衛星画像、顕微鏡画像など、学習データに含まれないドメインでも高い精度を発揮
SAM 2 (2024): 動画対応版として SAM 2 が公開され、フレーム間の時間的一貫性を保ったセグメンテーションが可能になりました。1 フレームでオブジェクトを指定すれば、動画全体を通じてそのオブジェクトを追跡・セグメントします。
Web での利用は、ONNX Runtime Web や TensorFlow.js でモデルを実行するか、サーバーサイドで推論して結果のマスクをクライアントに返す構成が一般的です。SAM の Image Encoder は計算コストが高い (ViT-H で約 600ms/画像 on GPU) ため、リアルタイム用途では軽量版の MobileSAM や EfficientSAM の利用を検討してください。
評価指標と精度の理解 - IoU、mIoU、Dice 係数
セグメンテーションモデルの性能を正しく評価するために、主要な評価指標を理解しておく必要があります。
IoU (Intersection over Union): 予測マスクと正解マスクの重なり具合を測定する最も基本的な指標です。計算式は IoU = (予測 ∩ 正解) / (予測 ∪ 正解) で、0 (完全不一致) から 1 (完全一致) の値を取ります。一般的に IoU 0.5 以上を「正しいセグメンテーション」と判定します。
mIoU (mean IoU): 全カテゴリの IoU の平均値です。セマンティックセグメンテーションの標準的な評価指標で、PASCAL VOC や Cityscapes などのベンチマークで使用されます。2024 年時点の SOTA (State of the Art) は Cityscapes で mIoU 85% 以上を達成しています。
Dice 係数 (F1 スコア): 医療画像セグメンテーションで広く使われる指標で、Dice = 2 * (予測 ∩ 正解) / (|予測| + |正解|) で計算されます。IoU と単調な関係にあり、Dice = 2*IoU / (1+IoU) で相互変換可能です。Dice は IoU より値が大きくなるため、論文での数値が良く見える傾向があります。
Pixel Accuracy: 正しく分類されたピクセルの割合です。計算が簡単ですが、クラス不均衡に弱い欠点があります。例えば、画像の 90% が背景の場合、全ピクセルを背景と予測するだけで 90% の精度が得られてしまいます。
Boundary F1 Score: セグメンテーション境界の精度を評価する指標です。境界から一定距離 (通常 2-5 ピクセル) 以内の予測を正解とみなします。エッジの精密さが重要な用途 (画像切り抜き、合成) で特に重要です。
Web ブラウザでのセグメンテーション実装 - TensorFlow.js と ONNX Runtime
セグメンテーションモデルをブラウザ上で実行する方法と、実用的な実装パターンを紹介します。サーバーレスで動作するため、プライバシーの観点からも有利です。
TensorFlow.js による実装: Google が提供する BodyPix や MediaPipe の Selfie Segmentation は、ブラウザ上でリアルタイムに人物セグメンテーションを実行できます。
import * as bodySegmentation from '@tensorflow-models/body-segmentation';const model = bodySegmentation.SupportedModels.MediaPipeSelfieSegmentation;const segmenter = await bodySegmentation.createSegmenter(model);const people = await segmenter.segmentPeople(image);
MediaPipe Selfie Segmentation は 256 × 256の入力解像度で動作し、モバイルデバイスでも 30fps 以上のリアルタイム処理が可能です。出力はピクセルごとの確率マップで、閾値 (通常 0.5-0.7) で二値化してマスクを生成します。
ONNX Runtime Web による実装: PyTorch で学習したモデルを ONNX 形式にエクスポートし、ブラウザの WebAssembly または WebGL バックエンドで実行できます。SAM の軽量版 (MobileSAM) を ONNX 化してブラウザで動かす実装例も公開されています。
実装上の注意点:
- モデルサイズ: ブラウザにダウンロードするモデルファイルは 5-50MB 程度。初回読み込み時間を考慮し、プログレッシブローディングや Service Worker でのキャッシュを実装する
- メモリ管理: GPU メモリの解放を明示的に行う。TensorFlow.js では
tf.dispose()、ONNX Runtime ではsession.release()を忘れずに呼ぶ - Web Worker: 推論処理をメインスレッドから分離し、UI のブロッキングを防止する。
OffscreenCanvasと組み合わせると、描画もワーカースレッドで実行可能
サーバーサイド推論との使い分けとして、リアルタイム性が必要な場合 (ビデオ会議の背景除去) はブラウザ実行、高精度が必要な場合 (EC サイトの商品切り抜き) はサーバーサイドで SAM を実行する構成が推奨されます。