近日部署跑通的若干多模态模型总结与论文概述

CLIP模型概述与落地测试

CLIP模型全称是Contrastive Language-Image Pretraining​​(对比语言图像预训练)。是OpenAI于2021年提出的多模态预训练模型,通过对比学习对齐图像和文本的表示,实现零样本(zero-shot)迁移到多种视觉任务。其核心思想是​​“用自然语言监督视觉模型”​​,即利用互联网规模的图像-文本对训练,使模型理解开放世界的视觉概念。

其特点总结如下:

1.采用多模态对齐,图像用视觉编码器VIT(vision transformer),或者resnet残差网络,文本用文本编码器如transformer编码。最终实现最大化匹配图像和文本的相似度。CLIP对于图像的编码实际上用的是resnet 50

2.零样本迁移,无需微调即可直接应用于新任务(如分类、检索),通过文本提示(prompt)生成分类器。

3.prompt工程,提示工程与集成提高了零样本性能。与使用无上下文类名的基线相比,提示工程与集成在 36 个数据集上平均将零样本分类性能提高了近 5 个百分点。这种提升与使用基线零样本方法时将计算量增加 4倍所获得的提升相似,但在进行多次预测时,这种提升是“免费的”。

resnet50是五十层的残差神经网络,通过全局池化和批量归一化来优化性能,可以用于对图像进行特征提取。

在论文中阐述clip的图例如下:

首先是预训练,然后是构建数据集分类器,最后是用于零损失预测。

CLIP模型被发布在hugging face官网以供下载。

但是由于国内下载hugging face速度太慢,而模型本身大小较大,因此在国内镜像网站上面下载,采用git lfs clone来下载。

测试办法参考项目工程,该工程应用CLIP来做图文等多模态信息检索并求解相似度。

GitHub - pydaxing/clip_blip_embedding_rag: 在RAG技术中,嵌入向量的生成和匹配是关键环节。本文介绍了一种基于CLIP/BLIP模型的嵌入服务,该服务支持文本和图像的嵌入生成与相似度计算,为多模态信息检索提供了基础能力。

比如:

git lfs clone https://www.modelscope.cn/<namespace>/<model-name>.git 

然后将namespace/model-name.git替换成要下载的模型名称。openai/clip-vit-large-patch14,namespace是出品方,model-name是下载的模型的名字。主要的代码如下,运行时候

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import CLIPProcessor, CLIPModel
import torch
from PIL import Image
import requests
from io import BytesIO
import numpy as np
import time
import asyncio
from concurrent.futures import ThreadPoolExecutor
from typing import List  # 导入 List 类型# Use a pipeline as a high-level helper# 加载模型和处理器
# Load model directly
processor = CLIPProcessor.from_pretrained("./dataroot/models/openai/clip-vit-large-patch14")
model = CLIPModel.from_pretrained("./dataroot/models/openai/clip-vit-large-patch14")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)# 函数:生成文本嵌入
def get_text_embedding(text):inputs = processor(text=[text], return_tensors="pt", padding=True).to(device)with torch.no_grad():embedding = model.get_text_features(**inputs)return embedding.cpu().numpy()def get_image_embedding(image_url):try:response = requests.get(image_url)image = Image.open(BytesIO(response.content)).convert("RGB")inputs = processor(images=image, return_tensors="pt").to(device)with torch.no_grad():embedding = model.get_image_features(**inputs)return embedding.cpu().numpy()except Exception as e:return Noneclass EmbeddingService:def __init__(self, max_concurrency=5):self.semaphore = asyncio.Semaphore(max_concurrency)async def get_embedding(self, index, param, result, candidate_type):async with self.semaphore:loop = asyncio.get_running_loop()with ThreadPoolExecutor() as pool:if candidate_type == "text":result[index] = await loop.run_in_executor(pool, get_text_embedding, param)elif candidate_type == "image":result[index] = await loop.run_in_executor(pool, get_image_embedding, param)app = FastAPI()class QueryRequest(BaseModel):query: strcandidates: List[str]query_type: str = "text"  # 默认为文本candidate_type: str = "text"  # 默认为文本def cosine_similarity(vec1, vec2):return np.dot(vec1, vec2.T) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))@app.post("/similarity")
async def similarity(request: QueryRequest):# 解析请求数据query = request.querycandidates = request.candidatesquery_type = request.query_typecandidate_type = request.candidate_type# 生成查询嵌入if query_type == "text":query_embedding = get_text_embedding(query).tolist()  # 转换为可序列化格式elif query_type == "image":query_embedding = get_image_embedding(query)if query_embedding is None:raise HTTPException(status_code=400, detail="Failed to load query image from URL")query_embedding = query_embedding.tolist()  # 转换为可序列化格式else:raise HTTPException(status_code=400, detail="Invalid query_type")# 使用并发生成候选嵌入result = [None] * len(candidates)embedding_service = EmbeddingService(max_concurrency=5)# 并发执行任务,限制同时运行的任务数await asyncio.gather(*[embedding_service.get_embedding(i, candidate, result, candidate_type)for i, candidate in enumerate(candidates)])# 计算相似度similarities = []for candidate, candidate_embedding in zip(candidates, result):if candidate_embedding is None:raise HTTPException(status_code=400, detail=f"Failed to load candidate image from URL: {candidate}")similarity_score = cosine_similarity(query_embedding, candidate_embedding)similarities.append((candidate, float(similarity_score)))  # 确保 similarity_score 是 float 类型# 按相似度排序并返回最相似的候选结果similarities.sort(key=lambda x: x[1], reverse=True)return {"similarities": similarities}

