Videomind 2B
VideoMindはマルチモーダルエージェントフレームワークで、人間の思考プロセス(タスク分解、時間的定位と検証、回答合成など)を模倣することで動画推論能力を強化します。
ダウンロード数 207
リリース時間 : 3/21/2025
モデル概要
VideoMindはマルチモーダル大規模言語モデルで、動画テキストからテキストへのタスクに特化し、人間の思考プロセスを模倣することで動画推論能力を強化します。
モデル特徴
マルチモーダルエージェントフレームワーク
人間の思考プロセス(タスク分解、時間的定位と検証、回答合成など)を模倣することで動画推論能力を強化します。
役割分担
モデルにはプランナー、ロケーター、バリデーター、レスポンダーの4つの役割があり、それぞれ異なる推論タスクを担当します。
効率的な推論
LoRAアダプタ技術により、異なる役割間の迅速な切り替えと効率的な推論を実現します。
モデル能力
動画理解
動画時間的定位
動画質問応答
マルチモーダル推論
使用事例
動画分析
動画質問応答
動画内容について質問し、正確な回答を得ます。
動画中の重要な瞬間を正確に定位し、関連する回答を生成できます。
動画時間的定位
長い動画の中で特定のイベントが発生した時刻を定位します。
イベント発生の時間帯を正確に識別して返すことができます。
🚀 VideoMind-2B
VideoMindは、タスクの分解、モーメントの特定と検証、回答の合成などの人間に似たプロセスをエミュレートすることで、ビデオ推論を強化するマルチモーダルエージェントフレームワークです。
🔖 モデルの詳細
属性 | 詳情 |
---|---|
モデルタイプ | マルチモーダル大規模言語モデル |
言語 | 英語 |
ライセンス | BSD-3-Clause |
🚀 クイックスタート
環境のインストール
- GitHubからリポジトリをクローンします。
git clone git@github.com:yeliudev/VideoMind.git
cd VideoMind
- conda環境を初期化します。
conda create -n videomind python=3.11 -y
conda activate videomind
- 依存関係をインストールします。
pip install -r requirements.txt
NPUユーザーは、requirements.txt
の18 - 25行目を修正してください。
クイック推論デモ
以下のスクリプトは、VideoMindの異なるロールで推論を実行する方法を示しています。このモデルの詳細については、GitHubリポジトリを参照してください。
import torch
from videomind.constants import GROUNDER_PROMPT, PLANNER_PROMPT, VERIFIER_PROMPT
from videomind.dataset.utils import process_vision_info
from videomind.model.builder import build_model
from videomind.utils.io import get_duration
from videomind.utils.parser import parse_span
MODEL_PATH = 'yeliudev/VideoMind-2B'
video_path = '<path-to-video>'
question = '<question>'
# ロール *grounder* を初期化
model, processor = build_model(MODEL_PATH)
device = next(model.parameters()).device
# ロール *planner* を初期化
model.load_adapter(f'{MODEL_PATH}/planner', adapter_name='planner')
# ロール *verifier* を初期化
model.load_adapter(f'{MODEL_PATH}/verifier', adapter_name='verifier')
# ==================== Planner ====================
messages = [{
'role':
'user',
'content': [{
'type': 'video',
'video': video_path,
'min_pixels': 36 * 28 * 28,
'max_pixels': 64 * 28 * 28,
'max_frames': 100,
'fps': 1.0
}, {
'type': 'text',
'text': PLANNER_PROMPT.format(question)
}]
}]
# 入力を前処理
text = processor.apply_chat_template(messages, add_generation_prompt=True)
images, videos = process_vision_info(messages)
data = processor(text=[text], images=images, videos=videos, return_tensors='pt').to(device)
# アダプターを *planner* に切り替え
model.base_model.disable_adapter_layers()
model.base_model.enable_adapter_layers()
model.set_adapter('planner')
# 推論を実行
output_ids = model.generate(**data, do_sample=False, temperature=None, top_p=None, top_k=None, max_new_tokens=256)
# 出力IDをデコード
output_ids = output_ids[0, data.input_ids.size(1):-1]
response = processor.decode(output_ids, clean_up_tokenization_spaces=False)
print(f'Planner Response: {response}')
# ==================== Grounder ====================
messages = [{
'role':
'user',
'content': [{
'type': 'video',
'video': video_path,
'min_pixels': 36 * 28 * 28,
'max_pixels': 64 * 28 * 28,
'max_frames': 150,
'fps': 1.0
}, {
'type': 'text',
'text': GROUNDER_PROMPT.format(question)
}]
}]
# 入力を前処理
text = processor.apply_chat_template(messages, add_generation_prompt=True)
images, videos = process_vision_info(messages)
data = processor(text=[text], images=images, videos=videos, return_tensors='pt').to(device)
# アダプターを *grounder* に切り替え
model.base_model.disable_adapter_layers()
model.base_model.enable_adapter_layers()
model.set_adapter('grounder')
# 推論を実行
output_ids = model.generate(**data, do_sample=False, temperature=None, top_p=None, top_k=None, max_new_tokens=256)
# 出力IDをデコード
output_ids = output_ids[0, data.input_ids.size(1):-1]
response = processor.decode(output_ids, clean_up_tokenization_spaces=False)
print(f'Grounder Response: {response}')
duration = get_duration(video_path)
# 1. タイムスタンプと信頼度を抽出
blob = model.reg[0].cpu().float()
pred, conf = blob[:, :2] * duration, blob[:, -1].tolist()
# 2. タイムスタンプをクランプ
pred = pred.clamp(min=0, max=duration)
# 3. タイムスタンプをソート
inds = (pred[:, 1] - pred[:, 0] < 0).nonzero()[:, 0]
pred[inds] = pred[inds].roll(1)
# 4. タイムスタンプをリストに変換
pred = pred.tolist()
print(f'Grounder Regressed Timestamps: {pred}')
# ==================== Verifier ====================
# 上位5つの予測を使用
probs = []
for cand in pred[:5]:
s0, e0 = parse_span(cand, duration, 2)
offset = (e0 - s0) / 2
s1, e1 = parse_span([s0 - offset, e0 + offset], duration)
# s0, e0 が s1, e1 内に占める割合
s = (s0 - s1) / (e1 - s1)
e = (e0 - s1) / (e1 - s1)
messages = [{
'role':
'user',
'content': [{
'type': 'video',
'video': video_path,
'video_start': s1,
'video_end': e1,
'min_pixels': 36 * 28 * 28,
'max_pixels': 64 * 28 * 28,
'max_frames': 64,
'fps': 2.0
}, {
'type': 'text',
'text': VERIFIER_PROMPT.format(question)
}]
}]
text = processor.apply_chat_template(messages, add_generation_prompt=True)
images, videos = process_vision_info(messages)
data = processor(text=[text], images=images, videos=videos, return_tensors='pt')
# ===== セグメントの開始/終了トークンを挿入 =====
video_grid_thw = data['video_grid_thw'][0]
num_frames, window = int(video_grid_thw[0]), int(video_grid_thw[1] * video_grid_thw[2] / 4)
assert num_frames * window * 4 == data['pixel_values_videos'].size(0)
pos_s, pos_e = round(s * num_frames), round(e * num_frames)
pos_s, pos_e = min(max(0, pos_s), num_frames), min(max(0, pos_e), num_frames)
assert pos_s <= pos_e, (num_frames, s, e)
base_idx = torch.nonzero(data['input_ids'][0] == model.config.vision_start_token_id).item()
pos_s, pos_e = pos_s * window + base_idx + 1, pos_e * window + base_idx + 2
input_ids = data['input_ids'][0].tolist()
input_ids.insert(pos_s, model.config.seg_s_token_id)
input_ids.insert(pos_e, model.config.seg_e_token_id)
data['input_ids'] = torch.LongTensor([input_ids])
data['attention_mask'] = torch.ones_like(data['input_ids'])
# ===========================================
data = data.to(device)
# アダプターを *verifier* に切り替え
model.base_model.disable_adapter_layers()
model.base_model.enable_adapter_layers()
model.set_adapter('verifier')
# 推論を実行
with torch.inference_mode():
logits = model(**data).logits[0, -1].softmax(dim=-1)
# 注意: ここにはマジックナンバーがあります
# Qwen2-VL語彙では、9454 -> Yes, 2753 -> No
score = (logits[9454] - logits[2753]).sigmoid().item()
probs.append(score)
# 検証者の信頼度で予測をソート
ranks = torch.Tensor(probs).argsort(descending=True).tolist()
pred = [pred[idx] for idx in ranks]
conf = [conf[idx] for idx in ranks]
print(f'Verifier Re-ranked Timestamps: {pred}')
# ==================== Answerer ====================
# 最良の候補モーメントを選択
s, e = parse_span(pred[0], duration, 32)
messages = [{
'role':
'user',
'content': [{
'type': 'video',
'video': video_path,
'video_start': s,
'video_end': e,
'min_pixels': 128 * 28 * 28,
'max_pixels': 256 * 28 * 28,
'max_frames': 32,
'fps': 2.0
}, {
'type': 'text',
'text': question
}]
}]
text = processor.apply_chat_template(messages, add_generation_prompt=True)
images, videos = process_vision_info(messages)
data = processor(text=[text], images=images, videos=videos, return_tensors='pt').to(device)
# *answerer* はベースモデル自体なので、すべてのアダプターを削除
with model.disable_adapter():
output_ids = model.generate(**data, do_sample=False, temperature=None, top_p=None, top_k=None, max_new_tokens=256)
# 出力IDをデコード
output_ids = output_ids[0, data.input_ids.size(1):-1]
response = processor.decode(output_ids, clean_up_tokenization_spaces=False)
print(f'Answerer Response: {response}')
📖 引用
このプロジェクトが役立った場合は、以下の論文を引用してください。
@article{liu2025videomind,
title={VideoMind: A Chain-of-LoRA Agent for Long Video Reasoning},
author={Liu, Ye and Lin, Kevin Qinghong and Chen, Chang Wen and Shou, Mike Zheng},
journal={arXiv preprint arXiv:2503.13444},
year={2025}
}
📄 ライセンス
このプロジェクトは、BSD-3-Clauseライセンスの下でライセンスされています。詳細については、こちらを参照してください。
Llava Video 7B Qwen2
Apache-2.0
LLaVA-ビデオモデルはQwen2言語モデルをベースとした7Bパラメータのマルチモーダルモデルで、ビデオ理解タスクに特化しており、64フレームのビデオ入力をサポートします。
ビデオ生成テキスト
Transformers 英語

