近年、コンピュータビジョンは、特に画像のセグメンテーションや物体検出タスクにおいて目覚ましい進歩を遂げています。最近の注目すべき進歩の 1 つは、画像と入力キューからオブジェクト マスクを効率的に予測するように設計された多用途の深層学習モデルであるセグメンテーション任意モデル (SAM) です。強力なエンコーダとデコーダを利用することで、SAM はさまざまなセグメンテーション タスクを処理できるため、研究者や開発者にとって非常に貴重なツールになります。
推奨事項: NSDT エディターを使用して、プログラム可能な 3D シーンを迅速に構築する
1. SAM モデルの概要
SAM は、画像エンコーダ (通常は Vision Transformer (ViT)) を使用して、マスク予測の基礎となる画像埋め込みを抽出します。モデルには、ポイント座標、境界ボックス、低解像度マスク入力などのさまざまなタイプの入力ヒントをエンコードするヒント エンコーダーも含まれています。これらのエンコードされたキューは、画像埋め込みとともにマスク デコーダに供給され、最終的なオブジェクト マスクが生成されます。
上記のアーキテクチャにより、エンコードされた画像のヒントを迅速かつ簡単に得ることができます。
SAM は、次のようなさまざまなプロンプトを処理するように設計されています。
- マスク: モデルをガイドするための初期入力として、粗い低解像度のバイナリ マスクを提供できます。
ポイント: ユーザーは、[x, y] 座標とそのタイプ (前景または背景) を入力して、オブジェクトの境界を定義できます。 - ボックス: 境界ボックスを座標 [x1, y1, x2, y2] で指定して、オブジェクトの位置とサイズをモデルに伝えることができます。
- テキスト: テキスト ヒントは、追加のコンテキストを提供したり、関心のあるオブジェクトを指定したりするために使用することもできます。
SAM のアーキテクチャをさらに深く掘り下げると、その主要なコンポーネントを調べることができます。
- 画像エンコーダ: SAM のデフォルトの画像エンコーダは ViT-H ですが、特定の要件に応じて ViT-L または ViT-B も使用できます。
- ダウンサンプリング: ヒント付きバイナリ マスクの解像度を下げるために、一連の畳み込み層が使用されます。
- ヒント エンコーダー: 位置エンベディングはさまざまな入力キューをエンコードするために使用され、画像内のオブジェクトの位置とコンテキストをモデルに知らせるのに役立ちます。
- マスク デコーダ: 修正された Transformer エンコーダは、エンコードされたキューと画像の埋め込みを最終的なオブジェクト マスクに変換するマスク デコーダとして使用されます。
- 有効なマスク: 任意のプロンプトに対して、SAM は最も関連性の高い 3 つのマスクを生成し、ユーザーに幅広い選択肢を提供します。
彼らは、フォーカス、ダイス、IoU 損失の重み付けされた組み合わせを使用してモデルをトレーニングします。重みはそれぞれ 20、1、1 です。
SAM の強みは、さまざまなキュー タイプで正確なセグメンテーション マスクを生成できるため、その適応性と柔軟性にあります。さまざまな自然言語処理アプリケーションの強固な基盤として機能する基本的な言語モデル (LLM) と同様に、SAM もコンピューター ビジョン タスクの強固な基盤を提供します。このモデルのアーキテクチャは、下流タスクの微調整が容易になるように設計されており、特定のユースケースやドメインに合わせて調整できるようになります。タスク固有のデータに合わせて SAM を微調整することで、開発者はそのパフォーマンスを強化し、アプリケーション固有の要件を確実に満たすことができます。
この微調整機能により、SAM はさまざまなシナリオで優れたパフォーマンスを達成できるだけでなく、より効率的な開発プロセスも促進されます。事前トレーニングされたモデルを出発点として使用すると、開発者は最初から始めるのではなく、特定のタスクに合わせてモデルを最適化することに集中できます。このアプローチは、時間とリソースを節約するだけでなく、事前トレーニングされたモデルにエンコードされた広範な知識を活用し、より堅牢で正確なシステムを実現します。
2. 自然言語プロンプト
テキスト キューと SAM の統合により、モデルは高度に具体的でコンテキストを認識したオブジェクト セグメンテーションを実行できます。自然言語キューを活用することで、SAM は、意味論的なプロパティ、属性、またはシーン内の他のオブジェクトとの関係に基づいて、対象のオブジェクトをセグメント化できます。
SAM のトレーニングでは、公的に利用可能な最大の CLIP モデル (ViT-L/14@336px) を使用してテキストと画像の埋め込みを計算します。これらの埋め込みは、トレーニング プロセスで使用される前に正規化されます。
トレーニング ヒントを生成するには、まず各マスクの周囲の境界ボックスを 1x から 2x の範囲のランダムな係数で拡張します。展開されたボックスはアスペクト比を維持するために正方形にトリミングされ、336 × 336 ピクセルにサイズ変更されます。トリミングされた画像を CLIP 画像エンコーダに入力する前に、マスクの外側のピクセルが 50% の確率でゼロ化されます。エンコーダーの最後の層は、マスクされたアテンションを使用して、埋め込みがオブジェクトに焦点を当てていることを保証し、それによって出力トークンのアテンションをマスク内の画像位置に限定します。トークンの埋め込みを最終ヒントとして出力します。トレーニング中、最初に CLIP ベースのキューが提供され、次に反復的なポイント キューが提供されて予測を調整します。
推論のために、未変更の CLIP テキスト エンコーダを使用して SAM 用のプロンプトが作成されます。このモデルは、CLIP によって有効になるテキストと画像の埋め込みの位置合わせに依存しているため、推論にテキストベースの手がかりを使用しながら、明示的なテキストの監視なしでトレーニングを行うことができます。このアプローチにより、SAM は自然言語キューを効果的に利用して、正確でコンテキストを認識したセグメンテーション結果を達成できるようになります。
残念ながら、Meta はテキスト エンコーダを備えた SAM の重みを (まだ?) リリースしていません。
3、lang-segment-anything
lang-segment-anythingライブラリは、GroundingDino と SAM の利点を組み合わせて、オブジェクトの検出とセグメンテーションのための革新的な方法を提案します。
最初に、GroundingDino はゼロショットのテキストから境界ボックスへのオブジェクト検出を実行します。これにより、自然言語の記述に基づいて画像内の対象オブジェクトを効率的に識別します。これらの境界ボックスは、認識されたオブジェクトの正確なセグメンテーション マスクを生成する SAM モデルの入力ヒントとして使用されます。
from PIL import Image
from lang_sam import LangSAM
from lang_sam.utils import draw_image
model = LangSAM()
image_pil = Image.open('./assets/car.jpeg').convert("RGB")
text_prompt = 'car, wheel'
masks, boxes, labels, logits = model.predict(image_pil, text_prompt)
image = draw_image(image_pil, masks, boxes, labels)
4. ライトニングAIアプリケーション
Lightning AI アプリフレームワークを使用してアプリを迅速にデプロイできます。ServeGradio コンポーネントを使用して、UI を通じてモデルをデプロイします。ServeGradio について詳しくは、こちらをご覧ください。
import os
import gradio as gr
import lightning as L
import numpy as np
from lightning.app.components.serve import ServeGradio
from PIL import Image
from lang_sam import LangSAM
from lang_sam import SAM_MODELS
from lang_sam.utils import draw_image
from lang_sam.utils import load_image
class LitGradio(ServeGradio):
inputs = [
gr.Dropdown(choices=list(SAM_MODELS.keys()), label="SAM model", value="vit_h"),
gr.Slider(0, 1, value=0.3, label="Box threshold"),
gr.Slider(0, 1, value=0.25, label="Text threshold"),
gr.Image(type="filepath", label='Image'),
gr.Textbox(lines=1, label="Text Prompt"),
]
outputs = [gr.outputs.Image(type="pil", label="Output Image")]
def __init__(self, sam_type="vit_h"):
super().__init__()
self.ready = False
self.sam_type = sam_type
def predict(self, sam_type, box_threshold, text_threshold, image_path, text_prompt):
print("Predicting... ", sam_type, box_threshold, text_threshold, image_path, text_prompt)
if sam_type != self.model.sam_type:
self.model.build_sam(sam_type)
image_pil = load_image(image_path)
masks, boxes, phrases, logits = self.model.predict(image_pil, text_prompt, box_threshold, text_threshold)
labels = [f"{phrase} {logit:.2f}" for phrase, logit in zip(phrases, logits)]
image_array = np.asarray(image_pil)
image = draw_image(image_array, masks, boxes, labels)
image = Image.fromarray(np.uint8(image)).convert("RGB")
return image
def build_model(self, sam_type="vit_h"):
model = LangSAM(sam_type)
self.ready = True
return model
app = L.LightningApp(LitGradio())
以上で、アプリケーションがブラウザで起動します。
5。結論
これで区分的任意モデルの紹介は終わりです。SAM がコンピュータ ビジョンの研究者や開発者にとって貴重なツールであることは明らかであり、さまざまなセグメンテーション タスクを処理し、さまざまなキュー タイプに適応することができます。そのアーキテクチャにより実装が容易になり、特定のユースケースやドメインに合わせて調整できるほど汎用的になります。全体として、SAM はすぐに機械学習コミュニティにとって大きな資産となり、今後もこの分野で大きな波を起こし続けることは間違いありません。