许可协议: cc-by-nc-sa-4.0
语言:
- 英文
基础模型:
- lmms-lab/llava-onevision-qwen2-0.5b-ov
任务标签: 视频文本到文本
标签:
- 动作
- 视频
- 多问答
- 多模态
- 多模态大语言模型
- LLaVAction
评估指标:
- 准确率
库名称: transformers
LLaVAction-0.5B
模型概述
LLaVAction-0.5B模型基于Qwen2语言模型,上下文窗口为32K令牌,在EPIC-KITCHENS-100-MQA数据集上训练而成。
使用方法
预期用途
该模型在EPIC-KITCHENS-100-MQA数据集上训练,适用于与EPIC-KITCHENS-100类似的视频内容。
生成示例
我们提供了使用本模型的简单生成流程。更多细节可参考GitHub。
!pip install llavaction
from llavaction.model.builder import load_pretrained_model
from llavaction.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token
from llavaction.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX
from llavaction.conversation import conv_templates, SeparatorStyle
from PIL import Image
import requests
import copy
import torch
import sys
import warnings
from decord import VideoReader, cpu
import numpy as np
warnings.filterwarnings("ignore")
video_path = "XXXX"
视角提示 = "你正以第一人称视角观看此视频,画面中是你的双手与物体交互的过程。你正在执行什么动作?"
任务提示 = "请详细描述你从视频帧中观察到的内容。"
def load_video(video_path, max_frames_num,fps=1,force_sample=False):
if max_frames_num == 0:
return np.zeros((1, 336, 336, 3))
vr = VideoReader(video_path, ctx=cpu(0),num_threads=1)
total_frame_num = len(vr)
video_time = total_frame_num / vr.get_avg_fps()
fps = round(vr.get_avg_fps()/fps)
frame_idx = [i for i in range(0, len(vr), fps)]
if len(frame_idx) > max_frames_num or force_sample:
sample_fps = max_frames_num
uniform_sampled_frames = np.linspace(0, total_frame_num - 1, sample_fps, dtype=int)
frame_idx = uniform_sampled_frames.tolist()
frame_time = [i/vr.get_avg_fps() for i in frame_idx]
spare_frames = vr.get_batch(frame_idx).asnumpy()
return spare_frames,frame_time,video_time
预训练模型 = "MLAdaptiveIntelligence/LLaVAction-0.5B"
模型名称 = "llava_qwen"
设备 = "cuda"
设备映射 = "auto"
tokenizer, model, 图像处理器, max_length = load_pretrained_model(预训练模型, None, 模型名称, torch_dtype="bfloat16", device_map=设备映射)
model.eval()
最大帧数 = 64
视频数据,帧时间,视频时长 = load_video(video_path, 最大帧数, 1, force_sample=True)
视频数据 = 图像处理器.preprocess(视频数据, return_tensors="pt")["pixel_values"].cuda().to(torch.bfloat16)
视频数据 = [视频数据]
对话模板 = "qwen_1_5"
时间指令 = f"视频时长为{视频时长:.2f}秒,从中均匀采样了{len(视频数据[0])}帧。"
问题 = DEFAULT_IMAGE_TOKEN + f"\n{时间指令}\n{视角提示} {任务提示}"
对话副本 = copy.deepcopy(conv_templates[对话模板])
对话副本.append_message(对话副本.roles[0], 问题)
对话副本.append_message(对话副本.roles[1], None)
问题提示 = 对话副本.get_prompt()
输入标识 = tokenizer_image_token(问题提示, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(设备)
输出 = model.generate(
输入标识,
images=视频数据,
modalities= ["video"],
do_sample=False,
temperature=0,
max_new_tokens=4096,
)
文本输出 = tokenizer.batch_decode(输出, skip_special_tokens=True)[0].strip()
print(文本输出)
训练细节
详见Ye等人2025年论文:arxiv.org/abs/2503.18712
模型架构
- 架构: SO400M + Qwen2
- 初始化模型: lmms-lab/llava-onevision-qwen2-0.5b-ov
- 数据: EPIC-KITCHENS-100-MQA,2个epoch,完整模型
- 精度: bfloat16
硬件与软件
GPU: 32 * Nvidia GH-200(用于全系列模型训练)
训练框架: HuggingFace Trainer
神经网络库: PyTorch
引用
arXiv: arxiv.org/abs/2503.18712
@article{YeQi2025llavaction,
title={LLaVAction:评估与训练用于动作识别的多模态大语言模型},
author={叶绍凯 and 齐浩哲 and 亚历山大·马西斯 and 麦肯齐·W·马西斯},
journal={arXiv预印本},
year={2025}
}