「点は具体的で曖昧、言葉は抽象的で明確」SAM3が解決した入力のパラドックス
ここ何回で、DetectorやTrackerの実装詳細、そしてその役割分担を深掘りしてきました。
実装レベルでの理解が進んだことで、「なぜSAM3はここまで強力に感じるのか?」 という、より本質的な理由が見えてきた。
それは、入力データの「具体性」と「曖昧性」のパラドックスを解決した点にあるのでは? と。
今回はコードの話というよりは、SAM2からSAM3へのパラダイムシフトについての考察です。
1. SAM2までのジレンマ:幾何学プロンプトは「具体的に見えて曖昧」
SAM1やSAM2の入力は、以下の「幾何学的プロンプト」が主でした。
- 点(Point)
- ボックス(Box)
- マスク(Mask)
これらは座標データであり、物理的には非常に具体的(Specific)です。「座標 (x, y) を見ろ」というのは、1ピクセルの狂いもない命令です。
しかし、モデルにとってその意図は猛烈に曖昧(Ambiguous)なのです。
「点」の曖昧さ
例えば、人物の「目」の部分に点を1つ打ったとします。
モデルはこの1点から、以下のどれを指しているか推測しなければなりません:
1. **「瞳孔」**?(Part of Part)
2. **「目」**?(Part)
3. **「顔」**?(Sub-Object)
4. **「人物全体」**?(Whole Object)
SAM2までは、この**Semantic Ambiguity(意味的な曖昧さ)を、「multi-mask output(例えば3つの候補を出す)」などで解決しようとしてきました。
つまり、「座標は確実だけど、意味は弱い。だから意味はモデルが頑張って推測する」**というのがSAM2のアプローチでした。
補足:
これは 公式でも "Ambiguity Aware" な設計として強調されています。
-
曖昧性の本質:
- 1つの点(プロンプト)は、論理的に複数の解釈が可能です。
- 全体(Whole Object):人物全体
- 部分(Part):顔
- サブ部分(Sub-part):目
- これは「エラー」ではなく、物理的な座標入力につきまとう「避けられない性質」です。
- 1つの点(プロンプト)は、論理的に複数の解釈が可能です。
-
SAM/SAM2の解決策(Multi-mask Output):
- モデルはデフォルトで3つのマスクを出力します。
- それぞれが異なる粒度(全体、部分、サブ部分)に対応するように学習されています。
- 各マスクには IoU Score(確信度)が付与され、ユーザーや下流タスクが最適なものを選択できるようになっています。
* SAM2のアプローチ:
* 「曖昧なまま受け取り、複数の可能性を提示して、ユーザー(またはIoUスコア)に選ばせる」
* 事後解決型
* SAM3のアプローチ:
* 「言語(テキスト)によって、最初から曖昧性を排除した状態で検索させる」
* 事前解決型
2. SAM3の革命:テキストプロンプトは「曖昧に見えて意味が具体的」
SAM3で導入された「Language Region Reasoning」は、この構造を逆転させました。
テキスト(自然言語)は、座標を持たないため、空間的には抽象的(Abstract)です。
しかし、意味(Intent)は圧倒的に明確です。
"face""left eye""person""the dog on the right"
これらは抽象的な記号ですが、モデルに対して 「どこが境界(Boundary)になるべきか」 を一意に近く定義します。
言語の強み:Concept to Region
SAM3の内部では、DINOv2やCLIP-likeなアライメントにより、「意味的コンセプト」から「領域」への直接射影が行われます。
「顔」という言葉が入力された瞬間、スクリーンスペース上に顔が複数あったとしても、それぞれの境界(Boundary)の定義は具体的であり、時間的な一貫性も持ちます。
つまり、
- 幾何学入力:場所はわかるが、範囲(概念)がわからない。
- テキスト入力:場所は(最初は)わからないが、範囲(概念)の定義が明確。
SAM3にとって、テキストは 「意味の曖昧さを排除する最強のツール」 なのです。
さらに動画モデルとして考えた時に、対象が動いていても同じテキストプロンプトでずっとそれを差し続けることができるというメリットもあります。座標を指定した場合はその座標を更新し続ける必要があります。SAM2はこれに対してHieraモデルによるTrackingを行っていました。
注)SAM3は同じテキストプロンプトで毎フレーム、領域を更新続けるわけではなく、信頼スコアとIoUベースで更新するかどうかを判断してます。基本的にはプロンプトフレームで指した領域をViTベースのTrackerで追跡します。ここにさらに条件に合致したところを更新します。
3. パラダイムシフト:具体性の源泉が変わった
この気付きを整理すると、SAM2からSAM3への変化は以下のように言えます。
| モデル | 具体性の源泉 | 曖昧さの処理 |
|---|---|---|
| SAM2 | 座標の具体性 (Geometry-driven) | 意味が曖昧。 → モデルが推測する。 |
| SAM3 | 意味の具体性 (Semantics-driven) | 場所が抽象的。 → Detectorが発見する。 |
「入力はより具体的(座標)なのに、そこから導かれる意味は曖昧」 という幾何学プロンプトの弱点を、
「入力は抽象的(テキスト)なのに、境界定義は圧倒的に明確」 という意味プロンプトが補完した。
これがSAM3の本質的な進化です。
${\large \textsf{意味的な抽象化が幾何学的な曖昧さを上書きする}}$
この構造があるからこそ、「Detector」があれほど重厚な仕組み(Text Encoder + Cross Attention)を持ってまで、最初にテキストを処理する必要があったのです。
4. 座標 × 意味 はできないのか?
SAM3が優れているのは、これを統合した点ですが、同時に使えるわけではありません。ここが重要なポイントです。
コード(sam3/model/sam3_video_inference.py)を確認すると、APIレベルで排他制御されています:
# pointsがある場合、textはNoneでなければならない
assert (
text_str is None and boxes_xywh is None
), "When points are provided, text_str and boxes_xywh must be None."
つまり、「テキストで検索しながら、同時にポイントで場所を指定する」ことはできません。
以下のような手法でそれはある程度解消されます。
Step 1: テキストで「意味」を定義 (Detector)
まず、Detectorを使って意味的な検索を行います。
# 1. テキストで検出(Detectorが起動)
# "person" という概念に合致するものを全探索
predictor.add_prompt(text="person")
# -> 結果: 複数の候補が見つかり、obj_id が割り振られる
Step 2: 座標で「対象」を確定・修正 (Tracker)
次に、返ってきた obj_id に対してポイントを与え、Trackerで特定・修正します。
# 2. ポイントで特定・修正(Trackerが起動)
# "この" 場所にある obj_id=1 を修正せよ
predictor.add_prompt(
points=[[x, y]],
point_labels=[1],
obj_id=1
)
あくまでアイデアレベルの提案ですが。
5. まとめ
- SAM2まで:入力(点)は具体的だが、意図が伝わりにくい。「これ」と言って指差しているが、指の先にある何(細胞?服?人?)を指しているか不明な状態。
- SAM3:言葉は抽象的だが、境界定義は明確。「人」と言えば、それがどんな姿勢でも境界は決まる。
SAM3は「意味的抽象化によって、幾何学的曖昧さを解決した」モデルである。
ただし、それは同時入力による解決ではなく、
「意味による検出」→「幾何学による追跡・修正」
という役割分担によって実現されている。
コードの add_prompt 関数にあるたった数行の assert が、この役割分担(Detector vs Tracker)の厳格さを裏付けてます。