色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專(zhuān)欄

          EEPW首頁(yè) > 博客 > 獨(dú)家 | 圖片主題建模?為什么不呢?!

          獨(dú)家 | 圖片主題建模?為什么不呢?!

          發(fā)布人:數(shù)據(jù)派THU 時(shí)間:2021-12-18 來(lái)源:工程師 發(fā)布文章

          作者: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)用于圖片主題建模那將是一件多么酷的事情呀!

          1.png

          圖片主題建模,你需要做的一切。圖片來(lái)自作者

          這件事確實(shí)花了一些時(shí)間,但是若干實(shí)驗(yàn)之后,我想到了解決方法:Concept!

          Concept是一個(gè)同時(shí)介紹圖片和文本主題建模概念的包。然而,由于主題通常指的是文本或者口語(yǔ),它通常不能很好地涵蓋圖片組的含義。我們這里將圖片組和文字都定義為概念。

          2.png

          概念的logo。圖片來(lái)自作者

          因此,Concept包可以做Concept建模,這種建模是一種統(tǒng)計(jì)模型,用于在圖片集合以及相應(yīng)文件當(dāng)中發(fā)現(xiàn)抽象的概念。

          概念模型是圖片和文本主題建模的泛化

          為了讓你更好地了解,以下是從概念建模當(dāng)中抽取的概念:

          3.png

          由概念建模生成的多模態(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

          4.png

          九個(gè)最常用的概念可視化。圖片來(lái)自作者

          我們數(shù)據(jù)集當(dāng)中的大部分圖片斗魚(yú)大自然有關(guān)。然而,如果我們?cè)偕钊肟匆豢锤嘤腥さ母拍睿?/p>

          5.png

          更常見(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

          6.png

          檢索術(shù)語(yǔ)“beach”。圖片來(lái)自作者

          我們可以看到,結(jié)果概念與我們的檢索術(shù)語(yǔ)非常相似!多模態(tài)的模型本質(zhì)使得我們可以輕易地檢索到概念和圖片。

          第七步:算法概覽

          對(duì)于那些對(duì)概念機(jī)制感興趣的朋友,以下為創(chuàng)造結(jié)果概念的方法抽象概覽:

          7.png

          概念算法概覽。圖片來(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)文章:三維掃描儀原理


          關(guān)鍵詞: AI

          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