CLIPSeg を用いたゼロショット画像セグメンテーション
TL;DR
CLIPSeg は、特定のカテゴリでモデルを学習させることなく、テキスト記述または例画像(ビジュアルプロンプト)を用いて画像内のオブジェクトをセグメントできるゼロショット画像セグメンテーションモデルです。粗く低解像度のマスクを提供しますが、ロボット認識、画像インペインティング、より精密なセグメンテーションモデルのファインチューニング用の事前ラベル生成など、幅広い用途に活用できます。
CLIPSeg の仕組み:CLIP 埋め込みの活用
CLIPSeg は、OpenAI が開発した CLIP(Contrastive Language–Image Pre-training)を基盤にすることでゼロショットセグメンテーションを実現しています。CLIP は画像とテキストの抽象的な表現(埋め込み)を共有の高次元空間に作り出し、類似した概念が近くに配置されます。
セグメンテーションを可能にするため、CLIPSeg は PhraseCut データセット(34 万以上のフレーズと対応するマスクを含む)で学習した Transformer ベースのデコーダを使用します。技術的なアーキテクチャは以下の通りです:
- Frozen CLIP Backbone: トレーニング中も基盤となる CLIP モデルは凍結されたままです。
- Decoder Integration: デコーダは対象画像の CLIP 表現とプロンプト(テキストまたは画像)の CLIP 表現を受け取ります。
- Layer Utilization: デコーダは最終的な CLIP 表現だけでなく、複数の中間 CLIP 層の出力も利用して二値セグメンテーションマスクを生成します。
主な機能:テキストとビジュアルプロンプト
CLIPSeg は、オブジェクトを特定してセグメントするために 2 種類のプロンプトを扱える点が特徴です。
テキストプロンプト
ユーザーはテキスト文字列(例:"pancakes" や "blueberries")をプロンプトとして提供できます。モデルはこれらの単語の CLIP テキスト埋め込みを使用して、画像中の該当オブジェクトを検出しマスクします。
ビジュアルプロンプト
CLIPSeg はテキストの代わりに例画像をプロンプトとして使用できます。これは、衣類の特定ロゴなど、言葉で説明しにくいオブジェクトに特に有用です。ビジュアルプロンプトを最適化するために、研究では次のことが提案されています:
- Cropping: プロンプト画像は対象オブジェクトのみが含まれるように切り取るべきです。
- Background Modification: プロンプト画像の背景をぼかすまたは暗くすることで、結果が若干改善されることがあります。
技術的制限と実用的応用
柔軟性は高いものの、CLIPSeg には以下のような技術的制約があります。
- Resolution: モデルは 352 x 352 ピクセルの画像で動作し、低解像度で「ぼやけた」出力マスクとなり、ピクセル単位での正確さはありません。
- Use Case: 解像度の制限により、粗い位置特定や、さらなる精緻化の出発点としての利用が最適です。
高精度セグメンテーションのワークフロー
CLIPSeg が提供する粗いラベルを利用して、高品質データセットの作成を加速できます。推奨されるワークフローは、CLIPSeg で初期の事前ラベルを生成し、Segments.ai のようなラベリングツールでマスクを洗練し、最終的に洗練されたデータで最先端のセグメンテーションモデル(例:SegFormer)をファインチューニングする、という流れです。
Hugging Face Transformers での実装
CLIPSeg は ‹‹transformers‹‹ ライブラリに統合されています。実装には CLIPSegProcessor と CLIPSegForImageSegmentation クラスが必要です。
テキストプロンプトの場合、プロセッサはテキストと画像の両方を処理します。ビジュアルプロンプトの場合、プロセッサは対象画像とプロンプト画像の別々の埋め込みを生成し、それらを conditional_pixel_values としてモデルに渡します。