【多模态大模型】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.rhkb.cn/news/319666.html

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

相关文章

Git常用(持续更新)

常用场景: 初始化: git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交: gi…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能: 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听,达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml,两者仅…

500行代码实现贪吃蛇(1)

文章目录 目录1. Win32 API 介绍1.1 Win32 API1.2 控制台程序(Console)1.3 控制台屏幕上的坐标COORD1.4 [GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5 [GetConsoleCursorInfo](https://learn.microsoft.com/zh-c…

2024年 Java 面试八股文——SpringBoot篇

目录 1. 什么是 Spring Boot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 6. Spring Boot 支持哪些日志框架&#…

Flutter笔记:Widgets Easier组件库(4)使用按钮组

Flutter笔记 Widgets Easier组件库(4):使用按钮组 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress…

【小浩算法 BST与其验证】

BST与其验证 前言我的思路思路一 中序遍历判断数组无重复递增思路二 递归边界最大值最小值的传递 我的代码测试用例1测试用例2 前言 BST是二叉树一个经典应用,我们常常将其用于数据的查找以及构建平衡二叉树等。今天我所做的题目是验证一颗二叉树是否为二叉搜索树&…

机器学习-K近邻算法(KNN)

目录 什么是KNN算法 图解KNN基本算法 (1)k近邻算法中k的选取 (2)距离函数 (3)归一化处理 (4)概率kNN KNN算法的优缺点 优势 缺点 KNN算法总结 什么是KNN算法 k近邻算法&…

农作物害虫检测数据集VOC+YOLO格式18975张97类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):18975 标注数量(xml文件个数):18975 标注数量(txt文件个数):18975 标…

周三多《管理学原理》第3版/考研真题/章节练习题

普通高等教育“十一五”国家级规划教材《管理学原理》(第3版,周三多、陈传明、龙静编著,南京大学出版社)是我国高校广泛采用的管理学权威教材之一,也被众多高校(包括科研机构)指定为考研考博专业…

电脑技巧:推荐一款非常好用的媒体播放器PotPlayer

目录 一、 软件简介 二、功能介绍 2.1 格式兼容性强 2.2 高清播放与硬件加速 2.3 自定义皮肤与界面布局 2.4 多音轨切换与音效增强 2.5 字幕支持与编辑 2.6 视频截图与录像 2.7 网络流媒体播放 三、软件特色 四、使用技巧 五、总结 一、 软件简介 PotPlayer播放器 …

排序-八大排序FollowUp

FollowUp 1.插入排序 (1).直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i…

使用Android Studio 搭建AOSP FrameWork 源码阅读开发环境

文章目录 概述安装Android Studio编译源码使用Android Studio打开源码制作ipr文件直接编译成功后自动打开Android Studio 修改SystemUI验证开发环境 概述 我们都知道Android的系统源码量非常之大&#xff0c;大致有frameworka层源码&#xff0c;硬件层(HAL)源码&#xff0c;内…

能源监控新方案:IEC104转MQTT网关在新能源发电中的应用

需求背景 近些年&#xff0c;我国新能源产业快速发展&#xff0c;光伏、风电等新能源项目高速增长&#xff0c;新能源发电已经成为国家能源结构的重要组成部分。 打造数字化、智能化、信息化的电力物联网系统&#xff0c;实现光伏风电等新能源发电站的远程监控、远程维护是新能…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能&#xff0c;让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

数据库开发关键之与DQL查询语句有关的两个案例

案例 案例1 条件分页查询 查看项目经理提供给我们的需求文档 模糊匹配的含义是 只要包含"张"就可以 use dduo;-- 按照需求完成员工管理的条件分页查询 根据输入条件 查询第一页的数据 每页展示10条记录 -- 输入条件&#xff1a; -- 姓名&#xff1a; 张 -- 年龄&…

【Java】基本程序设计结构(一)

前言&#xff1a;现在&#xff0c;假定已经成功安装了JDK&#xff0c;并且能够运行上篇示例程序。本篇将开始介绍Java程序中的基本设计结构&#xff0c;其中包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&…

n-Track Studio Suite for Mac激活版:打造您的专属音频工作室

n-Track Studio Suite for Mac是一款功能强大的数字音频工作站软件&#xff0c;让您在家中就能享受到专业录音棚的待遇。无论是录制人声、乐器还是MIDI序列&#xff0c;都能轻松应对。 n-Track Studio Suite for Mac激活版下载 这款软件拥有实时音高校准、时间拉伸和自动补足功…

HT32F52352 -- 解锁电调、电机速度控制

一、问题背景 1.1 硬件&#xff1a; 电池组&#xff0c;电子调速器&#xff08;好盈电调 /ESC&#xff09;&#xff0c;接收机&#xff08;HT32F52352&#xff09;&#xff0c;风扇。 1.2 软件 keil5 二、问题分析 通过1.1图中可知&#xff0c;我们只需要使用 HT32F52352 模拟…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

【介绍下有那些常见的ssh功能】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…