Internvl 2 5 HiCo R16
InternVideo2.5は、InternVL2.5を基盤としたビデオマルチモーダル大規模言語モデル(MLLM)で、長く豊富なコンテキスト(LRC)モデリングによって強化され、細粒度の詳細を感知し、長時間の時系列構造を捉えることができます。
ダウンロード数 1,914
リリース時間 : 1/23/2025
モデル概要
InternVideo2.5は、直接選好最適化(TPO)による高密度視覚タスクのアノテーションと、適応型階層的トークン圧縮(HiCo)によるコンパクトな時空間表現を実現し、既存のMLLMの能力を大幅に向上させたビデオマルチモーダル大規模言語モデルです。
モデル特徴
長く豊富なコンテキスト(LRC)モデリング
LRCモデリングにより強化され、細粒度の詳細を感知し、長時間の時系列構造を捉えることができます。
適応型階層的トークン圧縮(HiCo)
コンパクトな時空間表現を実現し、モデルの効率を向上させます。
直接選好最適化(TPO)
高密度視覚タスクのアノテーションによりモデルの性能を最適化します。
モデル能力
ビデオ理解
マルチモーダル推論
長尺ビデオ分析
細粒度詳細知覚
使用事例
ビデオ分析
ビデオ内容の説明
シーン、人物、アクションを含むビデオ内容を詳細に説明します。
高精度のビデオ内容理解
長尺ビデオ構造分析
長尺ビデオ中の時系列構造と主要イベントを捕捉します。
59.6の精度(LongVideoBench)
マルチモーダルタスク
マルチモーダル推論
ビデオとテキスト情報を組み合わせて複雑な推論を行います。
74.0の精度(MVBench)
🚀 📕InternVL2.5_HiCo_R16⚡
InternVideo2.5は、長く豊富なコンテキスト(LRC)モデリングを強化したビデオマルチモーダル大規模言語モデル(MLLM、InternVL2.5をベースに構築)です。細粒度の詳細を知覚する能力と長い時間構造を捉える能力を向上させることで、既存のMLLMを大きく改善しています。これは、直接的な嗜好最適化(TPO)を使用した高密度ビジョンタスクアノテーションと、適応的階層的トークン圧縮(HiCo)によるコンパクトな時空間表現を通じて達成されています。このモデルは、InternVideo2.5のアブレーション実験のバリアントで、HiCo技術のみを使用して構築されています(R16は1フレームあたり16トークンを意味します)。
✨ 主な機能
InternVideo2.5は、InternVL2.5をベースにしたビデオマルチモーダル大規模言語モデルで、長く豊富なコンテキストモデリングを強化しています。これにより、細粒度の詳細を知覚する能力と長い時間構造を捉える能力が向上しています。
📦 インストール
まず、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(w/o sub) |
---|---|---|---|
InternVL2.5_HiCo_R16 | 74.0 | 59.6 | 64.9 |
📄 ライセンス
このプロジェクトは、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}
}
@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}
}
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