uvicorn是一个基于 Python 的 ​​ASGI(Asynchronous Server Gateway Interface)服务器​​,专为高性能异步 Web 应用设计。通过uvicorn启动服务器的命令如下:

uvicorn embedding:app --host 0.0.0.0 --port 9502

得到的测试结果如下:

在上图中和锂电池查询What is the cycle life of this 3.2V 280ah Lifepo4 battery匹配最高的图像是,相似度为0.2983


 

videochat模型概述与部署测试

 videochat-flash模型是由上海AI lab研究人员等开发的一款MLLM模型,以往模型的难点在于如何处理长时间的视频。该模型的创新点在于:

1.片段级压缩​​:将视频分割为片段,通过时空注意力(UMT-L编码器)和相似令牌合并(ToMe),将每帧压缩至16个令牌(压缩比1/50)。

2.视频级压缩​​:在LLM推理时渐进丢弃冗余令牌(浅层均匀丢弃,深层基于文本引导的注意力选择),减少计算量且提升性能。

训练的数据集为:

​LongVid数据集​​:30万小时长视频+20亿文本注释,覆盖5类任务(字幕生成、时间定位等),整合Ego4D、HowTo100M等数据。

通过这些办法最终在处理长视频时候计算量大大降低。性能大大提高。图例如下:

在镜像网站上的开源模型为:

本地的测试代码如下,在实际测试中引起问题的主要来源在transformer的版本。

还有其他的下载的包应当保持对齐为:

pip install transformers==4.40.1
pip install timm
pip install av
pip install imageio
pip install decord
pip install opencv-python
# optional
pip install flash-attn --no-build-isolation
from modelscope import AutoModel, AutoTokenizer
import torch# model setting
model_path = './VideoChat-Flash-Qwen2_5-2B_res448'tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).to(torch.bfloat16).cuda()
image_processor = model.get_vision_tower().image_processormm_llm_compress = False # use the global compress or not
if mm_llm_compress:model.config.mm_llm_compress = Truemodel.config.llm_compress_type = "uniform0_attention"model.config.llm_compress_layer_list = [4, 18]model.config.llm_image_token_ratio_list = [1, 0.75, 0.25]
else:model.config.mm_llm_compress = False# evaluation setting
max_num_frames = 512
generation_config = dict(do_sample=False,temperature=0.0,max_new_tokens=1024,top_p=0.1,num_beams=1
)video_path = "./testvideo.mp4"# single-turn conversation
question1 = "Describe this video in detail."
output1, chat_history = model.chat(video_path=video_path, tokenizer=tokenizer, user_prompt=question1, return_history=True, max_num_frames=max_num_frames, generation_config=generation_config)print(output1)# multi-turn conversation
question2 = "How many people appear in the video?"
output2, chat_history = model.chat(video_path=video_path, tokenizer=tokenizer, user_prompt=question2, chat_history=chat_history, return_history=True, max_num_frames=max_num_frames, generation_config=generation_config)print(output2)#multi-turn
question3="who is the oldest in this video?"
output3, chat_history = model.chat(video_path=video_path, tokenizer=tokenizer, user_prompt=question3, chat_history=chat_history, return_history=True, max_num_frames=max_num_frames, generation_config=generation_config)
print(output3)

然后问题在于如何找到测试视频,这里采用的是python中的you-get模块:

pip install you-get

