Skip to content

ImageBind:能轉換多模態向量的模型使用心得筆記

前言

最近的 Meta AI 真的是強到不行,似乎一瞬間站穩了 AI 研發巨擘的地位,而且還是樣樣開源的頂級標竿。從影像領域的能切割物件的 Segment Anything、到公開大型語言模型(Large Language Model)同時也是基石模型(fundational model)的 LLaMA(引起眾羊駝之亂的就是它!)、到最近能轉換 6 種模態(modals)的 ImageBind 跟語音模型計畫 (MMS)…… 只能說像我這種平凡人要努力跟上怎麼去使用都很費勁,更遑論試圖追逐他們的技術了。

而今天,由於我還沒完全看完 IMAGEBIND: One Embedding Space To Bind Them All 這篇論文,只有粗粗掃過,所以就不詳細介紹裡面的原理了,希望改天有空可以來記錄一下讀後心得。

今天,主要就是介紹該如何使用 ImageBind 這個 Meta AI 已經開源出來的模型;當然,他們官方的 GitHub 上已經說明得足夠清楚了,我也就是再補充一下我踩到的小坑。


ImageBind 的特別之處

首先,ImageBind 是一個能轉換出向量、或是你喜歡稱為 embedding —— 的模型,雖然說有 6 種模態:文字text)、圖像vision)、音訊audio)、深度depth)、熱度(thermal)、慣性測量裝置IMU,可以理解成運動趨勢),但基本上除了文字(採用 CLIP 的文本提取,可以參考原始碼 https://github.com/facebookresearch/ImageBind/blob/main/models/imagebind_model.py 的部分)外,其他的全部都是轉成圖片的形式讓 ViT (Vision Transformer) 來處理。

就連音訊也是,是將其轉換成頻譜圖讓 ViT 去處理的;不過,這並不是模型取名為 ImageBind 的原因。

實際上,我們會發現不同模態之間,若是在描述同樣一件事物的向量會是相當接近的,比方說『cat』跟一張『貓咪圖片』在向量空間中會很接近、並且『貓咪圖片』跟『貓叫聲』在向量空間中也會很接近!

那麼 ImageBind 是怎麼做到不同模態之間的向量對齊(alignment)的呢?我本來很天真地以為 Meta AI 準備了窮舉所有組合數的 paired data 資料集,每一種 paired 組合都經歷過對比學習contrastive learning):把相似的 pair 在向量空間中拉近、不相似的 pair 拉遠。

後來發現,ImageBind 基本上是使用了 (Image, D) 這樣的組合 —— 圖像是固定不變的,然後對其他 5 種模態做對比學習。也就是先確認每種模態的最後一層神經網路的輸出維度都一致,並在正規化後使用 InfoNCE Loss 進行模型的訓練。

Image source from: https://arxiv.org/abs/2305.05665

其中 q 是圖像正規化後的 embedding、k 是訓練中另外一個對應模態正規化後的 embedding,τ 則是控制 softmax 平滑程度的溫度超參數。

而這樣訓練完後,很神奇地,『cat』跟『貓叫聲』就在向量空間中是極為接近的存在、也就是完成對齊(alignment)了!

但仔細想想,其實這也不足為奇,甚至還很合理:因為『cat』跟『貓咪圖片』在向量空間中很接近、而『貓叫聲』也跟『貓咪圖片』很接近 —— 這不正意味著『cat』跟『貓叫聲』很接近嗎!

也就是說,圖像的『貓咪圖片』成為了錨點anchor point),把不同模態但相近主題的向量綁定binding)在了一起!

所以 ImageBind 真的是一個非常厲害的模型,能夠轉換出跨模態通用的向量。


如何使用 ImageBind?

要使用 ImageBind,我們自然是需要把官方 GitHub 專案 clone 下來的。

git clone https://github.com/facebookresearch/ImageBind/tree/main


當然,還沒完,我們還要把 Meta AI 開源的 ImageBind 模型一併下載才行。

mkdir ImageBind/.checkpoints
cd ImageBind/.checkpoints

wget https://dl.fbaipublicfiles.com/imagebind/imagebind_huge.pth


接下來才是最麻煩的一步:安裝套件。我強烈建議使用 conda 來安裝,因為我直接用 pip 安裝 cartopy 時出現了一大堆的報錯並且難以解決。最後的解決方法還是在 https://github.com/SciTools/cartopy/issues/1940 看到的,也就是使用 conda install 來安裝。

