圖像的主題模型
主題建模是一個(gè)技術(shù)的集合,允許用戶在大量數(shù)據(jù)中找到主題。當(dāng)試圖對(duì)這些文檔的內(nèi)容建模和執(zhí)行EDA時(shí),它將非常有利。
不久前,我們介紹了一種名為BERTopic的主題建模技術(shù),它利用了BERT嵌入和基于類的TF-IDF創(chuàng)建簇,允許輕松解釋主題。
不過,過了一會(huì)兒,開始考慮它在其他領(lǐng)域的應(yīng)用,例如計(jì)算機(jī)視覺。如果我們能在圖像上應(yīng)用主題建模,那會(huì)有多酷?
花了一段時(shí)間,但經(jīng)過一些實(shí)驗(yàn),想出了解決方案,Concept!
Concept是一個(gè)包,它同時(shí)在圖像和文本上引入主題建模的概念。然而,由于主題通常指的是書面或口頭的文字,它并不能完全封裝圖像的含義。相反,我們將這些分組的圖像和文本稱為概念。
因此,Concept包執(zhí)行概念建模,這是一種統(tǒng)計(jì)模型,用于發(fā)現(xiàn)圖像和相應(yīng)文檔集合中出現(xiàn)的抽象概念。
概念建模是主題建模對(duì)圖像和文本的概括
例如,下面的概念通過概念建模檢索:
正如你可能注意到的,我們可以通過它們的文本表示和視覺表示來解釋這些概念。然而,通過組合這些表示,可以找到概念建模的真正力量。
概念建模允許概念的多模態(tài)表示
一幅圖片告訴你一千多個(gè)字。但是如果我們?cè)趫D像中添加單詞怎么辦?這兩種溝通方式的協(xié)同作用,可以豐富對(duì)Concept的解讀和理解。
在本文中,將介紹使用Concept創(chuàng)建自己的概念模型的步驟。你可以在上面的鏈接中跟隨GoogleColab筆記本。
步驟1:安裝Concept
我們可以通過PyPI輕松安裝
Concept:pip install concept
步驟2:準(zhǔn)備圖像
要執(zhí)行概念建模,我們需要大量的圖像進(jìn)行聚類。我們將從Unflash下載25000張圖片
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'))
在準(zhǔn)備好圖像之后,我們已經(jīng)可以在Concept上使用它們了。但是,沒有文本的話就不會(huì)創(chuàng)建文本表示。所以下一步是準(zhǔn)備我們的文本。
步驟3:準(zhǔn)備文本
Concept的有趣方面是,任何文本都可以被輸入模型。理想情況下,我們希望向它提供與手頭圖像最相關(guān)的文本。
然而,情況可能并非總是如此。因此,為了演示目的,我們將在英語詞典中為模型提供一系列名詞:
import random
import nltk
nltk.download("wordnet")
from nltk.corpus import wordnet as wn
all_nouns = [word for synset in wn.a(chǎn)ll_synsets('n') for word in synset.lemma_names()
if "_" not in word]
selected_nouns = random.sample(all_nouns, 50_000)
在上面的例子中,我們使用了50000個(gè)隨機(jī)名詞,原因有兩個(gè)。
首先,不需要在英語詞典中獲取所有名詞,因?yàn)槲覀兛梢约僭O(shè)50000個(gè)名詞應(yīng)該代表足夠的實(shí)體。
其次,這會(huì)加快計(jì)算速度,因?yàn)槲覀冃枰獜妮^低的單詞中提取嵌入。
實(shí)際上,如果你知道文本數(shù)據(jù)與圖像相關(guān),那么就用這些代替名詞!
步驟4:訓(xùn)練模型
下一步是訓(xùn)練模型!一如既往,我們保持了這一相對(duì)簡(jiǎn)單的態(tài)度。只需將每個(gè)圖像的路徑和我們選擇的名詞輸入模型:
from concept import ConceptModel
concept_model = ConceptModel()
concepts = concept_model.fit_transform(img_names, docs=selected_nouns)
concepts變量包含每個(gè)圖像的預(yù)測(cè)的概念。
Concept的基本模型是Openai的CLIP,它是一個(gè)經(jīng)過大量圖像和文本對(duì)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)。這意味著模型在生成嵌入時(shí)使用GPU是有益的。
最后,運(yùn)行concept_model.frequency查看包含Concept和頻率的數(shù)據(jù)幀。
注意:使用Concept(embedding_model="clip-ViT-B-32-multilingual-v1")選擇支持50+語言的模型!
預(yù)訓(xùn)練的圖像嵌入
對(duì)于那些想要嘗試此演示但無法訪問GPU的用戶,我們可以從sentence-Transformers站點(diǎn)加載經(jīng)過預(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]
然后,我們將預(yù)訓(xùn)練的嵌入件添加到模型中,并對(duì)其進(jì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)
步驟5:可視化Concept
如前所述,由此產(chǎn)生的Concept是多模態(tài)的,即視覺和文本。我們需要在一個(gè)概覽中找到一種表示這兩種情況的方法。
為了做到這一點(diǎn),我們選取了一些最能代表每個(gè)Concept的圖像,然后找到最能代表這些圖像的名詞。
在實(shí)踐中,創(chuàng)建可視化非常簡(jiǎn)單:
fig = concept_model.visualize_concepts()
我們數(shù)據(jù)集中的許多圖片都與自然有關(guān)。然而,如果我們看得更遠(yuǎn)一點(diǎn),我們可以看到更有趣的概念:
上面的結(jié)果為如何在概念建模中直觀地思考概念提供了一個(gè)很好的例子。我們不僅可以通過一組圖像看到視覺表現(xiàn),而且文本表現(xiàn)有助于我們進(jìn)一步理解這些概念中的內(nèi)容。
第6步:搜索概念
我們可以通過嵌入搜索詞并找到最能代表它們的簇嵌入來快速搜索特定概念。
例如,讓我們搜索“beach”一詞,看看能找到什么。為此,我們只需運(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)]
每個(gè)元組包含兩個(gè)值,第一個(gè)是概念簇,第二個(gè)是與搜索詞的相似性。返回前5個(gè)類似主題。
現(xiàn)在,讓我們可視化這些概念,看看搜索功能的工作情況:
fig = concept_model.visualize_concepts(concepts=[concept for concept, _ in search_results])
正如我們所看到的,結(jié)果概念與我們的搜索詞非常相似!模型的這種多模態(tài)特性使我們能夠輕松地搜索概念和圖像。
第7步:算法概述
對(duì)于那些對(duì)概念基礎(chǔ)感興趣的人來說,下面是用于創(chuàng)建結(jié)果Concept的方法的摘要:
1.嵌入圖像和文檔
我們首先使用OpenAI的CLIP模型將圖像和文檔嵌入到同一個(gè)向量空間中。這使我們能夠在圖像和文本之間進(jìn)行比較。文檔可以是單詞、短語、句子等。
2.概念簇
我們使用UMAP+HDBSCAN對(duì)圖像嵌入進(jìn)行聚類,以創(chuàng)建視覺和語義上彼此相似的簇。我們將簇稱為Concept,因?yàn)樗鼈兇砹硕嗄B(tài)性質(zhì)。
3.概念表達(dá)
為了直觀地表示概念簇,我們將每個(gè)概念的最相關(guān)圖像稱為范例。根據(jù)概念簇的大小,每個(gè)簇的示例數(shù)可能超過數(shù)百個(gè),因此需要一個(gè)過濾器。
我們使用MMR來選擇與Concept嵌入最相關(guān)但彼此仍然足夠不同的圖像。這樣,我們就可以盡可能多地展示這個(gè)概念。然后將選定的圖像合并為一個(gè)圖像,以創(chuàng)建一個(gè)視覺表示。
4.多模態(tài)
最后,我們將文本嵌入與創(chuàng)建的概念簇嵌入進(jìn)行比較。利用余弦相似性,我們選擇彼此最相關(guān)的嵌入。這將多模態(tài)引入到概念表示中。
注意:還可以選擇使用c-TF-IDF,使用concept_model = ConceptModel(ctfidf=True)提取文本表示
原文標(biāo)題 : 圖像的主題模型

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語權(quán)
- 3 深度報(bào)告|中國(guó)AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 6 一文看懂視覺語言動(dòng)作模型(VLA)及其應(yīng)用
- 7 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 8 百億AI芯片訂單,瘋狂傾銷中東?
- 9 Robotaxi新消息密集釋放,量產(chǎn)元年誰在領(lǐng)跑?
- 10 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過于簡(jiǎn)單