
NVIDIA Cosmos-Reason2 で画像と動画の構造化分析を DGX Spark で試してみた
はじめに
こんにちは、クラスメソッド製造ビジネステクノロジー部の森茂です。
NVIDIA の Cosmos-Reason2 は、動画や画像を入力として物理世界の因果関係や空間構造を推論する VLM(Vision-Language Model)です。ロボットの行動計画や自動運転の安全判断など、Physical AI のユースケースに向けて設計されています。
Reason2 というと「動画の内容を質問すると自然言語で回答してくれるモデル」という印象が強いかもしれません。自分も以前の記事ではそうした使い方しかしていませんでした。しかし改めてリポジトリを見ると、バウンディングボックスの座標を JSON で返したり、動画中のイベントにタイムスタンプを付けたり、ロボットの移動軌道をピクセル座標で出力したりと、構造化データを返すプロンプトテンプレートが 10 種類も用意されていました。
この記事では、そうした「構造化出力」にフォーカスして、10 種のテンプレートから 6 つを選び、2B と 8B の両モデルを DGX Spark で実機検証した結果を紹介します。
Reason2 のプロンプトテンプレートを整理する
Reason2 のリポジトリには prompts/ ディレクトリに 10 種類のプロンプトテンプレートが用意されています。大きく分けると 3 つのカテゴリに整理できます。
それぞれのテンプレートの概要を一覧にまとめました。
| テンプレート | 入力 | 出力 | 内容 |
|---|---|---|---|
2d_grounding |
画像 + オブジェクト名 | JSON(bbox 座標) | 指定オブジェクトのバウンディングボックスを [x1, y1, x2, y2] で返す |
temporal_localization |
動画 | JSON(タイムスタンプ) | イベントの開始・終了時刻を mm:ss.ff 形式で返す |
robot_cot |
画像 + タスク指示 | JSON(軌道座標) | エンドエフェクタの 2D 軌道を [x, y] のポイント列で返す |
describe_anything |
画像 | JSON(subject 一覧) | 画像中のオブジェクトに ID・カテゴリ・キャプションを付けて返す |
embodied_reasoning |
画像 | 自然言語 + CoT | シーンを観察して「次に何をすべきか」を推論する |
av_cot |
動画 | 自然言語 + CoT | 車載カメラ映像から安全走行に重要なオブジェクトを特定する |
caption |
動画 | 自然言語 | 動画の内容を詳細にキャプションする |
causal |
動画 | 自然言語 | 「この状況で次に何が起きるか」を予測する |
causal_vqa |
動画 + オブジェクト名 | 自然言語 | 特定のオブジェクトに対する因果推論(「この人は X で何をしている? 次に何をする?」) |
mvp_bench |
動画 | 選択肢(A/B) | 動画が物理法則に沿っているかを判定するベンチマーク用プロンプト |
上の 4 つ(構造化出力)が今回の記事の主役です。caption と causal / causal_vqa は動画に対して自然言語で回答するタイプで、Cosmos 記事で「水を注ぐ動画」や「卵を割る動画」で試した機能にあたります。mvp_bench はモデルの物理理解力を評価するためのプロンプトで、推論用途ではありません。
Reason2 は Qwen3-VL をベースにした VLM で、Physical AI 向けの SFT と強化学習(RL)で後訓練されています。RL では物体の認識精度、空間的な制約の遵守、時間推移の正確性をルールベースの報酬で評価しており、この訓練が構造化出力の品質に効いているようです。
検証環境
| 項目 | 値 |
|---|---|
| デバイス | NVIDIA DGX Spark |
| SoC | Grace Blackwell GB10 |
| メモリ | 128GB 統合メモリ(CPU/GPU 共有) |
| CUDA | 13.0.2 |
| ドライバ | 580.142 |
| PyTorch | 2.9.0+cu130 |
| transformers | 4.57.3 |
セットアップ
リポジトリの README に沿ってセットアップします。DGX Spark では CUDA 13.0 の --extra cu130 を指定します。
git clone https://github.com/nvidia-cosmos/cosmos-reason2.git
cd cosmos-reason2
uv sync --extra cu130
推論方法は transformers 直接推論と vLLM サーバーの 2 つがあり、README にはそれぞれの手順が記載されています。今回の比較検証は transformers で行い、vLLM でも動作を確認しました。
import torch
from transformers import AutoProcessor, Qwen3VLForConditionalGeneration
model = Qwen3VLForConditionalGeneration.from_pretrained(
"nvidia/Cosmos-Reason2-8B",
torch_dtype=torch.bfloat16,
attn_implementation="sdpa",
).to("cuda")
vLLM を使う場合は TRITON_PTXAS_PATH の設定が必要です。README の手順に従って uv sync --extra cu130 でインストールすれば、vllm serve で OpenAI 互換 API が立ち上がります。
2B と 8B のメモリ比較
| モデル | GPU メモリ | ロード時間 |
|---|---|---|
| 2B | 4.3 GB | 28 秒 |
| 8B | 17.5 GB | 95 秒 |
どちらも 128GB に対して余裕があるので、用途に合わせて選べます。
2D Grounding でバウンディングボックスを出力する
今回一番試したかった機能がこれです。プロンプトテンプレートはとてもシンプルで、Locate the bounding box of {object_name}. Return a json. とオブジェクト名を指定するだけです。
ロボットアームのシーンで試す
リポジトリに付属するサンプル画像(テーブルの上にバスケット、テープロール、2 本のロボットアーム)で 3 つのオブジェクトを検出してみました。
8B の結果
[
{ "bbox_2d": [459, 632, 568, 815], "label": "blue tape roll" },
{ "bbox_2d": [322, 248, 624, 556], "label": "gray basket" },
{ "bbox_2d": [51, 451, 254, 992], "label": "robot arm" },
{ "bbox_2d": [657, 398, 925, 992], "label": "robot arm" }
]
bbox_2d は [x1, y1, x2, y2] 形式で、左上と右下の座標を返しています。値は 0-1000 の正規化座標で、実際のピクセル位置に変換するには画像の幅・高さで 値 × 実寸 / 1000 とスケーリングします。Qwen-VL 系のモデルに共通する仕様ですね。robot arm を 2 本それぞれ個別のバウンディングボックスで検出しているのが印象的です。
画像に重ねてみるとこうなります。

