我们展示如何用Qwen2-VL搭建您自己的视频理解流程,与您的自定义视频进行互动。
Qwen2-VL管道:查询模型关于长视频
Qwen2-VL,一个基于Qwen2 [1] 的高级视觉语言模型,在图像理解方面,尤其是在不同分辨率和比例上,设立了新的基准,同时还能处理更广泛的视频内容。
虽然Qwen2-V在很多方面都很出色,这篇文章将探讨该模型的创新特点及其在视频理解和问答领域的潜在应用。
🔥 这里是一个常见的网络用语 "TL;DR",通常表示“太长了,没看完”。🔥
或
🔥 TL;DR 通常表示“太长了,没看完”。🔥
了解我们CVPR 2024系列中的多模态和基础模型的最新进展:
⭐️ 千万不要错过我们的 SAM 2 分段模型系列,
2. 视频理解和问答任务的Qwen2-VL
3. 接下来会怎样?
视觉语言模型(VLMs)弥合了视觉与文本信息之间的鸿沟。与为特定任务训练的传统模型不同,VLMs 设计来适应各种视觉-语言应用(见图1)。
图1. VLM强大的视觉元素使其非常适合实际视觉任务
VLMs 在海量的图文对数据集上进行训练,以学习图文之间的对应关系。它们使用不同的学习方法:
对比学习: 区分匹配的图像-文本对和不匹配的图像-文本对。示例:CLIP [2]。
掩码目标: 根据可见的上下文预测被掩码的视觉或文本元素。示例:FLAVA [3], MaskVLM [4]。
生成建模: 根据文本描述生成图像,或反过来根据图像生成文本。示例:CoCa [5], CM3leon [6]。
另一方面,VLM的评测依赖于评估其结合视觉和文本信息能力的基准,例如下面这些基准:
Qwen2-VL是在Qwen2语言模型的基础上构建的,旨在实现对图片和视频的理解和互动方面的最先进的表现。
Qwen2-VL的三大主要功能是:
函数调用指的是定义和描述外部应用程序编程接口(API)的能力。Microsoft
在以前的帖子中,我们已经将它们进行了对比(即使用了简单的和复杂的提示来进行图像理解)。在这里,我们将简单地强调Qwen2-VL的强项。
图2展示了Qwen2-VL是如何在视觉理解方面区别于GPT4o和Claude 3.5 Sonnet的,如下所示,无论是视频还是高清的图像。
图2. Qwen2-VL与其他前沿模型的对比
注意: 请注意,Colab的免费版本可能只适用于Qwen2-VL 2B模型。Qwen2-VL 7B可能会耗尽Colab的免费图形处理单元RAM内存。
💻 您可以使用我们为您准备的这个Jupyter Notebook 快只需要速设置并进行推理。😎
图3。我们将用来自巴黎2024年的这段视频作为输入
🤖 我们将会使用上面的视频来问一些像这样的问题:
要设置 Qwen2-VL :
你可以使用pip来安装git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate,加速。 接着,你可以安装qwen-vl-utils。
接下来,Qwen2-VL 可以通过分析视频的每一帧或者直接处理整个视频文件来进行推断。因此,我们需要一个库来提取视频中的每一帧。
# 在Colab笔记本中 pip install ffmpeg -q # 在Colab笔记本中使用 # 在你自己的GPU上,使用conda环境中的Jupyter笔记本 conda install -c conda-forge ffmpeg
我们加载模型,这里使用的是Qwen2-VL 2B。您可以试试Qwen2-VL 7B,以及可通过API获取的72B版本(哇!)。
从transformers库导入Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor 从qwen_vl_utils模块导入process_vision_info # 使用预训练模型初始化model model = Qwen2VLForConditionalGeneration.from_pretrained( "Qwen/Qwen2-VL-2B-Instruct", torch_dtype="auto", device_map="auto" ) # 加载预训练的处理器 processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-2B-Instruct")
# torch_dtype='auto', device_map='auto' 分别表示根据设备自动选择数据类型和设备映射
最后,下面这个函数包裹了一个执行推理的调用。
def 定义查询视频(prompt, use_frames=True, frames_path="/home/qwen2_vl/content/frames", video_path=None): if use_frames: # 获取帧列表 选定的帧 = 获取帧列表(output_path) # 创建帧的消息结构 消息 = [ { "role": "user", "content": [ { "type": "视频", "视频": 选定的帧, "fps": 1.0, }, {"type": "文本", "文本": prompt}, ], } ] else: # 创建整个视频的消息结构 消息 = [ { "role": "user", "content": [ { "type": "视频", "视频": f"file://{video_path}", "最大像素": 360 * 420, "fps": 1.0, }, {"type": "文本", "文本": prompt}, ], } ] print(f"使用{'帧' if use_frames else '整个视频'}进行推理。") # 准备推理 文本 = 处理器应用聊天模板( 消息, tokenize=False, add_generation_prompt=True ) 图像输入, 视频输入 = 处理视觉信息(消息) 输入 = 处理器( 文本=[文本], 图像=图像输入, 视频=视频输入, padding=True, return_tensors="pt", ) 输入 = 输入.to("cuda") # 推理 with torch.no_grad(): # 使用no_grad节省推理期间的内存 生成的_ids_ = 模型.generate(**输入, 最大新令牌=128) # 剪裁生成的输出以移除输入提示 修剪后的生成_ids = [ 出_ids[len(入_ids_):] for 入_ids_, 出_ids in zip(输入.input_ids, 生成的_ids_) ] # 解码生成的文本 输出文本 = 处理器批量解码( 修剪后的生成_ids, skip_special_tokens=True, 清理标记化空间=False ) print(输出文本) torch.cuda.empty_cache()
如图4所示,Qwen2-VL用帧来展示其回答。
图4。Qwen2-VL(帧级别模式)被要求详细描述这段视频
其他问题包括:
特别是考虑到我们使用的是2B模型选项,这些回答看起来相当准确。
如果我们向GPT-4o或Claude 3.5 Sonnet询问同样的问题,虽然一个是苹果一个是橙子(🍎🍊),会有怎样的结果?
图5. Claude 3.5 十四行 提供了类似 Qwen2-VL 的回答。
简而言之,如图5所示的,Claude 3.5 Sonnet 在单一帧上的表现似乎与 Qwen2-VL 不相上下。
但是,如果你想要询问视频中间或结尾的具体的问题?🤔 那么,Qwen2-VL就在这里大放异彩:你只需提出问题就行了! GPT-4o和Claude Sonnet 3.5还不能处理视频(至少还不行)。 📹
谷歌有一些早期的视频理解方案,不过我们会留到另一篇博客文章中再详细讨论。
如图6所示,不出意外地,Qwen2-VL也非常准确。它提供的细节甚至比帧级别版本更多。因为模型现在处理的是整个视频,因此能提供更详细的回答。
图6。当用“详细描述视频”查询时,Qwen2-VL(整个视频模式)提供了更详细的答案,比逐帧的替代方案更详细。
在这篇文章中,我们构建了Qwen2-VL,一种可以用于视频理解和生成的视觉语言模型。
视频搜索和理解技术是一个令人兴奋、亟待革新的领域。正如我们在系列文章《可扩展视频搜索:级联基础模型——第一部分》中提到的,视频无处不在,但支持大规模稳健搜索的基础设施仍在建设中。
[1] Qwen2 的技术文档
[2] 利用自然语言监督学习可迁移的视觉模型技术
FLAVA,一种基础的语言和视觉对齐模型
[4], 掩码视觉与语言模型的多模态表示学习
[5] CoCa:对比式图文生成模型(一种图像文本基础模型)
[6] 自回归多模态模型的扩展性:预训练,与指令微调
[7] MiniGPT-4:利用先进大型语言模型增强视觉和语言的理解
作者: Dmitry Kazhdan, Jose Gabriel Islas Montero
若想了解更多关于Tenyks的内容,可以访问sandbox。