【多模态大模型】AI对视频内容解析问答

文章目录

  • 1. 项目背景
  • 2. 直接对视频进行解析进行AI问答:MiniGPT4-Video
    • 2.1 MiniGPT4-Video效果
  • 3. 对视频抽帧为图片再进行AI问答
    • 3.1 视频抽帧
    • 3.2 图片AI问答
      • 3.2.1 阿里通义千问大模型 Qwen-vl-plus
      • 3.2.2 Moonshot

1. 项目背景

最近在做一个项目,需要使用AI技术对视频内容进行解析。实现这个功能,我们有两种可行的思路:

  1. 直接对视频进行解析进行AI问答:
  • 这种方法可以充分利用视频中包含的动态信息,如物体运动、声音等,从而得到更丰富的理解结果。
  • 需要使用专门的视频处理和理解模型,例如视频分类、目标检测、字幕生成等深度学习技术。
  • 这种方式计算量较大,对硬件性能要求较高,适合部署在服务器端环境中。
  1. 对视频抽帧为图片再进行AI问答:
  • 这种方法相对更加简单和高效,可以直接利用成熟的图像理解模型。
  • 可以根据需求灵活选择合适的帧率,提取关键帧进行分析。
  • 这种方法计算量较小,更适合部署在移动设备或边缘计算环境中。

2. 直接对视频进行解析进行AI问答:MiniGPT4-Video

MiniGPT4-video是一个视频理解的多模态大模型,可以直接对视频内容向AI进行提问。

官网:https://vision-cair.github.io/MiniGPT4-video/
论文链接:https://arxiv.org/abs/2404.03413

2.1 MiniGPT4-Video效果

官网中可以传本地视频和链接视频测试效果。我们只要在 Your Question 输入对AI提出的问题,AI就会在 MiniGPT4-video Answer 中给出这个问题的答案。

笔者做了多次尝试,能够直接对视频内容进行解析,快速得到想要的答案,效果还不错。

3. 对视频抽帧为图片再进行AI问答

3.1 视频抽帧

笔者测试了两款常用的视频抽帧工具:opencv 和 ffmpeg。这两款工具实现的效果都相同,笔者更倾向于使用 opencv,因为它是python的第三方库,可以直接调用python代码,使用起来更方便。详细的介绍,可以查看笔者的另一篇文章:

视频抽帧转图片,opencv和ffmpeg效果测评

在这里补充一下视频处理的几个重要概念:

  • 帧(Frame):在视频或动画中,帧指的是单个静态图像。视频或动画由大量连续的帧组成。
  • 帧数(Frame Count):视频或动画中总共包含的帧的数量。帧数决定了视频或动画的长度。
  • 帧率(Frame Rate):每秒显示的帧数,也称为FPS(Frames Per Second)。帧率决定了视频或动画的流畅度和质量。常见的帧率有24FPS、30FPS、60FPS等。
  • FPS(Frames Per Second):每秒显示的帧数,即帧率。这是视频或动画的一个重要参数,决定了画面的流畅性。较高的帧率(如60FPS)可以提供更流畅的视觉体验,而较低的帧率(如24FPS)可能会出现卡顿或闪烁的问题。

举例来说假如我有一个视频,他的视频长度是42s,fps是25,每隔15秒抽取一张图,那么抽取的图片数是: 25*42/15 = 70张。

如果使用的是 opencv,可以使用以下代码,通过调整 timef,可以得到截取到不同数目的视频图片数。

import cv2
from PIL import Image
import numpy as npcap = cv2.VideoCapture("D:/Download/ANMR0005.mp4")  # 获取视频对象
isOpened = cap.isOpened  # 判断是否打开
# 视频信息获取
fps = cap.get(cv2.CAP_PROP_FPS)imageNum = 0
sum=0
timef=15  #隔15帧保存一张图片while (isOpened):sum+=1(frameState, frame) = cap.read()  # 记录每帧及获取状态if frameState == True and (sum % timef==0):# 格式转变,BGRtoRGBframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 转变成Imageframe = Image.fromarray(np.uint8(frame))frame = np.array(frame)# RGBtoBGR满足opencv显示格式frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)imageNum = imageNum + 1fileName = 'D:/Download/video_image/image' + str(imageNum) + '.jpg'  # 存储路径cv2.imwrite(fileName, frame, [cv2.IMWRITE_JPEG_QUALITY, 100])print(fileName + " successfully write in")  # 输出存储状态elif frameState == False:breakprint('finish!')
cap.release()

3.2 图片AI问答

接下来,让我们来测试阿里通义千问大模型 Qwen-vl-plus 和 Moonshot。

