獨(dú)家 | 圖片主題建模?為什么不呢?!
作者:Maarten Grootendorst
翻譯:陳超
校對(duì):趙茹萱
主題建模是一種允許用戶(hù)在無(wú)監(jiān)督情況下,在海量數(shù)據(jù)當(dāng)中尋找主題的一系列技術(shù)合集、在這些文件內(nèi)容當(dāng)中嘗試建模并跑EDA模型的時(shí)候是非常冒險(xiǎn)的一種行為。
之前我發(fā)明了一個(gè)主題建模技術(shù)叫做BERTopic,這種技術(shù)可以利用BERT和基于類(lèi)的TF-IDF來(lái)創(chuàng)建密集的類(lèi)用于易解釋主題。
一段時(shí)間之后,我開(kāi)始思考它在其他領(lǐng)域的可解釋性,比如計(jì)算機(jī)視覺(jué)。如果我們可以將其應(yīng)用于圖片主題建模那將是一件多么酷的事情呀!
圖片主題建模,你需要做的一切。圖片來(lái)自作者
這件事確實(shí)花了一些時(shí)間,但是若干實(shí)驗(yàn)之后,我想到了解決方法:Concept!
Concept是一個(gè)同時(shí)介紹圖片和文本主題建模概念的包。然而,由于主題通常指的是文本或者口語(yǔ),它通常不能很好地涵蓋圖片組的含義。我們這里將圖片組和文字都定義為概念。
概念的logo。圖片來(lái)自作者
因此,Concept包可以做Concept建模,這種建模是一種統(tǒng)計(jì)模型,用于在圖片集合以及相應(yīng)文件當(dāng)中發(fā)現(xiàn)抽象的概念。
概念模型是圖片和文本主題建模的泛化
為了讓你更好地了解,以下是從概念建模當(dāng)中抽取的概念:
由概念建模生成的多模態(tài)概念。圖片來(lái)自作者
如同你注意到的,我們可以通過(guò)他們的文本表征和視覺(jué)表征來(lái)解釋這些概念。真正的概念建??梢酝ㄟ^(guò)結(jié)合這些表征來(lái)提取。
概念建模允許一種概念的多模態(tài)表征
一圖勝千言。但是如果我們給圖片增加文字呢??jī)深?lèi)交流方法的協(xié)同作用(synergy)可以豐富概念的解釋和理解。
概念建模指南
Concept是一種利用CLIP和基于BERTopic技術(shù)來(lái)對(duì)圖片和文本進(jìn)行概念建模的工具。
(https://colab.research.google.com/drive/1XHwQPT2itZXu1HayvGoj60-xAXxg9mqe?usp=sharing)
在本文當(dāng)中,我將帶大家了解如何用Concept包構(gòu)建你自己的概念模型。你可以跟隨上方的Google Colab notebook鏈接一起學(xué)習(xí)。
第一步:安裝Concept包
我們可以通過(guò)PyPI輕松安裝Concept:
pip install concept
第二步:準(zhǔn)備好圖片
為了進(jìn)行概念建模,我們需要一些圖片來(lái)聚類(lèi)。我們將在UNsplash上下載25,000張圖片,這些圖片已經(jīng)被Sentence-Transformers包整理好了。
import os import glob import zipfile from tqdm import tqdm from sentence_transformers import util # Download 25k images from Unsplash img_folder = 'photos/' if not os.path.exists(img_folder) or len(os.listdir(img_folder)) == 0: os.makedirs(img_folder, exist_ok=True) photo_filename = 'unsplash-25k-photos.zip' if not os.path.exists(photo_filename): #Download dataset if does not exist util.http_get('http://sbert.net/datasets/'+photo_filename, photo_filename) #Extract all images with zipfile.ZipFile(photo_filename, 'r') as zf: for member in tqdm(zf.infolist(), desc='Extracting'): zf.extract(member, img_folder) # Load image paths img_names = list(glob.glob('photos/*.jpg')) view rawload_images.py hosted with ? by GitHub
準(zhǔn)備好圖片之后,我們就可以在沒(méi)有任何文本的情況下在Concept包中使用它。然而,這并不會(huì)構(gòu)建任何文本化的表征。所以下一步是準(zhǔn)備我們的文本。
第三步:準(zhǔn)備好文本
Concept有趣的地方在于,任何文本都可以喂給這個(gè)模型。理想狀況下,我們想把跟手邊圖片最相關(guān)的文本喂給模型。我們通常會(huì)對(duì)我們圖片中的細(xì)節(jié)產(chǎn)生一些理解。
然而,事實(shí)卻并不總是如此順利。所以為了闡明目的,我們需要給模型喂英文詞典當(dāng)中的一堆詞:
import random import nltk nltk.download("wordnet") from nltk.corpus import wordnet as wn all_nouns = [word for synset in wn.all_synsets('n') for word in synset.lemma_names() if "_" not in word] selected_nouns = random.sample(all_nouns, 50_000) view rawprepare_text.py hosted with ? by GitHub
在上述文本當(dāng)中,我們以?xún)蓚€(gè)原因納入了50,000個(gè)隨機(jī)名詞。第一,不需要將英文詞典上出現(xiàn)的所有名詞都納入進(jìn)來(lái),因?yàn)槲覀兛梢约俣?0,000詞應(yīng)該表征了充分的實(shí)體。第二,這可以加速計(jì)算過(guò)程,因?yàn)槲覀冃枰獜母俚膯卧~當(dāng)中提取嵌入。
從實(shí)踐角度來(lái)看,如果你有已知與圖片相關(guān)的文本數(shù)據(jù),用他們替代名詞即可。
第四步:訓(xùn)練模型
下一步就是訓(xùn)練模型啦!像通常一樣,我們相對(duì)直接一點(diǎn)兒。只需將每個(gè)圖片的路徑和我們選擇的名詞提供給模型:
from concept import ConceptModel concept_model = ConceptModel() concepts = concept_model.fit_transform(img_names, docs=selected_nouns) view rawtrain_concept.py hosted with ? by GitHub
Concept變量包括了每幅圖的預(yù)測(cè)概念。
劃線的概念模型是Openai的CLIP,這是一個(gè)訓(xùn)練大量圖片和文本對(duì)的神經(jīng)網(wǎng)絡(luò)。這意味著模型在生成嵌入時(shí)受益于使用GPU。
最后,運(yùn)行concept_model.frequency來(lái)看一下包括概念頻率的數(shù)據(jù)框。
注意:使用Concept(embedding_model="clip-ViT-B-32-multilingual-v1")來(lái)選擇一個(gè)支持50+種語(yǔ)言的模型!
預(yù)訓(xùn)練圖片嵌入
對(duì)那些想要嘗試這個(gè)demo但是沒(méi)有GPU使用權(quán)限的人來(lái)說(shuō),我們可以從sentence-Transformers站點(diǎn)來(lái)加載預(yù)訓(xùn)練的圖像嵌入:
import pickle from sentence_transformers import util # Load pre-trained image embeddings emb_filename = 'unsplash-25k-photos-embeddings.pkl' if not os.path.exists(emb_filename): #Download dataset if does not exist util.http_get('http://sbert.net/datasets/'+emb_filename, emb_filename) with open(emb_filename, 'rb') as fIn: img_names, image_embeddings = pickle.load(fIn) img_names = [f"photos/{path}" for path in img_names] view rawpretrained_embeddings.py hosted with ? by GitHub
之后,我們將預(yù)訓(xùn)練的嵌入添加到模型中并訓(xùn)練它:
from concept import ConceptModel # Train Concept using the pre-trained image embeddings concept_model = ConceptModel() concepts = concept_model.fit_transform(img_names, image_embeddings=image_embeddings, docs=selected_nouns) view rawpretrained_modeling.py hosted with ? by GitHub
第五步:概念可視化
現(xiàn)在是有趣的部分,對(duì)概念進(jìn)行可視化!
就像之前提到的,最終的概念是多模態(tài)的,也就是說(shuō)包括了視覺(jué)和文本化雙重本質(zhì)。我們需要找到一種方式來(lái)從單一視角來(lái)表征兩者。
為了做到這一點(diǎn),我們選取了一些最能表征每個(gè)概念的一組圖片,并找到最能表征這些圖片的名詞。
通常,我們會(huì)以如下直觀方式創(chuàng)建可視化:
fig = concept_model.visualize_concepts() view rawvisualize.py hosted with ? by GitHub
九個(gè)最常用的概念可視化。圖片來(lái)自作者
我們數(shù)據(jù)集當(dāng)中的大部分圖片斗魚(yú)大自然有關(guān)。然而,如果我們?cè)偕钊肟匆豢锤嘤腥さ母拍睿?/p>
更常見(jiàn)的概念,標(biāo)記概念多樣性。圖片來(lái)自作者
以上結(jié)果為如何在概念建模中直觀地思考概念提供了一個(gè)漂亮的例子。我們不僅可以通過(guò)圖片集來(lái)看可視化表征,也可以通過(guò)文本表征來(lái)幫助我們更深入地理解我們可以在這些概念當(dāng)中發(fā)現(xiàn)的內(nèi)容。
第六步:檢索概念
我們可以通過(guò)嵌入一個(gè)檢索術(shù)語(yǔ)以及發(fā)現(xiàn)表征類(lèi)的最佳特征來(lái)快速檢索特定概念。舉例來(lái)看,我們檢索沙灘(beach)這個(gè)術(shù)語(yǔ)來(lái)看看我們能找到什么。為了做到這一點(diǎn),我們可以簡(jiǎn)單地運(yùn)行以下代碼:
>>> search_results =concept_model.find_concepts("beach") >>> search_results [(100, 0.277577825349102), (53, 0.27431058773894657), (95, 0.25973751319723837), (77, 0.2560122597417548), (97, 0.25361988261846297)] view rawsearch.py hosted with ? by GitHub
每一個(gè)元組包含兩個(gè)值,第一個(gè)是概念類(lèi),另一個(gè)是檢索術(shù)語(yǔ)相似性。返回前五個(gè)最相似的主題。
現(xiàn)在,讓我們對(duì)概念進(jìn)行可視化來(lái)看看這個(gè)檢索函數(shù)是如何工作的:
fig = concept_model.visualize_concepts(concepts=[concept for concept, _ in search_results])
view rawvisualize_search.py hosted with ? by GitHub
檢索術(shù)語(yǔ)“beach”。圖片來(lái)自作者
我們可以看到,結(jié)果概念與我們的檢索術(shù)語(yǔ)非常相似!多模態(tài)的模型本質(zhì)使得我們可以輕易地檢索到概念和圖片。
第七步:算法概覽
對(duì)于那些對(duì)概念機(jī)制感興趣的朋友,以下為創(chuàng)造結(jié)果概念的方法抽象概覽:
概念算法概覽。圖片來(lái)自作者
1. 嵌入圖片和文件
我們通過(guò)使用OpenAI的CLIP模型將圖片和文件嵌入相同的向量空間開(kāi)始。這允許我們?cè)趫D片和文本面前比較。文件包括文字,短語(yǔ),句子等。一切你覺(jué)得可以表征概念類(lèi)的最佳方式。
2. 概念聚類(lèi)
使用UMAP+HDBSCAN,我們可以聚類(lèi)圖片特征并創(chuàng)建視覺(jué)和語(yǔ)義相似的類(lèi)。我們指的是那些表征多模態(tài)本質(zhì)的概念類(lèi)。
3. 概念表征
為了表征這些概念類(lèi),我們選取與每個(gè)概念最相關(guān)的圖片,叫做范例(exemplar)。依賴(lài)于概念類(lèi)的大小,每個(gè)類(lèi)里范例的數(shù)量可能會(huì)超過(guò)幾百,因此需要一個(gè)過(guò)濾器。
我們使用MMR來(lái)選擇那些與概念特征最相關(guān)但是彼此之間仍然充分不相似的圖片。這樣,我們可以盡可能多地來(lái)展示這個(gè)概念。選中的圖片將合稱(chēng)為單圖來(lái)創(chuàng)建單個(gè)可視化表征。
4. 多模態(tài)
最后,我們提取文本特征并與創(chuàng)建的概念類(lèi)特征進(jìn)行比較。使用余弦相似性,我們選出那些最相關(guān)的特征。將多模態(tài)引入概念表征之中。
注意:使用 c-TF-IDF的 concept_model = ConceptModel(ctfidf=True) 提取文本表征也是一種選擇。
感謝您的閱讀!
如果你想我一樣對(duì)AI,數(shù)據(jù)科學(xué)或者心理學(xué)感興趣,請(qǐng)?jiān)贚inkedIn
(https://www.linkedin.com/in/mgrootendorst/)
上添加我或者關(guān)注我的Twitter(https://twitter.com/MaartenGr)。
你可以在下方找到Concept包,以及它的文件:
概念建模:文本和圖片主題建模(https://github.com/MaartenGr/Concept)
概念文檔(https://maartengr.github.io/Concept/)
原文標(biāo)題:
Topic Modeling on Images? Why Not?!
原文鏈接:
https://towardsdatascience.com/topic-modeling-on-images-why-not-aad331d03246
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
三維掃描儀相關(guān)文章:三維掃描儀原理