中文CLIP模型多模態實戰——零樣本圖像分類

如今深度學習領域有一個比較熱門的領域叫做:多模態。多模態這個詞整得比較玄學,但是其實主要思想就是將文本,圖像,語音等不同類型的數據,放到同一個特征空間去表示,這樣的好處就是可以將不同類型數據打通,在一個任務上利用到更多更全面的數據,來提升業務指標的效果。比如對搜索來說就可以通過多模態實現以文搜圖,最火的stable diffusion model 文本生成圖像也是多模態的一個場景。今天筆者就介紹一下目前比較火的一個多模態模型clip。
通過無監督對比學習的預訓練方式將文本數據和圖片數據表示到同一個特征空間,從而實現zero-shot 的圖像分類。

CLIP 模型

CLIP(Contrastive Language–Image Pre-training )是由OpenAI開源的基于對比學習的大規模圖文預訓練模型,其整個架構如下圖(1)所示:

  • 一個文本編碼器,文本編碼器可以是transformer。
  • 一個圖像編碼器,圖像編碼器可以是resnet50或vision transformer(ViT)等
  • 通過無監督的對比學習預訓練將文本和圖像聯系起來

下圖(2) (3)則是利用預訓練好的模型進行零樣本(zero shot)的文本分類

  • 將所有labels的文本通過 文本編碼器進行編碼
  • 將要預測的圖像通過 圖像編碼器進行編碼
  • 在計算 圖像編碼 與 所有 labels 文本編碼的 內積,取內積最大的那個作為預測label。
image.png

其中特別值得注意的一點是,clip 預訓練的方式采用的在batch 內負采樣的方式進行的對比學習,如下圖所示:一個batch內,一個文本編碼,只有與它對應的圖像是正樣本,其他的圖像都是負樣本。目標就是優化這個矩陣,希望對角線的值越大越好,矩陣其他地方的值越小越好。


image.png

實戰部分

模型下載

筆者去huggface上搜索了一下clip,看是否有中文的clip模型,還真找到了一個
IDEA-CCNL的太乙多模態模型。它其實就是將openAI的圖像編碼器至今拿過來用,采用Roberta作為中文文本編碼器,在Clip預訓練的數據的漢化版上進行了進一步的預訓練。其中太乙102M的文本編碼器 對應的是openAI的 VIT-patch32的圖像編碼器。筆者將下方兩個模型下載到本地。


image.png

項目目錄結果如下圖,其中openai32 下面就是openai放出的圖像編碼器,
clipChineseText 就是IDEA-CCNL的太乙文本模型編碼器。


image.png

具體代碼如下圖,先加載太乙文本編碼器,在加載openai的圖像編碼器。

from PIL import Image
import requests
# import clip
import torch
from transformers import BertForSequenceClassification, BertConfig, BertTokenizer
from transformers import CLIPProcessor, CLIPModel
import numpy as np

labels = ["貓", "狗",'豬', '虎']  # 這里是輸入文本的,可以隨意替換。
# 加載Taiyi 中文 text encoder
text_tokenizer = BertTokenizer.from_pretrained("./clip")
text_encoder = BertForSequenceClassification.from_pretrained("./clip").eval()
text = text_tokenizer(labels, return_tensors='pt', padding=True)['input_ids']


# 加載CLIP的image encoder
clip_model = CLIPModel.from_pretrained("openai32/")  
processor = CLIPProcessor.from_pretrained("openai32/")

加載完畢后,就可以進行無監督的圖像分類預測了。過程和上方介紹的clip無監督文本分類的步驟一摸一樣,先將labels = ["貓", "狗",'豬', '虎'] 用文本編碼器進行編碼,再將圖片進行編碼,計算和目標圖像編碼內積最大的那個作為預測label。

def get_label(url):
    image = processor(images=Image.open(url), return_tensors="pt")
    with torch.no_grad():
        image_features = clip_model.get_image_features(**image)
        text_features = text_encoder(text).logits
        # 歸一化
        image_features = image_features / image_features.norm(dim=1, keepdim=True)
        text_features = text_features / text_features.norm(dim=1, keepdim=True)
        # 計算余弦相似度 logit_scale是尺度系數
        logit_scale = clip_model.logit_scale.exp()

        logits_per_image = logit_scale * image_features @ text_features.t()
        probs = logits_per_image.softmax(dim=-1).cpu().numpy()
        print(url+"的label是"+labels[np.argmax(probs)])


url = "./pig.jpg"  
get_label(url)
url = "./tiger.jpg"  
get_label(url)

在百度上下載了一種豬,一張虎的圖,進行測試。


image.png
image.png

完全正確,零樣本圖像分類就這樣完成了,clip的威力確實很強大。


image.png

結語

clip 不僅可以完成零樣本圖像分類,還可以完成以文搜圖等,其文本特征和圖像特征也可用于推薦的召回和排序階段??傊嗄B是一種趨勢,不同數據的融合勢必比單獨使用要強一點。

https://aistudio.baidu.com/aistudio/projectdetail/4458949
https://github.com/IDEA-CCNL/Fengshenbang-LM

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容