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

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?