近日部署跑通的若干多模態模型總結與論文概述

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.pswp.cn/news/904891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904891.shtml
英文地址,請注明出處:http://en.pswp.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;實現資源的共享與交流、個…