Internvideo2 5 Chat 8B
InternVideo2.5は、長く豊富なコンテキスト(LRC)モデリングを強化したビデオマルチモーダル大規模言語モデルで、InternVL2.5を基盤として構築されており、細粒度の詳細を感知し、長時間の時系列構造を捉える能力を向上させることで、既存のMLLMモデルを大幅に改善しています。
ダウンロード数 8,265
リリース時間 : 1/22/2025
モデル概要
InternVideo2.5は、直接選好最適化(TPO)による高密度視覚タスクのアノテーションと、適応型階層トークン圧縮(HiCo)によるコンパクトな時空間表現を実現することで、細粒度の詳細を感知し、長時間の時系列構造を捉える能力を大幅に向上させたビデオマルチモーダル大規模言語モデルです。
モデル特徴
長く豊富なコンテキスト(LRC)モデリング
細粒度の詳細を感知し、長時間の時系列構造を捉える能力を強化することで、既存のMLLMモデルを大幅に改善
直接選好最適化(TPO)
高密度視覚タスクのアノテーションによりモデル性能を向上
適応型階層トークン圧縮(HiCo)
コンパクトな時空間表現を実現し、処理効率を向上
モデル能力
ビデオ内容理解
ビデオテキスト生成
マルチモーダル推論
長動画処理
使用事例
ビデオ内容分析
ビデオ内容記述
ビデオ内容を詳細に記述
正確で詳細なビデオ記述テキストを生成
ビデオ質問応答
ビデオ内容に関する質問に回答
ビデオ中の人物、動作、シーンなどに関する質問に正確に回答
長動画処理
長動画要約
長動画内容を要約
簡潔な長動画内容の要約を生成
🚀 InternVideo2.5⚡
InternVideo2.5は、InternVL2.5をベースに構築されたビデオマルチモーダル大規模言語モデル(MLLM)で、長時間かつ豊富なコンテキスト(LRC)モデリングが強化されています。このモデルは、直接的な嗜好最適化(TPO)による高密度ビジョンタスクアノテーションと、適応的階層的トークン圧縮(HiCo)によるコンパクトな時空間表現を通じて、細粒度の詳細を知覚する能力と長時間の時間構造を捉える能力を向上させ、既存のMLLMを大きく上回る性能を発揮します。
🚀 クイックスタート
モデルの使用方法
まず、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/InternVideo2_5_Chat_8B'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda().to(torch.bfloat16)
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)
✨ 主な機能
InternVideo2.5は、長時間かつ豊富なコンテキスト(LRC)モデリングを強化することで、既存のMLLMを大きく上回る性能を発揮します。具体的には、細粒度の詳細を知覚する能力と長時間の時間構造を捉える能力が向上しています。これは、直接的な嗜好最適化(TPO)による高密度ビジョンタスクアノテーションと、適応的階層的トークン圧縮(HiCo)によるコンパクトな時空間表現を通じて実現されています。
📦 インストール
まず、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
📈 性能
モデル | MVBench | LongVideoBench | VideoMME(w/o sub) |
---|---|---|---|
InternVideo2.5 | 75.7 | 60.6 | 65.1 |
📄 ライセンス
このプロジェクトはApache-2.0ライセンスの下で提供されています。
✏️ 引用
@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}
}
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