ファインチューニングなしのベースモデルでここまで正確に位置を特定できるのは、正直驚きました。
2B では何が変わるか
同じ画像で 2B モデルを試すと、テープロールとバスケットの座標はほぼ同じですが、robot arm は右側の 1 本しか検出できませんでした。
| オブジェクト | 2B | 8B |
|---|---|---|
| blue tape roll | [458, 629, 569, 815] |
[459, 632, 568, 815] |
| gray basket | [321, 250, 623, 562] |
[322, 248, 624, 556] |
| robot arm | 1 本のみ | 2 本個別に検出 |
座標値のズレは数ピクセル程度で、bbox の精度自体は 2B でも十分です。ただし、同種の複数オブジェクトを個別に検出する能力は 8B の方が高いようです。

PPE 検出でファインチューニングなしの実力を確認する
LoRA SFT 記事では Reason2 をファインチューニングして PPE の違反検出精度を 46.7% から 90.0% に改善しました。では、ベースモデルの 2D Grounding でヘルメットやベストのバウンディングボックスはどの程度取れるのでしょうか。
建設現場の画像(ヘルメット 2 名、安全ベスト 1 名)で試してみました。

画像出典: Pexels
8B モデルは白いヘルメットと黄色いヘルメットの両方を検出し、安全ベストと人物も正しく囲んでいます。ファインチューニングなしでこれだけ検出できるなら、用途によってはベースモデルの 2D Grounding だけで事足りるケースもありそうです。
一方、2B モデルではヘルメットの bbox が頭部だけでなく上半身まで含んでしまい、粒度が粗くなりました。

