Videomind 7B
VideoMindはマルチモーダルエージェントフレームワークで、人間の思考プロセスを模倣することで動画推論能力を強化します。
Downloads 90
Release Time : 3/22/2025
Model Overview
VideoMindはマルチモーダル大規模言語モデルで、タスク分解、瞬間特定と検証、回答合成などの人間の思考プロセスを通じて動画推論能力を強化します。
Model Features
マルチロール協調推論
プランナー、ロケーター、バリデーター、アンサラーという4つのロールの協調により、人間の思考プロセスを模倣した動画推論を実現
効率的な瞬間特定
動画内のキータイムフレームを正確に特定し、動画理解の効率を向上
マルチモーダル処理能力
動画とテキスト情報を同時に処理し、クロスモーダル理解を実現
Model Capabilities
動画内容理解
動画瞬間特定
動画質問応答
マルチモーダル推論
Use Cases
動画内容分析
動画質問応答
動画内容に関する複雑な質問に回答
マルチロール協調により正確な回答を提供
キーフレーム特定
特定の質問に関連する動画内のキーフレームを特定
関連する時間フレームを正確に識別
🚀 VideoMind-7B
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-7B'
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}
}
Llava Video 7B Qwen2
Apache-2.0
LLaVA-ビデオモデルはQwen2言語モデルをベースとした7Bパラメータのマルチモーダルモデルで、ビデオ理解タスクに特化しており、64フレームのビデオ入力をサポートします。
ビデオ生成テキスト
Transformers English

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

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

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

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

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

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

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

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

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

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

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