L
lmms-lab
34.28k
91
Llava NeXT Video 7B DPO Hf
LLaVA-NeXT-Videoはオープンソースのマルチモーダルチャットボットで、動画と画像データの混合トレーニングにより最適化され、優れた動画理解能力を備えています。
ビデオ生成テキスト
Transformers 英語

L
llava-hf
12.61k
9
Internvideo2 5 Chat 8B
Apache-2.0
InternVideo2.5は、長く豊富なコンテキスト(LRC)モデリングを強化したビデオマルチモーダル大規模言語モデルで、InternVL2.5を基盤として構築されており、細粒度の詳細を感知し、長時間の時系列構造を捉える能力を向上させることで、既存のMLLMモデルを大幅に改善しています。
ビデオ生成テキスト
Transformers 英語

I
OpenGVLab
8,265
60
Cogvlm2 Llama3 Caption
その他
CogVLM2-Captionは、CogVideoXモデルのトレーニングデータを生成するためのビデオ記述生成モデルです。
ビデオ生成テキスト
Transformers 英語

C
THUDM
7,493
95
Spacetimegpt
時空間GPTは、空間的および時間的推論が可能なビデオ記述生成モデルで、ビデオフレームを分析し、ビデオイベントを記述する文を生成できます。
ビデオ生成テキスト
Transformers 英語

