InternVL3-8B 视频理解入门:让模型看懂视频内容的完整教程

【免费下载链接】InternVL3-8B 【免费下载链接】InternVL3-8B 项目地址: https://ai.gitcode.com/hf_mirrors/OpenGVLab/InternVL3-8B

想让 AI 真正"看懂"一段视频,而不只是静态图片?这篇 InternVL3-8B 视频理解入门教程,将带你从零开始,用 OpenGVLab 开源的 InternVL3-8B 多模态大模型完成视频内容理解。InternVL3-8B 是一款先进的多模态大语言模型(MLLM),不仅能识别图片、回答图文问题,还支持视频多轮对话——它会自动抽取视频关键帧,理解动作、场景与语义,然后用自然语言回答你的提问。本文用最少的代码、最快的路径,帮你快速上手视频理解。

InternVL3-8B 视频理解示例图片:小熊猫

InternVL3-8B 是什么:能看懂视频的多模态大模型

InternVL3-8B 是 OpenGVLab 推出的 InternVL3 系列中的 8B 参数版本,采用经典的 "ViT-MLP-LLM" 架构:

  • 视觉部分:InternViT-300M-448px-V2_5 视觉编码器,负责提取图像/视频帧特征
  • 语言部分:Qwen2.5-7B 语言模型,负责组织回答
  • 关键能力:支持单图、多图、视频输入,还引入了可变视觉位置编码(V2PE),长视频理解能力更强

相比只看单张图片,视频理解对模型的要求高得多:画面在动、动作在变、情节在推进。InternVL3-8B 的做法很聪明——它按时间均匀抽帧,把视频拆成一张张"关键帧"当作多图序列处理,从而让模型"看"懂完整视频内容。

视频理解的原理:如何把视频喂给模型

InternVL3-8B 的视频理解流程分三步:

  1. 抽帧:使用 decord 视频库读取视频,按时间轴均匀抽取 N 帧(官方示例默认 8 帧,最多可到 32 帧)
  2. 分块:对每一帧做动态分辨率切块(448×448 的 tile),并记录每帧对应的 patch 数量
  3. 拼接提问:把每帧以 Frame1: <image>\nFrame2: <image>... 的形式拼进提示词,模型逐帧理解后生成回答

这一步的核心代码在项目根目录的 README.md 中,视频加载逻辑(load_video 与 get_index 函数)可直接复用。

第一步:准备环境和模型

快速安装依赖

只需要 transformers、torch、decord、Pillow、torchvision 这几个库:

pip install transformers>=4.37.2 torch decord Pillow torchvision

获取模型权重

模型权重已按 4 个分片存放在仓库中(model-00001-of-00004.safetensors 到 model-00004-of-00004.safetensors,共约 15.9GB),模型索引见 model.safetensors.index.json。如果你需要 clone 仓库,地址为 https://gitcode.com/hf_mirrors/OpenGVLab/InternVL3-8B。

第二步:加载 InternVL3-8B 模型

用 transformers 的 AutoModel 即可完成加载,官方推荐使用 bfloat16 精度并开启 Flash Attention:

import torch
from transformers import AutoModel, AutoTokenizer

path = "OpenGVLab/InternVL3-8B"
model = AutoModel.from_pretrained(
    path,
    torch_dtype=torch.bfloat16,
    low_cpu_mem_usage=True,
    use_flash_attn=True,
    trust_remote_code=True,
    device_map='cuda').eval()
tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False)

💡 显存不够?可改用 load_in_8bit=True 做 8bit 量化加载,能将显存需求降低一大截。

第三步:视频推理完整代码

仓库自带了示例视频 examples/red-panda.mp4,下面用最精简的代码让模型看懂这段小熊猫视频:

import numpy as np
import torch
from decord import VideoReader, cpu
from PIL import Image

def load_video(video_path, num_segments=8, input_size=448):
    vr = VideoReader(video_path, ctx=cpu(0), num_threads=1)
    max_frame, fps = len(vr) - 1, float(vr.get_avg_fps())
    seg_size = max_frame / num_segments
    frame_indices = np.array([int(seg_size * i + seg_size / 2) for i in range(num_segments)])
    frames = [Image.fromarray(vr[i].asnumpy()).convert('RGB') for i in frame_indices]
    # 缩放到模型输入尺寸
    transform = T.Compose([T.Resize((input_size, input_size)), T.ToTensor()])
    pixel_values = torch.stack([transform(f) for f in frames]).to(torch.bfloat16).cuda()
    return pixel_values, [1] * num_segments

video_path = './examples/red-panda.mp4'
pixel_values, num_patches_list = load_video(video_path, num_segments=8)

video_prefix = ''.join([f'Frame{i+1}: <image>\n' for i in range(8)])
question = video_prefix + 'What is the red panda doing?'
response = model.chat(tokenizer, pixel_values, question,
                      dict(max_new_tokens=1024, do_sample=True),
                      num_patches_list=num_patches_list)
print(response)

运行后,模型会结合 8 个关键帧,回答小熊猫在做什么、处于什么环境,实现真正的视频内容理解。

第四步:视频多轮对话进阶技巧

看过一遍视频后,你还可以追问细节,让视频理解进入多轮模式。相关实现位于 modeling_internvl_chat.py 的 chat 方法中,只要传入 return_history=True 保留历史即可:

question = 'What is the red panda doing?'
response, history = model.chat(tokenizer, pixel_values, question, generation_config,
                               num_patches_list=num_patches_list, return_history=True)
question = 'Describe this video in detail.'
response, history = model.chat(tokenizer, pixel_values, question, generation_config,
                               num_patches_list=num_patches_list, history=history,
                               return_history=True)

第一轮让它概括动作,第二轮让它描述细节,模型会基于同一批帧持续深入理解。

视频理解调优:3 个实用技巧

  1. 抽帧数量 num_segments:默认 8 帧速度最快;视频更长、动作更复杂时建议提到 16~32 帧,理解更准但更耗显存
  2. max_num 控制分辨率:视频场景通常设 1,避免单帧切块过多导致显存爆掉
  3. 长视频支持:得益于 V2PE 可变视觉位置编码,InternVL3 的长上下文理解能力比前代更强,适合处理较长的视频片段

常见问题速查

问题解决方案
显存不足(OOM)改用 8bit 量化加载,或减少 num_segments
加载报错确保 transformers 版本 ≥ 4.37.2
视频打不开安装 decord,并确认视频编码格式兼容
回答不准确增加抽帧数、把问题写得更具体

总结

InternVL3-8B 让视频理解不再遥不可及——抽帧、拼接、问答,三步即可让模型看懂视频内容。从本文的示例出发,你可以继续尝试视频内容摘要、行为分析、视频问答等更多玩法,官方完整示例代码见仓库根目录的 README.md,动手试一试吧!🚀

【免费下载链接】InternVL3-8B 【免费下载链接】InternVL3-8B 项目地址: https://ai.gitcode.com/hf_mirrors/OpenGVLab/InternVL3-8B

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