訂閱
糾錯(cuò)
加入自媒體

圖像的主題模型

主題建模是一個(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)題 : 圖像的主題模型

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)