我们准备了一张从海飞丝洗发水的广告视频中抽帧出来的图片,要让AI回答:请你判断图中是否包含洗发水?,请你回答“是”或“否”,并解释原因
在这里插入图片描述

3.2.1 阿里通义千问大模型 Qwen-vl-plus

在使用 Qwen-vl-plus 大模型需要在官网创建一个API-KEY,才能调用接口。API官方文档用详细介绍这个模型要怎么调用,参数如何设置等详细说明。

  • API官方说明文档:

https://help.aliyun.com/zh/dashscope/developer-reference/qwen-vl-plus/?spm=a2c4g.11186623.0.0.1e9d7794QqfJS4

  • API-KEY的创建:

https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key?spm=a2c4g.11186623.0.0.21477794cgawYi

调用 Qwen-vl-plus 大模型,与AI问答的代码,如下:

from dashscope import MultiModalConversation
import dashscope
import json
import timedef invokeQween_vl_plus(api_key, prompt, file_path):'''API官方说明文档:https://help.aliyun.com/zh/dashscope/developer-reference/qwen-vl-plus/?spm=a2c4g.11186623.0.0.1e9d7794QqfJS4@paramapi_key (str): 阿里云 用户中心-API Key管理获取:https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key?spm=a2c4g.11186623.0.0.36347794rx7gaKprompt (str): 对文件分析的指令file_path (str):需要解析的文件路径。示例:"./A.png"@returntext (str):模型输出input_tokens(int):输入Tokenoutput_tokens(int):输出Tokenimage_tokens (int):输入图片Tokentime_consuming(int):耗时'''messages = [{'role': 'user','content': [{'image': file_path},{'text': prompt},]}]start_time = time.time()response = MultiModalConversation.call(model='qwen-vl-plus', messages=messages)time_consuming = time.time() - start_timetext = response.output.choices[0].message.content[0]["text"]input_tokens = response.usage["input_tokens"]output_tokens = response.usage["output_tokens"]image_tokens = response.usage["image_tokens"]print(f"input_tokens:{input_tokens}")print(f"output_tokens:{output_tokens}")print(f"image_tokens:{image_tokens}")print(f"运行时间:{time_consuming}")return text, input_tokens, output_tokens, image_tokens, time_consuming#=========================================== 调用示例 ============================================
# 调用示例
dashscope.api_key = "Your-KEY"
prompt = '请你判断图中是否包含洗发水的实物图?请你回答“是”或“否”,并解释原因'
file_path = "C:\\Users\video\\open_cv_images\\test3\\image42.jpg"text, input_tokens, output_tokens, image_tokens, time_consuming = invokeQween_vl_plus(dashscope.api_key, prompt, file_path)
print(text)

输出的结果是:

input_tokens:1248
output_tokens:46
image_tokens:1196
运行时间:8.08695936203003
是。图片中的女子手中拿着一瓶带有蓝色泵头和白色瓶身,上面印有品牌名称"海飞丝"以及产品信息的洗发水瓶子,这是一张该产品的实物展示照片。

3.2.2 Moonshot

Moonshot 也需要申请 API-KEY

API官方说明文档:

https://platform.moonshot.cn/docs/api-reference#%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF

用户中心-API Key管理获取:

https://platform.moonshot.cn/console/api-keys

对应的代码如下;

