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

news/2024/5/18 20:21:04

文章目录

  • 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.mrgr.cn/p/66173587

相关文章

洛谷P2375 [NOI2014] 动物园

动物园 题目描述输入格式输出格式输入输出样例 输入 3 aaaaa ab abcababc 输出 36 1 32 开始时都没看出来这是kmp板子题 先看看AC代码吧 #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e6+10; const int mod=1e9+7; char a[maxn];…

List的remove()方法详解

https://blog.csdn.net/anxin_hw/article/details/128312846 一、错误使用场景 1、普通for循环遍历List删除指定元素,list.remove(index) 示例:将姓张的名字移除掉List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", &…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速在本地运行大模型。通过简单的安装指令&#xff0c;用户可以执行一条命令就在本地运行开源大型语言模型&#xff0c;如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

软考备考1

【BV1Qc411G7fB】考试形式 考45分就行上午-计算机与软件工程知识-150分钟,笔试,选择题-75分还有5分时专业英语,,一篇文章挖5个空下午-软件设计-150分钟-笔试-简答题-75分三个复习阶段考点理论学习——建立理论框架 题型全覆盖——考试全部题型了然于胸 真题强化训练——适应…

AWVS

工具说明 Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,他通过网络爬虫测试你的网站安全,检测流行安全漏洞。 AWVS可以通过SQL注入攻击、XSS(跨站脚本攻击)、目录遍历、代码执行等漏洞来审核Web应用程序的安全性并输出扫描报告。相对于…

需求改进系统设计

这个作业属于哪个课程 <班级的链接>这个作业要求在哪里 <作业要求的链接>这个作业的目标 <体验项目的流程>1、需求改进 描述改进2、系统设计3、任务分配 由于团队只有一人,所以灵活分配时间 4、测试计划 测试是否可以正常登录 测试是否可以修改密码 测试图书…

低代码技术在构建质量管理系统中的应用与优势

引言 在当今快节奏的商业环境中&#xff0c;高效的质量管理系统对于组织的成功至关重要。质量管理系统帮助组织确保产品或服务符合客户的期望、符合法规标准&#xff0c;并持续改进以满足不断变化的需求。与此同时&#xff0c;随着技术的不断进步&#xff0c;低代码技术作为一…

免费开源语音克隆-GPT-SoVITS-WebUI只需 5 秒的声音样本

语音克隆-GPT-SoVITS-WebUI 强大的少样本语音转换与语音合成Web用户界面。 功能&#xff1a; 零样本文本到语音&#xff08;TTS&#xff09;&#xff1a; 输入 5 秒的声音样本&#xff0c;即刻体验文本到语音转换。 少样本 TTS&#xff1a; 仅需 1 分钟的训练数据即可微调模型…

物联网实战--平台篇之(二)基础搭建

目录 一、Qt工程创建 二、数据库知识 三、通信协议 四、名词定义 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、Qt工程…

树状数组(二维偏序)

题目链接 https://leetcode.cn/problems/maximum-sum-queries/description/ 题目大意题目思路 二维偏序问题 -> 一维排序,一维树状数组! 题目代码 class Solution { public:int sz;vector<int> tr;int lowbit(int x){return x & -x;}void update(int x,int k){f…

《MySQL对数据库中表的结构的操作》

文章目录 一、建表二、查看表结构所有能查看到数据库&#xff0c;表的操作痕迹的本质都是服务器保存下来了这些操作记录。 三、修改表1.改表名字2.添加表记录3.添加表的更多字段4.修改表的字段5. 删除表的字段 总结 以下的数据库表的操作全是基于user_db这个数据库操作的&#…

游戏排名算法:Elo、Glicko、TrueSkill

Elo rating system Elo等级分制度(英语:Elo rating system)是指由匈牙利裔美国物理学家Arpad Elo创建的一个衡量各类对弈活动水平的评价方法,是当今对弈水平评估公认的权威标准。 两个选手(player)在排名系统的不同,可以用来预测比赛结果。两个具有相同排名(rating)的…

Go Web 开发【Gin 框架快速开发】

1、Gin Web 快速开发 1.1、环境准备 1.1.1、导入 gin 依赖 这里就叫 gin 依赖了&#xff0c;在 Goland 命令行中输入下面的命令&#xff1a; go get -u github.com/gin-gonic/gin 1.1.2、设置代理 如果下载失败&#xff0c;最好设置一下代理&#xff0c;在 cmd 命令行中输…

pytho爬取南京房源成交价信息并导入到excel

# encoding: utf-8 # File_name: import requests from bs4 import BeautifulSoup import xlrd #导入xlrd库 import pandas as pd import openpyxl# 定义函数来获取南京最新的二手房房子成交价 def get_nanjing_latest_second_hand_prices():cookies {select_city: 320100,li…

jenkins 部署springboot 项目

文章目录 持续集成指定tag发布 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 持续集成 为了让程序代码可以自动推送到测试环境基于Docker服务运行…

lxc容器没有cron的解决办法

简介 我经常使用cron定时脚本来更新我的cloudflare ddns。 最近想着把pve上跑着的fedora,切换到lxc容器试试。 结果就遇到了没有cron的尴尬。 安装 dnf search crontab dnf install cronatbs启动 systemctl start crond 自启动 systemctl enable crond 小结 主要就是search找一…

亚马逊云科技AWS将推出数据工程师全新认证(有资料)

AWS认证体系最近更新&#xff0c;在原有12张的基础上&#xff0c;将在2023年11月27日添加第13张&#xff0c;数据工程师助理级认证(Data Engineer Associate)&#xff0c;并且在2024/1/12前半价(省75刀&#xff1d;544人民币。 原有的数据分析专家级认证(Data Analytics Specia…

视频局部打马赛克

给视频局部打马赛克,用手机APP剪映,操作如下: 1、打开剪映APP,点击“开始创作”,选择需要打马的视频; 2、点击下方“特效”工具-->选“画面特效”-->“基础”-->搜索“马赛克”,添加马赛克特效; 3、成功添加“马赛克”特效到创作区,根据自己需要拉长或缩短…

Spark SQL编程初级实践

参考链接 Spark编程: Spark SQL基本操作 2020.11.01_df.agg("age"->"avg")-CSDN博客 RDD编程初级实践-CSDN博客 Spark和Hadoop的安装-CSDN博客 1. Spark SQL基本操作 { "id":1 , "name":" Ella" , "age":…

文件(夹)批量重命名数字、字母、日期、中文数字大写小写

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 目标是重命名下面5个文件(也可以是文件夹等,任意),从大写中文数字“贰”开始 打开工具,找到“文件批量复制”版块,快捷键Ctrl+5 找到右下角重命名按钮,点击打开 把那5个要重命名的文件拖入(也…