后通过下面的命令就可以实现视频的爬取,这里下载了一段电视剧片段,2720帧,视频大意是一个老人去法国买羊角面包回去给他的老朋友带去吃。

you-get https://www.bilibili.com/video/

爬取后进行模型测试,备注,此处还需要使用CUDA支持,需要电脑装有invidia显卡并下载CUDA相应工具包。得到结果如下,符合视频实际逻辑。

VICLIP模型概述与部署测试

viclip 是由上海ai lab的opengv-lab等团队联合实现的,这篇论文,arxiv链接如下:

https://arxiv.org/pdf/2307.06942

其中首先提出了一个intern vid数据集,其具备大范围多国源视频和高质量文本标注,用BLIP-2为视频中间帧生成描述。用Tag2Text逐帧标注,再通过大语言模型(如LLaMA)汇总为整体描述。

随后介绍了VICLIP模型,其基于CLIP的对比学习框架,视频编码器为ViT-L(加入时空注意力),文本编码器与CLIP相同。VICLIP的创新点在于使用了视频掩码学习来随机遮蔽视频块(类似MAE),降低计算成本。​视频掩码学习(Video Masked Learning)​​ 是一种受自然语言处理(NLP)和计算机视觉中掩码建模(如BERT、MAE)启发的自监督学习方法,旨在通过遮蔽部分视频数据并让模型预测被遮蔽的内容,从而学习视频的时空表征。

VCLIP采用两段训练,关注infoNCE损失度,最大化视频-文本对的相似度。

VICLIP在训练过程中使用了64张A100,训练了三天在五千万的视频-文本对上。结果较好

viclip在hugging face平台的模型如下:

在下载好后,使用其示例中的视频,一个男人和狗在雪地中玩的视频。

在jupyter笔记本的demo中跑得结果如下:

text: A man in a gray sweater plays fetch with his dog in the snowy yard, throwing a toy and watching it run. ~ prob: 0.8264 该文本最和视频相符。

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

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

相关文章

Web3 初学者的第一个实战项目:留言上链 DApp

目录 &#x1f4cc; 项目简介&#xff1a;留言上链 DApp&#xff08;MessageBoard DApp&#xff09; &#x1f9e0; 技术栈 &#x1f536; 1. Solidity 智能合约代码&#xff08;MessageBoard.sol&#xff09; &#x1f537; 2. 前端代码&#xff08;index.html script.js…

LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在日常开发中&#xff0c;我们经常需要在一组有序的数据中快速找到最接近某个目标值的元素。LeetCode 第 270 题“Closest Binary Search Tree Value”正是这样一个问题。本文将深入解析该…

Kotlin高阶函数多态场景条件判断与子逻辑

Kotlin高阶函数多态场景条件判断与子逻辑 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某条件println(somefun.invoke(a, b))//if 某条件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…

嵌入式学习--江协51单片机day4

昨天周五没有学习&#xff0c;因为中午没有睡觉&#xff0c;下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊&#xff0c;但以后周末会是学一天&#xff0c;另一天休息和写周总结。 今天学了串口通信和LED点阵屏&#xff0c;硬件原理是真的很迷&#xff0c;一但想搞…

Spring Cloud 以Gateway实现限流(自定义返回内容)

前言 Spring Cloud Gateway自带RequestRateLimiterGatewayFilterFactory限流方案&#xff0c;可基于Redis和RedisRateLimiter实现默认算法为令牌桶的请求限流。作为自带的该限流方案&#xff0c;其可与Spring生态的其它各项组件无缝集成&#xff0c;并且自身实现也相对完善/好用…

容器填充函数fill和memset对比总结

文章目录 1、fill() 按元素填充2、memset() 按字节填充3、对比 1、fill() 按元素填充 用于将容器或数组的指定范围内的元素赋值为指定值&#xff08;按元素类型填充&#xff09;。属于 C STL 算法&#xff08;<algorithm> 头文件&#xff09;。 // 从起始地址到结束地址…

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …

CogView4 文本生成图像

CogView4 文本生成图像 flyfish 基于 CogView4Pipeline 的图像生成程序&#xff0c;其主要目的是依据 JSON 文件里的文本提示信息来生成图像&#xff0c;并且把生成的图像保存到指定文件夹。 JSON 文件格式 [{"prompt": "your first prompt"},{"pr…

路由重发布

路由重发布 实验目标&#xff1a; 掌握路由重发布的配置方法和技巧&#xff1b; 掌握通过路由重发布方式实现网络的连通性&#xff1b; 熟悉route-pt路由器的使用方法&#xff1b; 实验背景&#xff1a;假设学校的某个分区需要配置简单的rip协议路由信息&#xff0c;而主校…

