本文將介紹來自 Salesforce 研究院的 BLIP-2 模型,它支持一整套最先進的視覺語言模型,且已集成入 Transformers。我們將向你展示如何將其用于圖像字幕生成、有提示圖像字幕生成、視覺問答及基于聊天的提示這些應用場景。
BLIP-2 模型文檔:
https://hf.co/docs/transformers/main/en/model_doc/blip-2
Transformers 模型及文檔:
https://hf.co/transformers
簡介
近年來,計算機視覺和自然語言處理領域各自都取得了飛速發(fā)展。但許多實際問題本質(zhì)上其實是多模態(tài)的,即它們同時涉及幾種不同形式的數(shù)據(jù),如圖像和文本。因此,需要視覺語言模型來幫助解決一系列組合模態(tài)的挑戰(zhàn),我們的技術才能最終得到廣泛落地。視覺語言模型可以處理的一些 圖生文 任務包括圖像字幕生成、圖文檢索以及視覺問答。圖像字幕生成可以用于視障人士輔助、創(chuàng)建有用的產(chǎn)品描述、識別非文本模態(tài)的不當內(nèi)容等。圖文檢索可以用于多模態(tài)搜索,也可用于自動駕駛場合。視覺問答可以助力教育行業(yè)、使能多模態(tài)聊天機器人,還可用于各種特定領域的信息檢索應用。
現(xiàn)代計算機視覺和自然語言模型在能力越來越強大的同時,模型尺寸也隨之顯著增大。由于當前進行一次單模態(tài)模型的預訓練既耗費資源又昂貴,因此端到端視覺語言預訓練的成本也已變得越來越高。
BLIP-2 通過引入一種新的視覺語言預訓練范式來應對這一挑戰(zhàn),該范式可以任意組合并充分利用兩個預訓練好的視覺編碼器和 LLM,而無須端到端地預訓練整個架構。這使得我們可以在多個視覺語言任務上實現(xiàn)最先進的結果,同時顯著減少訓練參數(shù)量和預訓練成本。此外,這種方法為多模態(tài)ChatGPT 類應用奠定了基礎。
BLIP-2 論文鏈接:
https://arxiv.org/pdf/2301.12597.pdf
BLIP-2 葫蘆里賣的什么藥?
BLIP-2 通過在凍結的預訓練圖像編碼器和凍結的預訓練大語言模型之間添加一個輕量級 查詢 Transformer (Query Transformer, Q-Former) 來彌合視覺和語言模型之間的模態(tài)隔閡 (modality gap)。在整個模型中,Q-Former 是唯一的可訓練模塊,而圖像編碼器和語言模型始終保持凍結狀態(tài)。
BLIP-2 框架概覽Q-Former 是一個 transformer 模型,它由兩個子模塊組成,這兩個子模塊共享相同的自注意力層:
- 與凍結的圖像編碼器交互的圖像 transformer,用于視覺特征提取
- 文本 transformer,用作文本編碼器和解碼器
圖像 transformer 從圖像編碼器中提取固定數(shù)量的輸出特征,這里特征的個數(shù)與輸入圖像分辨率無關。同時,圖像 transformer 接收若干查詢嵌入作為輸入,這些查詢嵌入是可訓練的。這些查詢還可以通過相同的自注意力層與文本進行交互 (譯者注: 這里的相同是指圖像 transformer 和文本 transformer 對應的自注意力層是共享的)。
Q-Former 分兩個階段進行預訓練。
第一階段,圖像編碼器被凍結,Q-Former 通過三個損失函數(shù)進行訓練:
- 圖文對比損失 (image-text contrastive loss): 每個查詢的輸出都與文本輸出的 CLS 詞元計算成對相似度,并從中選擇相似度最高的一個最終計算對比損失。在該損失函數(shù)下,查詢嵌入和文本不會 “看到” 彼此。
- 基于圖像的文本生成損失: 查詢內(nèi)部可以相互計算注意力但不計算文本詞元對查詢的注意力,同時文本內(nèi)部的自注意力使用因果掩碼且需計算所有查詢對文本的注意力。
- 圖文匹配損失 (image-text matching loss): 查詢和文本可以看到彼此,最終獲得一個幾率 (logit) 用以表示文字與圖像是否匹配。這里,使用難例挖掘技術 (hard negative mining) 來生成負樣本。
圖像 transformer 作為一個信息瓶頸 (information bottleneck),查詢嵌入經(jīng)過它后,其輸出嵌入已經(jīng)不僅僅包含了視覺信息,而且包含了與文本相關的視覺信息。這些輸出嵌入用作第二階段 LLM 輸入的視覺前綴。該預訓練階段主要涉及一個以基于圖像的文本生成任務,損失函數(shù)使用因果 LM 損失。
BLIP-2 使用 ViT 作為視覺編碼器。而對于 LLM,論文作者使用 OPT 和 Flan T5 模型。你可以找到在 Hugging Face Hub 上找到 OPT 和 Flan T5 的預訓練 checkpoints。
在 Hugging Face Hub 中檢索 BLIP-2 相關模型:
https://hf.co/models?other=blip-2
但不要忘記,如前所述,BLIP-2 設計的預訓練方法允許任意的視覺主干模型和 LLM 的組合。
通過 Hugging Face Transformers 使用 BLIP-2
使用 Hugging Face Transformers,你可以輕松下載并在你自己的圖像上運行預訓練的 BLIP-2 模型。如果你想跑跑本文中的示例,請確保使用大顯存 GPU。
我們從安裝 Transformers 開始。由于此模型是最近才添加到 Transformers 中的,因此我們需要從源代碼安裝 Transformers:
pipinstallgit+https://github.com/huggingface/transformers.git
接下來,我們需要一個輸入圖像?!都~約客》每周都會面向其讀者舉辦一場 卡通字幕比賽。我們從中取一張卡通圖像輸入給 BLIP-2 用于測試。
卡通字母比賽鏈接:
https://www.newyorker.com/cartoons/contest#thisweek
importrequests
fromPILimportImage
url='https://media.newyorker.com/cartoons/63dc6847be24a6a76d90eb99/master/w_1160,c_limit/230213_a26611_838.jpg'
image=Image.open(requests.get(url,stream=True).raw).convert('RGB')
display(image.resize((596,437)))
New Yorker Cartoon現(xiàn)在我們有一張輸入圖像了,還需要一個預訓練過的 BLIP-2 模型和相應的預處理器來處理輸入。你可以在 Hugging Face Hub 上找到所有可用的預訓練 checkpoints 列表。這里,我們將加載一個使用 Meta AI 的預訓練 OPT 模型的 BLIP-2 checkpoint,該 OPT 模型具有 27 億個參數(shù)。
fromtransformersimportAutoProcessor,Blip2ForConditionalGeneration
importtorch
processor=AutoProcessor.from_pretrained("Salesforce/blip2-opt-2.7b")
model=Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b",torch_dtype=torch.float16)
請注意,你暫時還無法使用 Auto API (例如 AutoModelForXXX) 來加載 BLIP-2 模型,這種情況在 Hugging Face 中比較少見。你需要顯式使用 Blip2ForConditionalGeneration
來加載 BLIP-2 模型。雖然自動獲取模型還不能做到,但是你可以使用 AutoProcessor
來獲取匹配的處理器類,在本例中為 Blip2Processor
。
我們可以使用 GPU 來加快文本生成速度:
device="cuda"iftorch.cuda.is_available()else"cpu"
model.to(device)
圖像字幕生成
我們先看看 BLIP-2 是否可以零樣本地為《紐約客》卡通圖像生成字幕。要為圖像添加字幕,我們不必向模型提供任何文本提示,僅提供預處理過的輸入圖像。沒有任何文字提示,模型將從 BOS (beginning-of-sequence) 開始生成圖像字幕。
inputs=processor(image,return_tensors="pt")
generated_ids=model.generate(**inputs,max_new_tokens=20)
generated_text=processor.batch_decode(generated_ids,skip_special_tokens=True)[0].strip()
print(generated_text)
"twocartoonmonsterssittingaroundacampfire"
對于未使用《紐約客》風格的卡通圖像訓練過的模型,這是一個令人印象深刻的準確描述!
有提示圖片字幕生成
我們還可以通過提供文本提示來擴展圖像字幕生成,模型將在給定圖像的情況下接著提示詞往下補充。
prompt="thisisacartoonof"
inputs=processor(image,text=prompt,return_tensors="pt").to(device,torch.float16)
generated_ids=model.generate(**inputs,max_new_tokens=20)
generated_text=processor.batch_decode(generated_ids,skip_special_tokens=True)[0].strip()
print(generated_text)
"twomonsterssittingaroundacampfire"
prompt="theylookliketheyare"
inputs=processor(image,text=prompt,return_tensors="pt").to(device,torch.float16)
generated_ids=model.generate(**inputs,max_new_tokens=20)
generated_text=processor.batch_decode(generated_ids,skip_special_tokens=True)[0].strip()
print(generated_text)
"havingagoodtime"
視覺問答
用于視覺問答時,提示必須遵循特定格式: "Question: {} Answer:"
prompt="Question:Whatisadinosaurholding?Answer:"
inputs=processor(image,text=prompt,return_tensors="pt").to(device,torch.float16)
generated_ids=model.generate(**inputs,max_new_tokens=10)
generated_text=processor.batch_decode(generated_ids,skip_special_tokens=True)[0].strip()
print(generated_text)
"Atorch"
基于聊天的提示
最后,我們可以通過拼接對話中每輪的問題和回答來創(chuàng)建類似 ChatGPT 的體驗。我們用某個提示 (比如 “恐龍拿著什么?”) 來問模型,模型會為它生成一個答案 (如 “火炬”),我們可以把這一問一答拼接到對話中。然后我們再來一輪,這樣就把上下文 (context) 建立起來了。但是,需要確保的是,上下文不能超過 512 個標記,因為這是 BLIP-2 使用的語言模型 (OPT 和 T5) 的上下文長度。
context=[
("Whatisadinosaurholding?","atorch"),
("Wherearethey?","Inthewoods.")
]
question="Whatfor?"
template="Question:{}Answer:{}."
prompt="".join([template.format(context[i][0],context[i][1])foriinrange(len(context))])+"Question:"+question+"Answer:"
print(prompt)
Question:Whatisadinosaurholding?Answer:atorch.Question:Wherearethey?Answer:Inthewoods..Question:Whatfor?Answer:
inputs=processor(image,text=prompt,return_tensors="pt").to(device,torch.float16)
generated_ids=model.generate(**inputs,max_new_tokens=10)
generated_text=processor.batch_decode(generated_ids,skip_special_tokens=True)[0].strip()
print(generated_text)
Tolightafire.
結論
BLIP-2 是一種零樣本視覺語言模型,可用于各種含圖像和文本提示的圖像到文本任務。這是一種效果好且效率高的方法,可應用于多種場景下的圖像理解,特別是當訓練樣本稀缺時。
該模型通過在預訓練模型之間添加 transformer 來彌合視覺和自然語言模態(tài)之間的隔閡。這一新的預訓練范式使它能夠充分享受兩種模態(tài)的各自的進展的紅利。
如果您想了解如何針對各種視覺語言任務微調(diào) BLIP-2 模型,請查看 Salesforce 提供的 LAVIS 庫,它為模型訓練提供全面支持。
Salesforce 提供的 LAVIS 代碼倉庫:
https://github.com/salesforce/LAVIS
要查看 BLIP-2 的運行情況,可以在 Hugging Face Spaces 上試用其演示。
Hugging Face Spaces 中的 Salesforce BLIP-2:
https://hf.co/spaces/Salesforce/BLIP2
致謝
非常感謝 Salesforce 研究團隊在 BLIP-2 上的工作,感謝 Niels Rogge 將 BLIP-2 添加到 Transformers,感謝 Omar Sanseviero 審閱這篇文章。
最后給大家推薦一下最近小編從最新的斯坦福NLP的公開課都放到了bilibili上了,都已做了中英翻譯,大部分已經(jīng)更新完畢了,給需要的小伙伴~是最新的呦~目錄
-
詞向量
-
神經(jīng)分類器
-
反向傳播和神經(jīng)網(wǎng)絡
-
句法結構
-
RNN
-
LSTM
-
機器翻譯、Seq2Seq和注意力機制
-
自注意力和Transformer
-
Transformers和預訓練
-
問答
-
自然語言生成
-
指代消解
-
T5和大型預訓練模型
-
待更...
審核編輯 :李倩
-
編碼器
+關注
關注
44文章
3529瀏覽量
133309 -
計算機視覺
+關注
關注
8文章
1685瀏覽量
45811 -
語言模型
+關注
關注
0文章
487瀏覽量
10201 -
自然語言處理
+關注
關注
1文章
585瀏覽量
13418
原文標題:使用 BLIP-2 零樣本“圖生文”
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論