Internvl 2 5 HiCo R16
InternVideo2.5は、長く豊富な文脈(LRC)モデリングを強化したビデオマルチモーダル大規模言語モデル(MLLM)で、InternVL2.5上に構築されています。
ダウンロード数 129
リリース時間 : 3/18/2025
モデル概要
InternVideo2.5は、細かいディテールの知覚能力と長時間の時間的構造を捉える能力を向上させることで、既存のMLLMを大幅に改善しました。これは、高密度視覚タスクのアノテーションに直接選好最適化(TPO)を使用し、適応型階層トークン圧縮(HiCo)を通じてコンパクトな時空間表現を実現することで行われました。
モデル特徴
長く豊富な文脈(LRC)モデリング
細かいディテールの知覚能力と長時間の時間的構造を捉える能力を向上させ、既存のMLLMを大幅に改善します。
適応型階層トークン圧縮(HiCo)
コンパクトな時空間表現を実現し、1フレームあたりわずか16トークンを使用します。
直接選好最適化(TPO)
高密度視覚タスクのアノテーションを通じてモデル性能を強化します。
モデル能力
動画理解
動画説明生成
マルチモーダル対話
長編動画分析
使用事例
動画コンテンツ分析
動画詳細説明
動画の内容について、シーン、アクション、オブジェクトを含む詳細な説明を行います。
詳細な動画説明テキストを生成
動画質問応答
動画内容に関する特定の質問に答えます。
動画関連の質問に正確に回答
長編動画処理
長編動画要約
長編動画の内容を要約し、キーフレームを抽出します。
動画要約とキーフレーム説明を生成
🚀 InternVL2.5_HiCo_R16⚡
InternVideo2.5は、長時間かつ豊富なコンテキスト(LRC)モデリングを強化したビデオマルチモーダル大規模言語モデル(MLLM、InternVL2.5をベースに構築)です。細粒度の詳細を知覚する能力と長い時間構造を捉える能力を向上させることで、既存のMLLMを大幅に改善しています。これは、直接的な嗜好最適化(TPO)を用いた高密度ビジョンタスクアノテーションと、適応的階層的トークン圧縮(HiCo)によるコンパクトな時空間表現を通じて達成されます。このモデルは、InternVideo2.5のアブレーション実験のバリアントで、HiCo技術のみを使用して構築されています(R16は1フレームあたり16トークンを意味します)。
🚀 クイックスタート
📦 インストール
まず、flash attention2 と他のいくつかのモジュールをインストールする必要があります。以下に簡単なインストール例を示します。
pip install transformers==4.40.1
pip install av
pip install imageio
pip install decord
pip install opencv-python
pip install flash-attn --no-build-isolation
💻 使用例
基本的な使用法
import numpy as np
import torch
import torchvision.transforms as T
from decord import VideoReader, cpu
from PIL import Image
from torchvision.transforms.functional import InterpolationMode
from transformers import AutoModel, AutoTokenizer
# model setting
model_path = 'OpenGVLab/InternVL_2_5_HiCo_R16'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
IMAGENET_MEAN = (0.485, 0.456, 0.406)
IMAGENET_STD = (0.229, 0.224, 0.225)
def build_transform(input_size):
MEAN, STD = IMAGENET_MEAN, IMAGENET_STD
transform = T.Compose([T.Lambda(lambda img: img.convert("RGB") if img.mode != "RGB" else img), T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC), T.ToTensor(), T.Normalize(mean=MEAN, std=STD)])
return transform
def find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):
best_ratio_diff = float("inf")
best_ratio = (1, 1)
area = width * height
for ratio in target_ratios:
target_aspect_ratio = ratio[0] / ratio[1]
ratio_diff = abs(aspect_ratio - target_aspect_ratio)
if ratio_diff < best_ratio_diff:
best_ratio_diff = ratio_diff
best_ratio = ratio
elif ratio_diff == best_ratio_diff:
if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:
best_ratio = ratio
return best_ratio
def dynamic_preprocess(image, min_num=1, max_num=6, image_size=448, use_thumbnail=False):
orig_width, orig_height = image.size
aspect_ratio = orig_width / orig_height
# calculate the existing image aspect ratio
target_ratios = set((i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) if i * j <= max_num and i * j >= min_num)
target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])
# find the closest aspect ratio to the target
target_aspect_ratio = find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)
# calculate the target width and height
target_width = image_size * target_aspect_ratio[0]
target_height = image_size * target_aspect_ratio[1]
blocks = target_aspect_ratio[0] * target_aspect_ratio[1]
# resize the image
resized_img = image.resize((target_width, target_height))
processed_images = []
for i in range(blocks):
box = ((i % (target_width // image_size)) * image_size, (i // (target_width // image_size)) * image_size, ((i % (target_width // image_size)) + 1) * image_size, ((i // (target_width // image_size)) + 1) * image_size)
# split the image
split_img = resized_img.crop(box)
processed_images.append(split_img)
assert len(processed_images) == blocks
if use_thumbnail and len(processed_images) != 1:
thumbnail_img = image.resize((image_size, image_size))
processed_images.append(thumbnail_img)
return processed_images
def load_image(image, input_size=448, max_num=6):
transform = build_transform(input_size=input_size)
images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)
pixel_values = [transform(image) for image in images]
pixel_values = torch.stack(pixel_values)
return pixel_values
def get_index(bound, fps, max_frame, first_idx=0, num_segments=32):
if bound:
start, end = bound[0], bound[1]
else:
start, end = -100000, 100000
start_idx = max(first_idx, round(start * fps))
end_idx = min(round(end * fps), max_frame)
seg_size = float(end_idx - start_idx) / num_segments
frame_indices = np.array([int(start_idx + (seg_size / 2) + np.round(seg_size * idx)) for idx in range(num_segments)])
return frame_indices
def get_num_frames_by_duration(duration):
local_num_frames = 4
num_segments = int(duration // local_num_frames)
if num_segments == 0:
num_frames = local_num_frames
else:
num_frames = local_num_frames * num_segments
num_frames = min(512, num_frames)
num_frames = max(128, num_frames)
return num_frames
def load_video(video_path, bound=None, input_size=448, max_num=1, num_segments=32, get_frame_by_duration = False):
vr = VideoReader(video_path, ctx=cpu(0), num_threads=1)
max_frame = len(vr) - 1
fps = float(vr.get_avg_fps())
pixel_values_list, num_patches_list = [], []
transform = build_transform(input_size=input_size)
if get_frame_by_duration:
duration = max_frame / fps
num_segments = get_num_frames_by_duration(duration)
frame_indices = get_index(bound, fps, max_frame, first_idx=0, num_segments=num_segments)
for frame_index in frame_indices:
img = Image.fromarray(vr[frame_index].asnumpy()).convert("RGB")
img = dynamic_preprocess(img, image_size=input_size, use_thumbnail=True, max_num=max_num)
pixel_values = [transform(tile) for tile in img]
pixel_values = torch.stack(pixel_values)
num_patches_list.append(pixel_values.shape[0])
pixel_values_list.append(pixel_values)
pixel_values = torch.cat(pixel_values_list)
return pixel_values, num_patches_list
# evaluation setting
max_num_frames = 512
generation_config = dict(
do_sample=False,
temperature=0.0,
max_new_tokens=1024,
top_p=0.1,
num_beams=1
)
video_path = "your_video.mp4"
num_segments=128
with torch.no_grad():
pixel_values, num_patches_list = load_video(video_path, num_segments=num_segments, max_num=1, get_frame_by_duration=False)
pixel_values = pixel_values.to(torch.bfloat16).to(model.device)
video_prefix = "".join([f"Frame{i+1}: <image>\n" for i in range(len(num_patches_list))])
# single-turn conversation
question1 = "Describe this video in detail."
question = video_prefix + question1
output1, chat_history = model.chat(tokenizer, pixel_values, question, generation_config, num_patches_list=num_patches_list, history=None, return_history=True)
print(output1)
# multi-turn conversation
question2 = "How many people appear in the video?"
output2, chat_history = model.chat(tokenizer, pixel_values, question, generation_config, num_patches_list=num_patches_list, history=chat_history, return_history=True)
print(output2)
📈 性能
モデル | MVBench | LongVideoBench | VideoMME(サブなし) |
---|---|---|---|
InternVL2.5_HiCo_R16 | 74.0 | 59.6 | 64.9 |
✏️ 引用
@article{wang2025internvideo,
title={InternVideo2.5: Empowering Video MLLMs with Long and Rich Context Modeling},
author={Wang, Yi and Li, Xinhao and Yan, Ziang and He, Yinan and Yu, Jiashuo and Zeng, Xiangyu and Wang, Chenting and Ma, Changlian and Huang, Haian and Gao, Jianfei and Dou, Min and Chen, Kai and Wang, Wenhai and Qiao, Yu and Wang, Yali and Wang, Limin},
journal={arXiv preprint arXiv:2501.12386},
year={2025}
}
@article{li2024videochatflash,
title={VideoChat-Flash: Hierarchical Compression for Long-Context Video Modeling},
author={Li, Xinhao and Wang, Yi and Yu, Jiashuo and Zeng, Xiangyu and Zhu, Yuhan and Huang, Haian and Gao, Jianfei and Li, Kunchang and He, Yinan and Wang, Chenting and others},
journal={arXiv preprint arXiv:2501.00574},
year={2024}
}
📄 ライセンス
このライブラリはApache-2.0ライセンスの下で提供されています。
Xclip Base Patch32
MIT
X-CLIPはCLIPの拡張版で、汎用ビデオ言語理解のために(ビデオ、テキスト)ペアで対照学習を行い、ビデオ分類やビデオ-テキスト検索などのタスクに適しています。
テキスト生成ビデオ
Transformers 英語

X
microsoft
309.80k
84
LTX Video
その他
DiTベースの初の動画生成モデルで、高品質な動画をリアルタイムに生成可能。テキストから動画、画像+テキストから動画の2つのシナリオに対応。
テキスト生成ビデオ 英語
L
Lightricks
165.42k
1,174
Wan2.1 14B VACE GGUF
Apache-2.0
Wan2.1-VACE-14BモデルのGGUF形式のバージョンで、主にテキストからビデオの生成タスクに使用されます。
テキスト生成ビデオ
W
QuantStack
146.36k
139
Animatediff Lightning
Openrail
超高速テキスト生成動画モデル、生成速度はオリジナルAnimateDiffの10倍以上
テキスト生成ビデオ
A
ByteDance
144.00k
925
V Express
V-Expressは、オーディオと顔のキーポイント条件に基づいて生成されるビデオ生成モデルで、オーディオ入力を動的なビデオ出力に変換できます。
テキスト生成ビデオ 英語
V
tk93
118.36k
85
Cogvideox 5b
その他
CogVideoXは清影に由来する動画生成モデルのオープンソース版で、高品質な動画生成能力を提供します。
テキスト生成ビデオ 英語
C
THUDM
92.32k
611
Llava NeXT Video 7B Hf
LLaVA-NeXT-Videoはオープンソースのマルチモーダルチャットボットで、動画と画像データの混合トレーニングにより優れた動画理解能力を獲得し、VideoMMEベンチマークでオープンソースモデルのSOTAレベルを達成しました。
テキスト生成ビデオ
Transformers 英語

L
llava-hf
65.95k
88
Wan2.1 T2V 14B Diffusers
Apache-2.0
万2.1は、動画生成の境界を突破することを目的とした包括的なオープンな動画基盤モデルで、中英テキストから動画生成、画像から動画生成など様々なタスクをサポートします。
テキスト生成ビデオ 複数言語対応
W
Wan-AI
48.65k
24
Wan2.1 T2V 1.3B Diffusers
Apache-2.0
万2.1は包括的に開放されたビデオ基盤モデルで、トップクラスの性能、コンシューマー向けGPUサポート、マルチタスク対応、視覚テキスト生成、高効率ビデオVAEなどの特徴を備えています。
テキスト生成ビデオ 複数言語対応
W
Wan-AI
45.29k
38
Wan2.1 T2V 14B
Apache-2.0
万2.1は包括的なオープンソース動画基盤モデルで、テキストから動画生成、画像から動画生成、動画編集、テキストから画像生成、動画から音声生成など多様なタスクに対応し、日中バイリンガルのテキスト生成をサポートします。
テキスト生成ビデオ 複数言語対応
W
Wan-AI
44.88k
1,238
おすすめ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