LongVU:Meta AI 开源长视频语言理解的多模态模型!能记住视频中的细节,处理大量视频帧!

大模型视频服务数据库

🍹 Insight Daily 🪺

Aitrainee | 公众号:AI进修生

Hi,这里是Aitrainee,欢迎阅读本期新文章。

一个长视频语言理解多模态模型开源了。

长视频语言理解,这个方面的模型还挺少见的。

picture.image

由 Meta AI 等开源。

LongVU 专注于长视频的语言理解,采用时空自适应压缩技术,具备细粒度的内容理解能力,能回答各种视频相关问题,拥有强大的记忆力,适应多种场景,并在有限上下文内高效处理大量视频帧,从而降低计算资源的消耗。


        
            

          LongVU:视频以两个动画角色在奇幻环境中的场景开始,暗示着冒险或冲突的叙述。第一个角色穿着黄色和红色的武术服,戴着面具,处于防御或准备姿势,而第二个角色是一个白胡子、穿着蓝色长袍的老人,显得惊讶或担忧。背景充满了绿色的叶状结构和山地景观,表明了一个自然的、可能是神奇的环境。
        
      

特点:

1、能看懂长视频,支持细粒度的视频内容理解

2、可以回答关于视频内容的各种问题,记忆力特别好,能记住视频中的细节

3、能处理各类场景,从简单的物体运动到复杂的人物互动都可以

4、在有限上下文长度内,能有效处理大量视频帧,减少计算资源的消耗

此次开源包括两种规模,7B和3B,又分为视频和图片

picture.image

模型名称后面带了个Qwen2,这就顾名思义了,该模型以Qwen2和Llama3.2作为语言主干,使用SigLIP和DINOv2作为视觉编码器。

本来觉得7b,3b,应该可以个人用用,可以消费级GPU部署。

可是运行它,至少 40G GPU 。

没错,这不同于文本生成模型,视频的会占用显存更多。

数据集方面,图像文本阶段采用:LLaVA-OneVision-Single, 视频文本阶段采用: VideoChat2-IT。

我们去小破站随机找一个在榜的热门视频。

picture.image

这个视频两分半,18.1MB。

picture.image

picture.image

描述的还是正确的,本来我想接着问的,结果说免费额度到期了,就报错了,唉,下次有空本地部署一下吧。

模型评估

picture.image

picture.image

    1. 性能表现出色
  • • 在第一张表中,LongVU的各项评分在开源视频MLLMs中非常突出。它在EgoSchema、MVBench和MLVU基准测试中的得分分别为 67.666.965.4 。在VideoMME基准中,LongVU的整体得分为 60.6 ,长视频(Long)任务得分为 59.5 ,都位于同类开源模型中的较高水平。
  • • 在第二张表中,LongVU同样在小模型(Llama3.2-3B)对比中表现优异。它在EgoSchema中的得分为 59.1 ,MVBench的得分为 60.9 ,VideoMME整体和长视频任务中的得分分别为 51.547.2 。这些得分表明,LongVU在不同任务和基准测试中具有稳定的表现。
    1. 综合性能稳定
  • • LongVU在不同的基准测试上表现平衡,特别是EgoSchema和MVBench等核心指标,这表明该模型在理解和生成复杂视频内容时具有良好的适应性。
  • • 相较于一些模型在特定指标上可能较高、但在其他任务上表现不足,LongVU的多项指标得分高于大部分同类开源模型,显示了其在各种视频任务中的通用性。
    1. 小模型优势
  • • 表2显示LongVU基于较小模型(Llama3.2-3B)依然能在多个基准中获得优异成绩,说明该模型在资源限制下仍有较强表现力。这对于需要在硬件条件有限的设备上部署视频多模态模型的场景具有重要意义。

综上,LongVU展现出在多个视频基准测试上的卓越性能和稳定表现,是当前开源视频MLLMs中一个强有力的竞争者,尤其在对长视频内容的理解和生成任务中,具备一定的优势。

picture.image

部署


          
git clone https://github.com/Vision-CAIR/LongVU
          
cd LongVU
          
conda create -n longvu python=3.10
          
conda activate longvu
          
pip install -r requirements.txt
      

推理


          
import numpy as np
          
import torch
          
from longvu.builder import load_pretrained_model
          
from longvu.constants import (
          
    DEFAULT_IMAGE_TOKEN,
          
    IMAGE_TOKEN_INDEX,
          
)
          
from longvu.conversation import conv_templates, SeparatorStyle
          
from longvu.mm_datautils import (
          
    KeywordsStoppingCriteria,
          
    process_images,
          
    tokenizer_image_token,
          
)
          
from decord import cpu, VideoReader
          

          
tokenizer, model, image_processor, context_len = load_pretrained_model(
          
    "./checkpoints/longvu_qwen", None, "cambrian_qwen",
          
)
          

          
model.eval()
          
video_path = "./examples/video1.mp4"
          
qs = "Describe this video in detail"
          

          
vr = VideoReader(video_path, ctx=cpu(0), num_threads=1)
          
fps = float(vr.get_avg_fps())
          
frame_indices = np.array([i for i in range(0, len(vr), round(fps),)])
          
video = []
          
for frame_index in frame_indices:
          
    img = vr[frame_index].asnumpy()
          
    video.append(img)
          
video = np.stack(video)
          
image_sizes = [video[0].shape[:2]]
          
video = process_images(video, image_processor, model.config)
          
video = [item.unsqueeze(0) for item in video]
          

          
qs = DEFAULT_IMAGE_TOKEN + "\n" + qs
          
conv = conv_templates["qwen"].copy()
          
conv.append_message(conv.roles[0], qs)
          
conv.append_message(conv.roles[1], None)
          
prompt = conv.get_prompt()
          

          
input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(model.device)
          
stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
          
keywords = [stop_str]
          
stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
          
with torch.inference_mode():
          
    output_ids = model.generate(
          
        input_ids,
          
        images=video,
          
        image_sizes=image_sizes,
          
        do_sample=False,
          
        temperature=0.2,
          
        max_new_tokens=128,
          
        use_cache=True,
          
        stopping_criteria=[stopping_criteria],
          
    )
          
pred = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip()
      

🌟希望这篇文章对你有帮助,感谢阅读!如果你喜欢这系列文章请以 点赞 / 分享 / 在看 的方式告诉我,以便我用来评估创作方向。

👽Submission:kristjahmez06@gmail.com

参考链接:

[1] github:https://github.com/Vision-CAIR/LongVU

[2] huggingface:https://huggingface.co/spaces/Vision-CAIR/LongVU

[3] https://d.aigclink.ai/Meta-AI-LongVU-12d9857c0f4780c496fad00c6a8579e0

知音难求,自我修炼亦艰

抓住前沿技术的机遇,与我们一起成为创新的超级个体

(把握AIGC时代的个人力量)

picture.image

点这里👇关注我,记得标星哦~

一键三连「分享」、「点赞」和「在看」

科技前沿进展日日相见 ~

picture.image

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论