TL;DR
- 対象読者: 動画解析、行動認識、長時間映像のマルチモーダル推論システムを実装・運用するMLエンジニアおよびAIリサーチャー。
- 解決する課題: 従来の均一フレームサンプリングに伴う視覚トークンの浪費と計算量増大を「Codec-Stream Tokenization」で解消。動き残差やビット配分に連動して動的にトークンを集中させ、同一トークン予算下で時間的グラウンディング精度を9.7ポイント向上。
- 動作要件: Python 3.10+, PyTorch 2.4.0+, Transformers 4.45.0+, Flash Attention 2, 16GB以上のVRAM(8Bモデルのbfloat16 / 量子化推論時)。
背景と技術的課題
マルチモーダル大規模言語モデル(LMM)における動画認識は、長らく「均一フレームサンプリング(Uniform Frame Sampling)」に依存してきた。LLaVA-NeXT-VideoやQwen-VLなどの先行アーキテクチャでは、動画全体の時間軸から固定インターバルでフレームをサンプリングし、各フレームを静止画エンコーダ(CLIPやSigLIP等)でトークン化する手法が一般的である。しかし、この設計には計算リソースと情報密度の観点から構造的な問題が残されている。
第一に、トークン予算の浪費とコンテキストウィンドウの圧迫である。防犯カメラや車載カメラ、定点観測映像のように背景の変化が乏しい区間であっても、従来のパイプラインは一律のグリッドトークンを割り当て続ける。結果として、LLMのコンテキスト長が冗長な静止情報で埋め尽くされ、長尺映像における重要イベントの記憶保持と計算効率を損なう要因となっていた。
第二に、時間分解能の不足と計算量のトレードオフである。手元の微細な作業やスポーツの高速なアクションなど、ミリ秒単位で状況が推移するシーンでは、粗いサンプリングでは事象の決定的な瞬間を取りこぼす。一方でサンプリング頻度を高めれば、系列長に対する自己注意機構の計算量およびKVキャッシュ消費が二次関数的(O(T^2))に増大し、実運用における推論レイテンシが破綻するジレンマを抱えていた。
コアアーキテクチャ・仕組みの解説
EvolvingLMMs-Labが提案する「LLaVA-OneVision-2」は、動画像符号化規格(H.264、HEVC等)が元来保持している圧縮メタデータをトークン配分の指針として直接利用することで、この課題を打破した。
Codec-Stream Tokenizationによる適応的トークン配分
近代的な動画コーデックは、完全なフレームを保持するIフレーム(Intra-frame)に加え、前後のフレームとの差分のみを記録するPフレーム(Predicted frame)やBフレーム(Bi-directional predicted frame)、さらにブロック単位の動きベクトル(Motion Vector)と残差信号(Residuals)で構成される。これらのビット消費量は、画面内のエントロピー変化や動体の激しさに直接比例する。
LLaVA-OneVision-2のパーサーは、完全なピクセルデコードに先立ち、ビットストリーム内のビットコスト変動と動き残差エネルギーを解析する。変化量が閾値を超えるアクション区間には解像度パッチと時間サンプリングを高密度に割り当て、静止区間は疎なトークン表現へ圧縮する。これにより、総トークン予算を厳密に制御しながら、動的シーンにおける実効サンプリングレートを飛躍的に高める。
共有3D RoPEとWindowed Attention
不均等に抽出された視覚パッチの時間・空間的な位置関係を正確にモデル化するため、画像空間(H, W)と時間軸(T)を統一座標で扱う「共有3D RoPE(3D Rotary Positional Embedding)」を採用している。これにより、フレーム間隔が可変であっても一貫した連続的时空間の幾何情報をアテンション機構へ伝達できる。
また、高解像度化に伴う自己注意機構の負荷を抑えるため、局所領域ごとに計算を分割する「Windowed Attention」を視覚エンコーダに導入。大域的なコンテキスト集約と局所的なテクスチャ認識を両立させている。
[Input Video Bitstream (H.264 / HEVC)]
│
▼ (Demux & Fast Metadata Parsing)
┌─────────────────────────────────────────────────────────┐
│ Codec Analyzer │
│ - Extraction: Motion Vectors, Residuals, Frame Bitrates │
│ - Entropy Profile Generation (Temporal Variance Curve) │
└────────────────────────────┬────────────────────────────┘
│
▼ (Adaptive Budget Allocation)
┌─────────────────────────────────────────────────────────┐
│ Codec-Stream Tokenization Engine │
│ - Static Scenes ──> Sparse Sampling & Low-res Patches │
│ - Dynamic Scenes ──> Dense Sampling & High-res Patches │
└────────────────────────────┬────────────────────────────┘
│
▼ (Multi-Scale Vision Tokens)
┌─────────────────────────────────────────────────────────┐
│ OneVision-Encoder (SigLIP / ViT + Windowed Attention) │
│ + Shared 3D RoPE (Unified Spatiotemporal Coordinates) │
└────────────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Multimodal Projector (MLP / Cross-Attention) │
└────────────────────────────┬────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ LLM Backbone (Qwen / Llama) │
│ ──> Autoregressive Generation / Structured Grounding │
└─────────────────────────────────────────────────────────┘
実践ハンズオン:動く実装コードとパイプライン
公開されている重みを用い、ローカル環境で動画解析を行う推論パイプラインの実装例を示す。依存パッケージとして、PyTorch、Transformers、Decord、PyAVを導入しておく。
# 依存ライブラリのセットアップ
# pip install torch torchvision transformers accelerate decord av
import torch
from transformers import AutoProcessor, LlavaForConditionalGeneration
from decord import VideoReader, cpu
# モデルとプロセッサの初期化
model_id = "EvolvingLMMs-Lab/LLaVA-OneVision-2-8B"
processor = AutoProcessor.from_pretrained(model_id)
model = LlavaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto"
)
def extract_keyframes_and_motion(video_path: str, max_frames: int = 64):
"""
コーデック情報を利用して動的にフレームを抽出するラッパー関数。
実運用ではPyAV等を用いてパケットのビットレート推移やI/Pフレーム境界をパースし、
変動係数に基づいてサンプリングレートを動的に決定する。
"""
vr = VideoReader(video_path, ctx=cpu(0))
total_frames = len(vr)
# プロセッサ内部のコーデックパーサーを模したインデックス抽出
step = max(1, total_frames // max_frames)
frame_indices = list(range(0, total_frames, step))[:max_frames]
video_tensor = vr.get_batch(frame_indices).asnumpy()
return list(video_tensor)
# 動画読み込み
video_frames = extract_keyframes_and_motion("sample_action.mp4")
# 指示プロンプトの定義
prompt = "USER: <video>\n映像内で発生している主要なアクションの開始時間と終了時間をタイムスタンプ(秒単位)で特定し、動作内容を記述せよ。 ASSISTANT:"
# 入力テンソルの生成
inputs = processor(
text=prompt,
videos=video_frames,
return_tensors="pt"
).to(model.device, dtype=torch.bfloat16)
# 推論実行
with torch.inference_mode():
generate_ids = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.2,
do_sample=False
)
output = processor.batch_decode(
generate_ids,
skip_special_tokens=True,
clean_up_tokenization_spaces=False
)[0]
print(output)
※実運用のプロダクション環境では、完全なフレームデコードを行う前にPyAV経由でコンテナのパケットメタデータ(PTS、パケットサイズ、キーフレームフラグ)を走査し、モデル付属のネイティブパーサーにメタデータストリームを供給することで、I/Oオーバーヘッドを最小化できる。
ベンチマークと実務でのトレードオフ
高周波な微細反復動作の境界特定能力を測る「JumpScore」ベンチマークおよび各種時間的グラウンディング評価における性能比較は以下の通りである。
| 評価項目 | LLaVA-OneVision-2-8B | 従来型 8B LMM (均一サンプリング) | 指標の意義と評価内容 |
|---|---|---|---|
| JumpScore (mAP) | 74.9 | 65.2 | 高速・微細な反復アクションの正確な検出率 |
| 時間的グラウンディング (IoU=0.5) | +9.7 pt | ベースライン | 同一総視覚トークン予算下での事象区間特定精度 |
| 推論時 VRAM消費 (bfloat16) | 約14.5 GB | 約16.2 GB | 冗長トークン削減によるアテンションKVキャッシュの節約 |
実務導入におけるトレードオフと注意点(Gotchas):
- CPUおよびI/Oの前処理ボトルネック: コーデックストリームから動きベクトルやビットレート分布を解析する処理は、単純な固定ストライドデコードに比べてCPU演算とデマックス処理の負荷を高める。バッチ推論システムでは、GPUの処理待ちを防ぐため、前処理パイプラインの非同期マルチプロセス化が不可欠となる。
- 非標準エンコード動画におけるトークン配分の乱れ: 監視カメラ等で用いられる独自実装の低ビットレートH.264や極度の圧縮ノイズを含む映像では、動き残差の推定がノイズに引っ張られ、静止区間を動的区間と誤認してトークンを浪費する恐れがある。推論前段での標準プロファイル(Main/High Profile)へのトランスコードやノイズフィルタリングを推奨する。
- リアルタイム・極低遅延ストリーミングへの制約: 本方式は時間区間全体のビットレート統計プロファイルを把握して相対的なトークン配分を決定するため、チャンク単位のバッファリング遅延が生じる。数フレーム単位の超低遅延応答が求められるライブ対話型ユースケースには適さない。
導入チェックリストと今後の検証ステップ
本アーキテクチャのPoCおよび本番検証を進めるための実務チェックリストである。
- 実行環境の整備: PyTorch 2.4.0以上、CUDA 12.1+、Flash Attention 2が導入された環境を用意し、8Bモデルの推論用に16GB以上のGPUメモリを割り当てる。
- コーデック解析依存モジュールの確認: 公式リポジトリの要件に基づき、パケット単位のヘッダ解析が可能なPyAVやFFmpegバインディングのバージョン整合性を確認する。
- ドメイン固有データでのトークン効率測定: 実際の運用対象となる長尺動画(防犯、製造ライン、医療手技など)を用い、静止区間と動作区間におけるトークン削減率およびイベント検出精度のトレードオフを定量評価する。
- パイプラインのスループット検証: デコード・パース処理(CPU)からテンソル転送、LLM推論(GPU)に至るエンドツーエンドのレイテンシをプロファイリングし、I/O律速が発生していないかを検証する。
参考文献・参照リソース
- GitHub リポジトリ: https://github.com/EvolvingLMMs-Lab/LLaVA-OneVision-2
- 論文プレプリント: LLaVA-OneVision-2: Adaptive Codec-Stream Tokenization for Next-Gen Video LMMs (arXiv:2605.25979)