ここから見える使い分けとしては、「何がどこにあるか」を大まかに把握するなら 2B で十分、ピクセル精度で位置を特定するなら 8B という住み分けでしょうか。
Temporal Localization で動画にタイムスタンプを付ける
次は動画を入力として、イベントの発生時刻を mm:ss.ff 形式のタイムスタンプ付き JSON で返す機能です。
倉庫で作業者が段ボール箱を運ぶ 18 秒の動画を入力したところ、8B はシーン全体を 1 つのイベントとして捉え、作業者の服装や周囲の状況まで含めた詳細なキャプションを JSON で返しました。
[
{
"start": "00:00.200",
"end": "00:01.200",
"caption": "A man wearing a blue beanie, a brown and beige jacket, and
white gloves is seen from behind carrying a large cardboard box on his
shoulder as he walks forward through a bustling warehouse aisle. In the
background, several other workers in similar attire are moving about,
some pulling carts loaded with boxes."
}
]
実際の動画のフレームを並べてみると、作業者が箱を持って通路を歩き、途中で別の作業者とすれ違う流れが見えます。

動画出典: Pexels
キャプションの内容自体は正確で、人物の服装(青いニット帽、茶色とベージュのジャケット)や周囲の棚、他の作業者の存在まで読み取れています。
一方で、18 秒の動画全体を 1 つのイベントにまとめてしまう点や、タイムスタンプの精度には改善の余地がありそうです。内部的には動画を temporal_patch_size=2 で約 1 秒単位の temporal patch に分割して処理しているため、タイムスタンプの分解能もこの粒度に依存しています。より長い動画やイベント密度の高い素材であれば、複数イベントに分割されるかもしれません。
この機能は VSS(Video Search and Summarization)のような映像 AI パイプラインでの動画インデクシングに活用できそうです。倉庫や工場の監視映像から「何が起きたか」を JSON 形式で自動抽出する用途が考えられます。
ロボット操作の 2D 軌道を推論する
ロボットアームのシーン画像に対して「テープロールを掴んでバスケットに入れる」というタスクを指示すると、エンドエフェクタが辿るべき 2D 軌道をピクセル座標の JSON 配列で返してくれます。
8B: 10 ポイントの詳細な軌道
[
{"point_2d": [688, 530], "label": "gripper trajectory"},
{"point_2d": [504, 672], "label": "gripper trajectory"},
{"point_2d": [505, 692], "label": "gripper trajectory"},
...
{"point_2d": [467, 648], "label": "gripper trajectory"}
]