如果你操作到剛剛上面的步驟,現在我們應該是在 .checkpoints 資料夾裡,首先 cd ../ 跳回上一層,確認當前目錄底下存在 requirements.txt 這份文件,這才開始我們的安裝流程。

conda create --name imagebind python=3.8 -y
conda activate imagebind

pip install -r requirements.txt
conda install -c conda-forge cartopy


安裝套件時如果在 cartopy 報錯了,那麼就使用 conda install 來安裝,之後是可以正常使用模型的。如果是其他的套件未能成功安裝,可能就要上網找找不同的解決方式了。

只能說,不愧是 6 種模態,需要的前處理套件大概都比其他單一模態多不少。

最後,我們終於可以開始測試模型啦!當然,我們需要位於專案資料夾內,才能呼叫官方寫好的程式碼模組。

import data
import torch
from models import imagebind_model
from models.imagebind_model import ModalityType

text_list=["A dog.", "A car", "A bird"]
image_paths=[".assets/dog_image.jpg", ".assets/car_image.jpg", ".assets/bird_image.jpg"]
audio_paths=[".assets/dog_audio.wav", ".assets/car_audio.wav", ".assets/bird_audio.wav"]

device = "cuda:0" if torch.cuda.is_available() else "cpu"

# Instantiate model
model = imagebind_model.imagebind_huge(pretrained=True)
model.eval()
model.to(device)

# Load data
inputs = {
    ModalityType.TEXT: data.load_and_transform_text(text_list, device),
    ModalityType.VISION: data.load_and_transform_vision_data(image_paths, device),
    ModalityType.AUDIO: data.load_and_transform_audio_data(audio_paths, device),
}

with torch.no_grad():
    embeddings = model(inputs)

print(
    "Vision x Text: ",
    torch.softmax(embeddings[ModalityType.VISION] @ embeddings[ModalityType.TEXT].T, dim=-1),
)
print(
    "Audio x Text: ",
    torch.softmax(embeddings[ModalityType.AUDIO] @ embeddings[ModalityType.TEXT].T, dim=-1),
)
print(
    "Vision x Audio: ",
    torch.softmax(embeddings[ModalityType.VISION] @ embeddings[ModalityType.AUDIO].T, dim=-1),
)

# Expected output:
#
# Vision x Text:
# tensor([[9.9761e-01, 2.3694e-03, 1.8612e-05],
#         [3.3836e-05, 9.9994e-01, 2.4118e-05],
#         [4.7997e-05, 1.3496e-02, 9.8646e-01]])
#
# Audio x Text:
# tensor([[1., 0., 0.],
#         [0., 1., 0.],
#         [0., 0., 1.]])
#
# Vision x Audio:
# tensor([[0.8070, 0.1088, 0.0842],
#         [0.1036, 0.7884, 0.1079],
#         [0.0018, 0.0022, 0.9960]])


直接執行,你應該會得到跟官方範例程式碼相近甚至是完全一樣的答案。實際上當我們應用時,我們自然是能夠調整我們的文本、圖像等等的輸入來得到 embeddings。

有趣的是,若你仔細看,會發現對應的主題相似度的分數非常高,顯示出 ImageBind 的強大性能。當然,我並不是只有跑官方範例就認定這個模型很不錯;我甚至拿了一張我家寶貝咪咪的照片,並同時轉換了 dog、cat、dragon 的向量,並比較相似度。

最後,cat 大概佔了 0.98 分,dog 跟 dragon 分了剩下的 0.02,而 dog 又比 dragon 多一些相似度。


結語

當然,Meta AI 的主頁上有提到,這個模型不能用於商用、並且也是個還不成熟的模型,有時候難免會有犯錯,希望開源社群能夠在使用時記得這一點。

不過這個模型真的能催生出許多有趣的想像題目,比方說最近同事拿給我看了 PandaGPT 的架構,是透過一層 Linear 來轉換 ImageBind embedding 資訊、同時用 LoRA 微調語言模型的方式,來讓本來能夠與我們聊天的 chatbot model 擁有其他模態的能力。

這個應用真的超好玩的!而且仔細想想,或許也不只語言模型能夠這樣調整,其他種類的模型應該也可以啊?

所以說,像這樣有趣的應用一定還有很多!


References


Read More

Leave a Reply