中文CLIP模型多模態(tài)實(shí)戰(zhàn)——零樣本圖像分類

如今深度學(xué)習(xí)領(lǐng)域有一個(gè)比較熱門的領(lǐng)域叫做:多模態(tài)沧奴。多模態(tài)這個(gè)詞整得比較玄學(xué)粤剧,但是其實(shí)主要思想就是將文本歇竟,圖像,語音等不同類型的數(shù)據(jù)抵恋,放到同一個(gè)特征空間去表示焕议,這樣的好處就是可以將不同類型數(shù)據(jù)打通,在一個(gè)任務(wù)上利用到更多更全面的數(shù)據(jù)弧关,來提升業(yè)務(wù)指標(biāo)的效果盅安。比如對(duì)搜索來說就可以通過多模態(tài)實(shí)現(xiàn)以文搜圖唤锉,最火的stable diffusion model 文本生成圖像也是多模態(tài)的一個(gè)場(chǎng)景。今天筆者就介紹一下目前比較火的一個(gè)多模態(tài)模型clip别瞭。
通過無監(jiān)督對(duì)比學(xué)習(xí)的預(yù)訓(xùn)練方式將文本數(shù)據(jù)和圖片數(shù)據(jù)表示到同一個(gè)特征空間腌紧,從而實(shí)現(xiàn)zero-shot 的圖像分類。

CLIP 模型

CLIP(Contrastive Language–Image Pre-training )是由OpenAI開源的基于對(duì)比學(xué)習(xí)的大規(guī)模圖文預(yù)訓(xùn)練模型畜隶,其整個(gè)架構(gòu)如下圖(1)所示:

  • 一個(gè)文本編碼器壁肋,文本編碼器可以是transformer。
  • 一個(gè)圖像編碼器籽慢,圖像編碼器可以是resnet50或vision transformer(ViT)等
  • 通過無監(jiān)督的對(duì)比學(xué)習(xí)預(yù)訓(xùn)練將文本和圖像聯(lián)系起來

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

  • 將所有l(wèi)abels的文本通過 文本編碼器進(jìn)行編碼
  • 將要預(yù)測(cè)的圖像通過 圖像編碼器進(jìn)行編碼
  • 在計(jì)算 圖像編碼 與 所有 labels 文本編碼的 內(nèi)積浸遗,取內(nèi)積最大的那個(gè)作為預(yù)測(cè)label。
image.png

其中特別值得注意的一點(diǎn)是箱亿,clip 預(yù)訓(xùn)練的方式采用的在batch 內(nèi)負(fù)采樣的方式進(jìn)行的對(duì)比學(xué)習(xí)跛锌,如下圖所示:一個(gè)batch內(nèi),一個(gè)文本編碼届惋,只有與它對(duì)應(yīng)的圖像是正樣本髓帽,其他的圖像都是負(fù)樣本。目標(biāo)就是優(yōu)化這個(gè)矩陣脑豹,希望對(duì)角線的值越大越好郑藏,矩陣其他地方的值越小越好。


image.png

實(shí)戰(zhàn)部分

模型下載

筆者去huggface上搜索了一下clip瘩欺,看是否有中文的clip模型必盖,還真找到了一個(gè)
IDEA-CCNL的太乙多模態(tài)模型。它其實(shí)就是將openAI的圖像編碼器至今拿過來用俱饿,采用Roberta作為中文文本編碼器歌粥,在Clip預(yù)訓(xùn)練的數(shù)據(jù)的漢化版上進(jìn)行了進(jìn)一步的預(yù)訓(xùn)練。其中太乙102M的文本編碼器 對(duì)應(yīng)的是openAI的 VIT-patch32的圖像編碼器拍埠。筆者將下方兩個(gè)模型下載到本地失驶。


image.png

項(xiàng)目目錄結(jié)果如下圖,其中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/")

加載完畢后定躏,就可以進(jìn)行無監(jiān)督的圖像分類預(yù)測(cè)了。過程和上方介紹的clip無監(jiān)督文本分類的步驟一摸一樣,先將labels = ["貓", "狗",'豬', '虎'] 用文本編碼器進(jìn)行編碼痊远,再將圖片進(jìn)行編碼垮抗,計(jì)算和目標(biāo)圖像編碼內(nèi)積最大的那個(gè)作為預(yù)測(cè)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)
        # 計(jì)算余弦相似度 logit_scale是尺度系數(shù)
        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)

在百度上下載了一種豬碧聪,一張虎的圖冒版,進(jìn)行測(cè)試。


image.png
image.png

完全正確逞姿,零樣本圖像分類就這樣完成了辞嗡,clip的威力確實(shí)很強(qiáng)大。


image.png

結(jié)語

clip 不僅可以完成零樣本圖像分類滞造,還可以完成以文搜圖等续室,其文本特征和圖像特征也可用于推薦的召回和排序階段≮搜總之多模態(tài)是一種趨勢(shì)挺狰,不同數(shù)據(jù)的融合勢(shì)必比單獨(dú)使用要強(qiáng)一點(diǎn)。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末买窟,一起剝皮案震驚了整個(gè)濱河市丰泊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌始绍,老刑警劉巖瞳购,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疆虚,居然都是意外死亡苛败,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門径簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘀韧,你說我怎么就攤上這事篇亭。” “怎么了锄贷?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵译蒂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谊却,道長(zhǎng)柔昼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任炎辨,我火速辦了婚禮捕透,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己乙嘀,他們只是感情好末购,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虎谢,像睡著了一般盟榴。 火紅的嫁衣襯著肌膚如雪蹦魔。 梳的紋絲不亂的頭發(fā)上忆首,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天锅尘,我揣著相機(jī)與錄音蚊俺,去河邊找鬼船响。 笑死雁仲,一個(gè)胖子當(dāng)著我的面吹牛昔字,可吹牛的內(nèi)容都是我干的高每。 我是一名探鬼主播银觅,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼礼饱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了究驴?” 一聲冷哼從身側(cè)響起镊绪,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洒忧,沒想到半個(gè)月后蝴韭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熙侍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年榄鉴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛉抓。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庆尘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巷送,到底是詐尸還是另有隱情驶忌,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布笑跛,位于F島的核電站付魔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏飞蹂。R本人自食惡果不足惜几苍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陈哑。 院中可真熱鬧妻坝,春花似錦伸眶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纠屋,卻和暖如春涂臣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背售担。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工赁遗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人族铆。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓岩四,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哥攘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剖煌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容