右のロボットアーム付近(START)からテープロールの位置(END)に向かう軌道が出力されています。テープロールを掴むところまでの前半パートですが、画像を見て「この手がこう動くべき」をピクセル座標で示せるのは面白いですね。
2B: 2 ポイントのみ + 不正な JSON
2B モデルは 2 ポイントしか返さず、さらに JSON 形式が不正でした(同一オブジェクト内にキーが重複)。
{
"point_2d": [719, 588],
"label": "gripper trajectory_1",
"point_2d": [499, 732],
"label": "gripper trajectory_2"
}
構造化出力の精度という意味では、2B と 8B の差が最も顕著に出た機能です。軌道計画のようなタスクでは 8B を使った方がよさそうです。
Embodied Reasoning で次のアクションを推論する
同じロボットアームの画像に対して「次に何をすべきか?」と聞くと、Chain-of-Thought 形式で推論過程を見せてくれます。
8B の推論全文(215 トークン)
<think>
Okay, let's try to figure out the next immediate action here.
The video is a lab or workshop with a robot arm and hand on a table.
There's a basket in the center and a roll of blue tape below it.
The robot's hand is on the left, palm up, fingers slightly curled.
The setup suggests the robot is about to interact with the tape or the basket.
Since the tape is below the basket and the robot's hand is open and ready,
maybe the next step is picking up the tape. The hand is in a position to
grasp something, and the tape is nearby. Alternatively, the robot might
move the tape into the basket. But since the tape is below the basket,
maybe the first action is to pick it up. The open hand and the tape's
position make me think grasping the tape roll is the next move.
So the predicted action would be the robot hand picking up the blue tape.
</think>
The robot hand will grasp the roll of blue tape to move or place it
into the gray woven basket.
Robot CoT が「どう動くか(座標)」を返すのに対して、Embodied Reasoning は「何をすべきか(意味)」を返します。同じ画像でもプロンプトの設計で出力の粒度がまったく変わるのは、用途に応じてテンプレートを選べる設計の良さかなと思います。
2B も「テープを掴んでバスケットに入れる」という正しい推論を返しており、日常的な推論タスクでは 2B でも十分な品質がありました。
自動運転シーンの安全推論
ダッシュカメラ映像に対して「安全な走行のために注意すべきオブジェクトを特定せよ」と指示する AV CoT プロンプトも試しました。
意外なことに、2B の方が詳細な分析を返しました。
2B の AV CoT 推論(127 トークン)
<think>
I see the gray Mazda parked to my left, restricting my lateral movement
and requiring me to maintain a safe distance while avoiding any sudden
maneuvers that could endanger the Mazda driver. Vehicles are parked on
both sides of the street, necessitating careful navigation to avoid
collisions. Crossing the intersection requires full attention to ensure
no vehicles are approaching from either direction.
</think>
gray Mazda, parked vehicles on both sides of the street, intersection signs
8B は 35 トークンで簡潔にまとめました。
I am turning right, and this black SUV is coming from the opposite direction, so I should be cautious.
→ Vehicles - Light trucks & SUVs
2B は駐車車両や交差点の標識まで含めた網羅的な分析、8B は動的な脅威(対向 SUV)に絞った即断。どちらが「正解」かは用途次第ですが、安全監視の観点では 2B の方が見落としは少なそうです。
Describe Anything で構造化キャプションを生成する
Describe Anything プロンプトは、画像中の複数オブジェクトに subject_id / category / caption の構造化データを付けて返す機能です。
8B の Describe Anything 出力
[
{
"subject_id": "1",
"category": "robot hand",
"caption": "Positioned on the left side of the table, this black robot hand
features four distinct fingers, each with a segmented design that mimics
human anatomy; it is connected to a sleek, cylindrical base equipped with
visible joints and a small circular opening at its upper part."
},
{
"subject_id": "2",
"category": "robot hand",
"caption": "Located on the right side of the table, this black robot hand
also has four fingers with a segmented structure, similar in design to the
left hand; it is attached to a cylindrical base that includes a noticeable
circular cutout near the top."
}
]
8B はロボットハンド 2 本を詳しく描写しましたが、テープロールやバスケットは検出しませんでした。一方 2B は basket / tape / hand の 3 カテゴリを検出しています。

AV CoT の結果と合わせると、2B は「広く浅く」、8B は「狭く深く」という傾向がありそうです。
パフォーマンスまとめ
全 6 機能を 2B と 8B で実行した結果を可視化しました。

2B はほとんどの機能で 8B より高速です。ただし TPS だけで比較すると少し誤解しやすいポイントがあります。Robot CoT では 8B の TPS が 4.6 と 2B の 2.0 を上回っていますが、これは 8B が 10 ポイント 257 トークンの詳細な軌道を一気に出力するためで、実際の推論時間は 8B の方が長い(56.3 秒 vs 29.8 秒)です。出力トークン数が多いほど TPS は高くなりやすいので、TPS だけでなく推論時間も合わせて見るのがよさそうです。

品質面では 8B が全体的に高いですが、Scene Reasoning(AV CoT)は 2B の方が詳細でした。「正確さ」と「網羅性」のどちらを重視するかで選択が変わってきそうです。
| 指標 | 2B | 8B |
|---|---|---|
| GPU メモリ | 4.3 GB | 17.5 GB |
| ロード時間 | 28 秒 | 95 秒 |
| 平均 TPS | 4.3 | 3.2 |
| 複数オブジェクト | 1 本 | 2 本検出 |
| 軌道ポイント数 | 2 | 10 |
| JSON 形式の正確性 | 不正あり | 常に正確 |
動画の長さと推論時間の関係
動画の長さを変えて Temporal Localization の推論時間がどうスケーリングするかを計測しました。