机器人领域和心理学领域 恐怖谷 是什么

机器人领域和心理学领域 恐怖谷 是什么 恐怖谷是一个在机器人领域和心理学领域备受关注的概念,由日本机器人专家森政弘于1970年提出。 含义 当机器人与人类的相似度达到一定程度时,人类对它们的情感反应会突然从积极变为消极,产生一种毛骨悚然、厌恶恐惧的感觉。这种情感…

Go-GJSON 组件,解锁 JSON 读取新姿势

现在的通义灵码不但全面支持 Qwen3&#xff0c;还支持配置自己的 MCP 工具&#xff0c;还没体验过的小伙伴&#xff0c;马上配置起来啦~ https://click.aliyun.com/m/1000403618/ 在 Go 语言开发领域&#xff0c;json 数据处理是极为常见的任务。Go 标准库提供了 encoding/jso…

数据分析_数据预处理

1 数据预处理流程 ①数据清洗:处理数据缺失、数据重复、数据异常等问题,提升数据质量. ②数据转换:涵盖基本数据转换、语义数据转换、衍生数据转换和隐私数据转换,适配分析需求. ③数据集成:整合多源数据. 2 数据清洗 2.1 数据缺失 2.1.1 数值型数据缺失 数值型列的部分数值不…

vue +xlsx+exceljs 导出excel文档

实现功能&#xff1a;分标题行导出数据过多&#xff0c;一个sheet表里表格条数有限制&#xff0c;需要分sheet显示。 步骤1:安装插件包 npm install exceljs npm install xlsx 步骤2&#xff1a;引用包 import XLSX from xlsx; import ExcelJS from exceljs; 步骤3&am…

ThinkPad T440P如何从U盘安装Ubuntu24.04系统

首先制作一个安装 U 盘。我使用的工具是 Rufus &#xff0c;它的官网是 rufus.ie &#xff0c;去下载最新版就可以了。直接打开这个工具&#xff0c;选择自己从ubuntu官网下载Get Ubuntu | Download | Ubuntu的iso镜像制作U盘安装包即可。 其次安装之前&#xff0c;还要对 Thi…

第十七次博客打卡

今天学习的内容是动态规划算法。 动态规划算法&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将复杂问题分解为更小的子问题来求解的算法思想。它主要用于解决具有重叠子问题和最优子结构特性的问题。 一、动态规划的基本概念 1. 最优子结构 一个复…

视觉革命来袭!ComfyUI-LTXVideo 让视频创作更高效

探索LTX-Video 支持的ComfyUI 在数字化视频创作领域&#xff0c;视频制作效果的提升对创作者来说无疑是一项重要的突破。LTX-Video支持的ComfyUI便是这样一款提供自定义节点的工具集&#xff0c;它专为改善视频质量、提升生成速度而开发。接下来&#xff0c;我们将详细介绍其功…

Java版ERP管理系统源码(springboot+VUE+Uniapp)

ERP系统是企业资源计划&#xff08;Enterprise Resource Planning&#xff09;系统的缩写&#xff0c;它是一种集成的软件解决方案&#xff0c;用于协调和管理企业内各种关键业务流程和功能&#xff0c;如财务、供应链、生产、人力资源等。它的目标是帮助企业实现资源的高效利用…

CenOS7切换使用界面

永久切换 在开始修改之前&#xff0c;我们首先需要查看当前的启动模式。可以通过以下命令来实现&#xff1a; systemctl get-default执行此命令后&#xff0c;系统会返回当前的默认启动模式&#xff0c;例如graphical.target表示当前默认启动为图形界面模式。 获取root权限&…

Dify使用总结

最近完成了一个Dify的项目简单进行总结下搭建服务按照官方文档操作就行就不写了。 进入首页之后由以下组成&#xff1a; 探索、工作室、知识库、工具 探索&#xff1a; 可以展示自己创建的所有应用&#xff0c;一个应用就是一个APP&#xff0c;可以进行测试使用 工作室包含…

计网学习笔记———网络

&#x1f33f;网络是泛化的概念 网络是泛化的概念 &#x1f342;泛化理解 网络的概念在生活中无处不在举例&#xff1a;社交网络、电话网路、电网、计算机网络 &#x1f33f;网络的定义 定义&#xff1a; 离散的个体通过通讯手段连成群体&#xff0c;实现资源的共享与交流、个…