import requests
from pathlib import Path
from openai import OpenAIdef invokeMoonshot_FileAnalysis(api_key, prompt, file_path):'''Moonshot 文件解析:上传文件 → OCR提取文件信息 → Moonshot 大模型分析 → 结论API官方说明文档:https://platform.moonshot.cn/docs/api-reference#%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF@paramapi_key (str): Moonshot 用户中心-API Key管理获取:https://platform.moonshot.cn/console/api-keysprompt (str): 对文件分析的指令file_path (str):需要解析的文件路径。示例:"./A.png"@returnoutput (str):模型输出input_tokens (int): 输入Tokenoutput_tokens (int): 输出Tokentime_consuming (int): 耗时'''client = OpenAI(api_key=api_key, base_url="https://api.moonshot.cn/v1")                  # 账号信息 & 文件上传 URLfile_object = client.files.create(file=Path(file_path), purpose="file-extract")          # 上传需要解析的文件,得到文件idfile_content = client.files.content(file_id=file_object.id).text                         # 获取上传文件被OCR提取的文本信息token_count_url = 'https://api.moonshot.cn/v1/tokenizers/estimate-token-count'           # 计算Token的请求地址 # 拼装模型输入messages=[ {"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。",},{"role":"system","content":file_content},{"role": "user", "content":prompt}]      # 调用大模型APIstart_time = time.time()completion = client.chat.completions.create(model="moonshot-v1-8k",   # moonshot-v1-8k, moonshot-v1-32k, moonshot-v1-128kmessages=messages,temperature=0.01,top_p=0.01,max_tokens=4096,n=1,presence_penalty=0,frequency_penalty=0,)output = completion.choices[0].message.content#print(completion.choices)time_consuming = time.time() - start_time# 计算输入tokenheaders = {"Content-Type": "application/json","Authorization": f"Bearer {api_key}"}data_input = {"model": "moonshot-v1-8k","messages":  messages}response_input = requests.post(token_count_url, json=data_input, headers=headers)# 解析JSON响应并获取total_tokens的值input_tokens = response_input.json()['data']['total_tokens']print(f"input_tokens:{input_tokens}")# 计算输出tokendata_output = {"model": "moonshot-v1-8k","messages": [{"role": "system","content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"},{ "role": "assistant", "content": output}]}response_output = requests.post(token_count_url, json=data_output, headers=headers)# 解析JSON响应并获取total_tokens的值output_tokens = response_output.json()['data']['total_tokens']print(f"output_tokens:{output_tokens}")return output,input_tokens,output_tokens,time_consuming#=========================================== 调用示例 ============================================
api_key = 'Your-KEY'
file_name = 'image42.jpg'
prompt =  '请你判断{}的信息中是否包含洗发水?,请你回答“是”或“否”,并解释原因'.format(file_name)
file_path = "C:\\Users\\video\\open_cv_images\\test3\\image42.jpg"
start_time = time.time()
output,input_tokens,output_tokens,time_consuming = invokeMoonshot_FileAnalysis(api_key, prompt, file_path)
print(output,input_tokens,output_tokens,time_consuming)

输出结果:

是。
原因:在提供的信息中,“海飞丝”是一个知名的洗发水品牌,因此可以判断信息中包含了洗发水的提及。 155 103 0.939953088760376

从两个模型的结果来看,Qwen-vl-plus 直接根据图片做AI问答,而 Moonshot 是将图片信息转为文本信息,然后再做AI问答,上述代码中 Qwen-vl-plus 的参数会比 Moonshot 多一个 image_tokens。

总的来说,对于我们的测试数据,两个模型都能给出比较准确的答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

618科技嘉年华!五款极致科技产品,开启智能生活新篇章!

准备好迎接一年一度的618了吗?这不仅仅是一场购物的狂欢,更是一次科技的盛宴,一次智能生活的全新启航。今年,我们将带来五款令人瞩目的极致科技产品,它们将彻底颠覆你对智能生活的认知。从娱乐到工作,这些产…

百度语音识别的springboot应用

1、pom依赖 <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.18</version> </dependency> 2、测试的demo 创建语音识别应用 百度智能云-管理中心 (baidu.com) 代码中要…

常用图像加密技术-流密码异或加密

异或加密是最常用的一种加密方式&#xff0c;广泛的适用于图像处理领域。这种加密方式依据加密密钥生成伪随机序列与图像的像素值进行异或操作&#xff0c;使得原像素值发生变化&#xff0c;进而使得图像内容发生变化&#xff0c;达到保护图像内容的目的。 该加密方法是以图像…

基于python-flask技术的社区信息交流平台【数据库+15000文档】

预览 介绍 系统只需使用者通过电脑浏览器即可实现系统的访问和操作的WEB模式的信息化系统。为了保证系统数据的准确性、安全性的数据存储&#xff0c;系统应用MySQL数据库进行系统数据存储服务。根据对社区工作的深入调研和对社区居民的走访调查&#xff0c;详细分析整体系统的…

短信验证码绕过漏洞(一)

短信验证码绕过漏洞 0x01原理&#xff1a; 服务器端返回的相关参数作为最终登录凭证&#xff0c;导致可绕过登录限制。 危害&#xff1a;在相关业务中危害也不同&#xff0c;如找回密码&#xff0c;注册&#xff0c;电话换绑等地方即可形成高危漏洞&#xff0c;如果是一些普…

【VS+QT】visual studio 2022配置和搭建QT

一、下载QT 可以去QT官网下载:https://www.qt.io/product/development-tools。 直接安装。 二、安装qt插件 打开visual studio 2022&#xff0c;选择菜单栏中扩展->管理扩展 ,然后直接在vs插件市场搜索Qt Visual Studio Tools就行。 安装的时候根据提示&#xff0c;关闭…

YOLov5 + Gradio搭建简单的Web GUI

写在前面&#xff1a;当我们将模型训练出来了&#xff0c;此时就需要做UI界面给别人展示了。python提供的Gradio可以快速的搭建web页面。生成本地网址和公网网址&#xff0c;方面自己测试和用户测试。 一、安装 Gradio介绍 Gradio是一个开源的python库&#xff0c;用于构建机…

