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

news2024/11/27 22:25:24

文章目录

  • 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 np


cap = 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):

        # 格式转变,BGRtoRGB
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # 转变成Image
        frame = Image.fromarray(np.uint8(frame))

        frame = np.array(frame)

        # RGBtoBGR满足opencv显示格式
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

        imageNum = imageNum + 1
        fileName = '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:
        break

print('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 time

def 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

    @param
    api_key (str): 阿里云 用户中心-API Key管理获取:https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key?spm=a2c4g.11186623.0.0.36347794rx7gaK
    prompt (str): 对文件分析的指令
    file_path (str):需要解析的文件路径。示例:"./A.png"
    
    @return
    text (str):模型输出
    input_tokens(int):输入Token
    output_tokens(int):输出Token
    image_tokens (int):输入图片Token
    time_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_time
    
    text = 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 OpenAI

def 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

    @param
    api_key (str): Moonshot 用户中心-API Key管理获取:https://platform.moonshot.cn/console/api-keys
    prompt (str): 对文件分析的指令
    file_path (str):需要解析的文件路径。示例:"./A.png"
    
    @return
    output (str):模型输出
    input_tokens (int): 输入Token
    output_tokens (int): 输出Token
    time_consuming (int): 耗时
    '''

    client = OpenAI(api_key=api_key, base_url="https://api.moonshot.cn/v1")                  # 账号信息 & 文件上传 URL
    file_object = client.files.create(file=Path(file_path), purpose="file-extract")          # 上传需要解析的文件,得到文件id
    file_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}
        ]      
    
    # 调用大模型API
    start_time = time.time()
    completion = client.chat.completions.create(
        model="moonshot-v1-8k",   # moonshot-v1-8k, moonshot-v1-32k, moonshot-v1-128k
        messages=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

    # 计算输入token
    headers = {
        "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}")

    # 计算输出token
    data_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.coloradmin.cn/o/1631700.html

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

相关文章

Python 语音识别系列-实战学习-语音识别特征提取

Python 语音识别系列-实战学习-语音识别特征提取 前言1.预加重、分帧和加窗2.提取特征3.可视化特征4.总结 前言 语音识别特征提取是语音处理中的一个重要环节,其主要任务是将连续的时域语音信号转换为连续的特征向量,以便于后续的语音识别和语音处理任务…

qt学习篇---C++基础学习

本学习笔记学习下面视频总结,感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…

Spring ai 快速入门及使用,构建你自己的ai

第一步:创建springboot项目 jdk必须是17及以上 1.8用不了 第二步 选择web和ai的依赖 选择openai 第三步 需要配置openai key 配置 分享个免费或的apikey的地方New API 会免费赠送1刀的token spring.application.namespringAI spring.ai.openai.base-urlhttps://ap…

封装形式,进化,DIP封装及键出方法

本文主要讨论芯片封装的主要形式,概念,以及芯片封装的演化,最后以DIP封装为例,分析键出方式。 1-IC封装的形式 IC 封装是指将组成电子器件的各个组成部分,包括半导体芯片、基板、管脚连接线等,按照要求布局…

【maven】pom文件详解和延伸知识

【maven】pom文件详解 【一】maven项目的pom文件详解【1】maven项目的目录结构【2】根元素和必要配置【3】父项目和parent元素【4】项目构建需要的信息【5】项目依赖相关信息(1)依赖坐标(2)依赖类型(3)依赖…

文件上传安全以及防止无限制文件上传

文件上传安全以及防止无限制文件上传 在网络应用中,文件上传是一项常见功能,用户可以通过它上传图片、文档或其他媒体文件。然而,如果没有适当的安全措施,文件上传功能可能成为安全漏洞的源头。本文将探讨文件上传过程中的安全风…

在网站源码后台增加响应式布局

一本教材上的网站源码,后台在手机上查看还是按照电脑的页面样式,不方便查看和发布新内容。教材上讲了响应式布局。对于页面结构简单的网站,可以利用响应式,使页面自动适用各种屏幕的分辨率。 今天在一个网站源码的后台使用了响应…

夸克网盘免费领取1TB空间的方法

夸克网盘背靠阿里这颗大树,经历了这两年的发展,用户规模早已是千万级体量,用户体验个人也觉得非常不错,并且在日臻完善的路上,必会越走越远。现在已经不能领取一个月会员,也没有了2TB免费空间的说法&#x…

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

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

vue2左侧菜单栏收缩展开功能

目录 1. Main.vue页面代码 a. 修改侧边栏属性 b. 修改头部导航栏 c. 定义我们的变量 d. collapse函数 2. Header.vue页面代码 3. Aside.vue页面代码 vue2左侧菜单栏收缩展开目前是非常常见的,我们在日常开发过程中经常会碰到。这一小节我们就详细了解一下这个…

Spring IOC(二)

1. Bean的定义与获取 1.1 定义Bean 在Spring 中定义Bean的方式主要有三种&#xff1a; 1、基于XML配置文件的方式&#xff08;了解&#xff09;&#xff1a;通常会在配置文件中使用<bean>标签来定义Bean&#xff0c;并设置Bean的属性、依赖关系等信息。 2、基于注解的方…

基于Spring Boot的商务安全邮件收发系统设计与实现

基于Spring Boot的商务安全邮件收发系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 已发送效果图&#xff0c;用户可以对已发送信息…

javaweb学习week6

javaweb学习 九.登录认证 5.登录后下发令牌 生成令牌&#xff1a;引入JWT令牌操作工具类&#xff0c;登录完成后&#xff0c;调用工具类生成JWT令牌&#xff0c;并返回 代码实例&#xff1a; 6.Filter入门 概念&#xff1a;Filter过滤器&#xff0c;是Javaweb三大组件之一…

构建本地大语言模型知识库问答系统

MaxKB 2024 年 4 月 12 日&#xff0c;1Panel 开源项目组正式对外介绍了其官方出品的开源子项目 ——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品…

【生活日常】听歌识曲失败后,寻找一首曲子的心路历程……

Have a nice day :) 0x00 事情经过 叶子现在心情很是激动&#xff01;是这样的…… 昨天下午呢&#xff0c;去了家不错的咖啡厅&#xff0c;点了杯冰美式&#xff0c;很不错&#xff01; 而且店里的 Marshall 音箱也很带劲&#xff01; 然后我听到了种类似 "合成器节奏…

SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录 1.中文乱码处理1.引出问题1.恢复原来取消掉的属性绑定2.启动服务器&#xff0c;引出问题 2.自定义中文乱码过滤器1.MyCharacterFilter.java2.web.xml配置过滤器&#xff08;这个解决乱码的过滤器放到最前面&#xff09;3.结果展示 3.使用Spring过滤器处理&#xff08;…

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

解决Pytorch的cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

目录 1. 问题报错2. 可能原因2.1 GPU内存不足2.2 缓存问题2.3 CUDA和Pytorch版本不兼容2.4 CUDA和cuDNN版本不兼容 3. 验证CUDA是否可用4. 参考 1. 问题报错 在使用GPU加速模型训练的过程中经常会遇到这样的错误&#xff1a; RuntimeError: cuDNN error: CUDNN_STATUS_NOT_IN…

8_手眼标定总结_auboi5机械臂与海康平面相机

经过不断地学习与调试&#xff0c;不断地学习网络上其他同志分享的资料&#xff0c;opencv手眼标定迎来了阶段性结束。实际测试结果在机械臂坐标系中X方向差5mm左右。 代码参考《https://blog.csdn.net/wanggao_1990/article/details/81435660》 注意事项&#xff1a; ①标定…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…