| 動画 | フレーム | 推論時間(2B) | 倍率(2B) | 推論時間(8B) | 倍率(8B) |
|---|---|---|---|---|---|
| 5s | 10 | 6.4s | 1.25x | 14.9s | 2.91x |
| 10s | 20 | 5.4s | 0.54x | 13.9s | 1.37x |
| 15s | 30 | 6.0s | 0.39x | 13.3s | 0.88x |
| 18s | 36 | 6.0s | 0.33x | 13.3s | 0.72x |
興味深いことに、推論時間は動画の長さにほぼ比例せず、2B で約 6 秒、8B で約 13 秒とほぼ一定でした。フレーム数が 10 から 36 に増えても、出力トークンの生成が推論時間の大部分を占めているため、入力フレーム数の増加は全体にあまり影響しないようです。
結果として、2B は 10 秒以上の動画で、8B は 15 秒以上の動画でリアルタイムより速く分析を完了できます。リアルタイムのストリーミング処理ではないものの、監視映像を後から分析する用途であれば、DGX Spark 1 台で十分実用的な速度が出ていると言えそうです。
実用シナリオを考える
今回試した 6 機能は、単体で使うより組み合わせたときに真価を発揮しそうです。
たとえば映像 AI パイプラインでは、まず temporal_localization で長尺の監視映像を「何が」「いつ」起きたかの JSON に分解し、気になるイベントの該当フレームに対して 2d_grounding をかけることで、物体の位置まで含めた構造化インデックスを作れます。以前の記事で検証した VSS の Event Reviewer と組み合わせれば、検出イベントへのバウンディングボックス付与を自動化できそうです。
ロボティクスの文脈では、embodied_reasoning で「テープを掴んでバスケットに入れる」というタスクレベルの判断を行い、robot_cot で具体的なピクセル座標の軌道に落とし込むという 2 段階推論が考えられます。軌道座標をそのままロボット制御に使うのは精度的に厳しいですが、計画の初期仮説として使うぶんには十分です。
前回の LoRA SFT との組み合わせも面白い方向です。ベースモデルの 2d_grounding で物体を大まかに検出し、LoRA でドメイン特化させた VLM がそのクロップ領域を詳細に分析する、という構成にすれば、「位置特定はベースモデル、判定はカスタムモデル」の役割分担ができます。
まとめ
Cosmos-Reason2 の 6 つの構造化出力機能を DGX Spark で検証しました。
2D Grounding のバウンディングボックス出力は、ファインチューニングなしのベースモデルで PPE のヘルメットやベストを正確に検出できるレベルでした。LoRA SFT 記事ではテキスト分類のために学習を行いましたが、位置情報が必要なら 2D Grounding がそのまま使えることがわかりました。
Temporal Localization と Robot CoT では、8B の方が明確に高品質な結果を返しました。一方、AV CoT のような推論タスクでは 2B も健闘しており、モデルサイズと品質の関係は一様ではありません。
DGX Spark の 128GB 統合メモリがあれば、2B(4.3 GB)と 8B(17.5 GB)のどちらも余裕を持って動作します。目的に応じて使い分けられる環境があるのは、検証には便利ですね。
GTC 2026 では Cosmos 3 も発表されており、構造化出力がどう変わるのか気になるところです。
参考リンク
- nvidia-cosmos/cosmos-reason2 — 公式リポジトリ(10 種のプロンプトテンプレート)
- Scale Synthetic Data and Physical AI Reasoning with NVIDIA Cosmos World Foundation Models — NVIDIA Developer Blog
- Cosmos-Reason2-8B(HuggingFace) — モデルカード
- Cosmos-Reason2-2B(HuggingFace) — モデルカード
- DGX Spark で NVIDIA Cosmos 世界基盤モデルを動かしてみた — 前回の Cosmos 記事
- Cosmos-Reason2-8B を DGX Spark で PPE 検出向けにファインチューニングしてみた — 前回の LoRA SFT 記事