react完整项目搭建的思路

react完整项目搭建的思路 react完整项目搭建的思路1.使用creacte-react-app初始化项目2.安装所需插件:路由、网络、样式、组件库3.reactjs目录结构组织4. 配置路径别名4.配置路由5.网络配置,对axios进行封装》获取当前环境变量 6.配置代理解决跨域7.配置使用iconfont8.状态管理…

浅析扩散模型与图像生成【应用篇】(十七)——LDM

17. High-Resolution Image Synthesis with Latent Diffusion Models 该文首次提出在潜在特征空间中的扩散模型LDM&#xff0c;也是大名鼎鼎的Stable Diffusion&#xff08;SD&#xff09;模型的基础。不同于之前的扩散模型直接在图像维度上进行扩散和去噪&#xff0c;LDM首先训…

C++拷贝构造函数的合成

默认构造函数和拷贝构造函数在必要的时候才由编译期合成出来 文章目录 拷贝构造函数编译器合成拷贝构造函数的四种情况情况一 一个类有一个带有拷贝构造函数的类对象成员变量情况二 派生类的基类有一个拷贝构造函数类声明了一个或多个虚函数情况四 类派生自一个继承串联且有一个…

JUC-并发编程19-定时任务定时线程池-ScheduledThreadPoolExecutor

1、结构图 2、初识 ScheduledThreadPoolExecutor用来处理延时任务或定时任务。 流程如下&#xff1a; 2.1 定时任务分为四种 如下&#xff1a; 未来执行一次的任务&#xff0c;无返回值&#xff1b; 未来执行一次的任务&#xff0c;有返回值&#xff1b; 未来按固定频率重复…

安川YASKAWA机器人FS100控制箱维修全攻略

本文将一起探讨安川机器人控制箱维修和YASKAWA机械手FS100控制柜故障&#xff0c;从故障诊断到维修技巧。注意&#xff0c;在安川机械臂控制器FS100维修过程中&#xff0c;遇到复杂的问题&#xff0c;不要犹豫&#xff0c;及时联系子锐机器人&#xff0c;让您的机器人重获新生&…

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

一篇了解reactor框架特性

一篇了解reactor框架特性 本文档的一些典型的名词如下&#xff1a; Publisher&#xff08;发布者&#xff09;、Subscriber&#xff08;订阅者&#xff09;、Subscription&#xff08;订阅 n.&#xff09;、subscribe&#xff08;订阅 v.&#xff09;。event/signal&#xff0…

抖音 通用交易系统 下单 密钥生成

已PHP为例 前提提条件 必须在 linux 系统中 生成 准备工作 在小程序中 生成应用公匙 把生成的公匙 复制 在linux 系统中 创建文件 private_key.pem 并将公匙粘贴 接下来打开命令 执行命令即可 openssl genrsa -out private_key.pem 2048 rsa -in private_key.pem -pubo…

分治策略 --- 快排归并

目录 分治-快排 一、颜色分类 二、排序数组 三、数组中的第K个最大元素 四、库存管理 分治-归并 一、排序数组 二、交易逆序对的总数 三、计算右侧小于当前元素的个数 四、翻转对 分治是一种思想&#xff0c;也就是将大问题分解成小问题&#xff0c;一直分到小问题可…

【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ②

DRQ的作用&#xff1a; DRQ负责调度管理pipeline里的node处理逻辑(通过node之间的dependency依赖机制) 利用多线程并行处理Pipeline中并行的node&#xff0c;加快处理速度 DRQ运转流程&#xff1a; DRQ先告诉node fill dependency&#xff0c; 此时seq id 为0…

如何优雅的实现 iframe 多层级嵌套通讯

前言 在前端开发项目中&#xff0c;不可避免的总会和 iframe 进行打交道&#xff0c;我们通常会使用 postMessage 实现消息通讯。 如果存在下面情况&#xff1a; iframe 父子通讯iframe 同层级通讯iframe 嵌套层级通讯 当面对这种复杂的情况的时候&#xff0c;通讯不可避免…

Unity 物体触碰事件监听

声明委托 public delegate void MyDelegate(Collider trigger); C# 委托&#xff08;Delegate&#xff09; | 菜鸟教程 (runoob.com)https://www.runoob.com/csharp/csharp-delegate.html 定义委托 public MyDelegate onTriggerEnter; public MyDelegateonTriggerStay; pub…

用来传输文件的协议-FTP

一.FTP协议--文件传输协议 1.了解FTP协议 &#xff08;1&#xff09;FTP服务是用来传输文件的协议 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是TCP/IP协议组中的协议之一&#xff0c;用于互联网上的控制文件的双向传输。是传输文件到Linu…