S
Neleac
2,877
33
Video R1 7B
Apache-2.0
Video-R1-7BはQwen2.5-VL-7B-Instructを最適化したマルチモーダル大規模言語モデルで、ビデオ推論タスクに特化しており、ビデオコンテンツを理解し関連する質問に答えることができます。
ビデオ生成テキスト
Transformers 英語

V
Video-R1
2,129
9
Internvl 2 5 HiCo R16
Apache-2.0
InternVideo2.5は、InternVL2.5を基盤としたビデオマルチモーダル大規模言語モデル(MLLM)で、長く豊富なコンテキスト(LRC)モデリングによって強化され、細粒度の詳細を感知し、長時間の時系列構造を捉えることができます。
ビデオ生成テキスト
Transformers 英語

I
OpenGVLab
1,914
3
Videollm Online 8b V1plus
MIT
VideoLLM-onlineはLlama-3-8B-Instructをベースとしたマルチモーダル大規模言語モデルで、オンライン動画理解と動画-テキスト生成タスクに特化しています。
ビデオ生成テキスト
Safetensors 英語
V
chenjoya
1,688
23
Videochat R1 7B
Apache-2.0
VideoChat-R1_7B は Qwen2.5-VL-7B-Instruct をベースとしたマルチモーダル動画理解モデルで、動画とテキスト入力を処理し、テキスト出力を生成できます。
ビデオ生成テキスト
Transformers 英語

V
OpenGVLab
1,686
7
Qwen2.5 Vl 7b Cam Motion Preview
その他
Qwen2.5-VL-7B-Instructをファインチューニングしたカメラ運動分析モデルで、ビデオ内のカメラ運動分類とビデオ-テキスト検索タスクに特化
ビデオ生成テキスト
Transformers

Q
chancharikm
1,456
10
おすすめAIモデル
Llama 3 Typhoon V1.5x 8b Instruct
タイ語専用に設計された80億パラメータの命令モデルで、GPT-3.5-turboに匹敵する性能を持ち、アプリケーションシナリオ、検索拡張生成、制限付き生成、推論タスクを最適化
大規模言語モデル
Transformers 複数言語対応

L
scb10x
3,269
16
Cadet Tiny
Openrail
Cadet-TinyはSODAデータセットでトレーニングされた超小型対話モデルで、エッジデバイス推論向けに設計されており、体積はCosmo-3Bモデルの約2%です。
対話システム
Transformers 英語

C
ToddGoldfarb
2,691
6
Roberta Base Chinese Extractive Qa
RoBERTaアーキテクチャに基づく中国語抽出型QAモデルで、与えられたテキストから回答を抽出するタスクに適しています。
質問応答システム 中国語
R
uer
2,694
98