图像的主题模型-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
主题建模是允许用户在大量数据中找到主题的技术集合。当尝试对这些文档的内容建模和执行EDA时,这是有利的。
不久前,我们引入了一种称为BERTopic的主题建模技术,它使用BERT嵌入和基于类的TFIDF来创建集群,从而可以轻松地解释主题。
然而,过了一段时间,我开始考虑它在其他领域的应用,比如计算机视觉。如果我们可以将主题建模应用于图像,会有多酷?
花了一段时间,但经过一些实验,我想出了一个解决方案,概念!
Concept是一个在图像和文本上引入主题建模概念的包。然而,由于主题通常指的是书面或口头词语,它不能完全概括图像的含义。相反,我们将这些分组的图像和文本称为概念。
因此,Concept包执行概念建模,这是一种统计模型,用于发现图像和相应文档集合中的抽象概念。
概念建模是主题建模对图像和文本的概括
例如,通过概念建模检索以下概念:
正如你可能已经注意到的,我们可以通过文本和视觉表达来解释这些概念。然而,通过组合这些表示,可以发现概念建模的真正力量。
概念建模允许概念的多模态表示
一张图片告诉你1000多个单词。但是如果我们在图片中添加文字呢?这两种沟通方式的协同作用可以丰富对概念的解释和理解。
在本文中,我们将介绍使用Concept创建自己的概念模型的步骤。您可以在上面的链接中关注Google Colab笔记本。
步骤1:安装概念
我们可以通过PyPI轻松安装
概念:pip安装概念
步骤2:准备图像
要执行概念建模,我们需要对大量图像进行聚类。我们将从Unflash下载25000张图片
导入操作系统
导入全局变量
导入zip文件
从tqdm导入tqdm
从句子_变压器导入实用程序
#从Unsplash下载25k张图片
img_文件夹=”照片/”
如果不存在os.path.exis(img_folder)或len(os.listdir(img_ folder))==0:
os.makedirs(img文件夹,存在_ok=True)
照片_文件名=”unsplash-25k-photos.zip”
如果不存在os.path.exis(照片_文件名):#如果不存在则下载数据集
util.http_get(‘http://你好ert.net/datasets/’+photo _filename,photo _ filename)
#提取所有图像
将zipfile.zipfile(照片_文件名,’r’)作为zf:
对于tqdm(zf.infolist(),desc=”提取”)中的成员:
zf.extract(成员,img文件夹)
#加载图像路径
img_name=list(glob.glob(‘photos.jpg’))
准备好图像后,我们可以在Concept上使用它们。但是,如果没有文本,则不会创建任何文本表示。所以下一步是准备我们的课文。
第三步:准备课文
Concept的有趣之处在于,任何文本都可以输入到模型中。理想情况下,我们希望为它提供与手边图像最相关的文本。
然而,情况并非总是如此。因此,出于演示目的,我们将在英语词典中为该模型提供一系列名词:
随机导入
导入nltk
nltk.download(“wordnet”)
从nltk.corpus将wordnet导入为wn
所有的_个名词=[单词在wn中的合成集。所有的_合成集(‘n’)在合成集中的单词。引理_名称()
如果”_”不在单词中]
Selected_nouns=随机。sample(all_nouns,50_000)在上面的例子中,出于两个原因,我们使用了50000个随机名词。
首先,不需要在英语词典中获得所有的名词,因为我们可以假设50000个名词应该代表足够的实体。
其次,这将加快计算速度,因为我们需要从较低的单词中提取嵌入的单词。
事实上,如果您知道文本数据与图像相关,请使用这些而不是名词!
步骤4:培训模型
下一步是训练模型!一如既往,我们一直保持着这种相对简单的态度。只需将每个图像的路径和我们选择的名词输入到模型中:
来自概念进口公司
conceptions=conception_model.fit_transform(img_name,docs=selected_名词)
概念变量包含每个图像的预测概念。
Concept的基本模型是Openai的CLIP,这是一个由大量图像和文本对训练的神经网络。这意味着模型在生成嵌入时使用GPU是有益的。
最后,运行concept_model。频率查看包含概念和频率的数据帧。
注:使用Concept(embedding_model=”clip-ViT-B-32-multipular-v1″)选择支持50多种语言的模型!
预训练图像嵌入
对于那些想尝试此演示但无法访问GPU的用户,我们可以从句子Transformers站点加载预先训练的图像嵌入:
进口泡菜
从句子_变压器导入实用程序
#加载预先训练的图像嵌入
emb_filename=’unsplash-25k-photos-embeddings.pkl’
如果不存在os.path.exis(emb_filename):#如果不存在则下载数据集
util.http_get(‘http://你好ert.net/datasets/’+emb _filename,emb _ filename)
打开(emb_filename,’rb’)作为fIn:
img_name,image_embeddings=pickle.load(fIn)
img_names=〔f”photos/{path}”用于img__name中的路径〕
然后,我们将预先训练的插入件添加到模型中并训练它们:
从概念导入ConceptModel
#使用预训练图像嵌入的列车概念
概念_模型=概念模型()
conceptions=conception_model.fit_transform(img_name,image_embeddings=image__embedding,docs=selected_名词)
第5步:将概念可视化
如前所述,生成的概念是多模态的,即视觉和文本。我们需要找到一种方法来概括地表达这两种情况。
为此,我们选择了一些最能代表每个概念的图像,然后找到最能代表这些图像的名词。
实际上,创建可视化效果非常简单:
图=concept_model.visualize_concept()
我们数据集中的许多图像与自然有关。然而,如果我们进一步观察,我们可以看到更多有趣的概念:
以上结果提供了一个很好的例子,说明如何在概念建模中直观地思考概念。我们不仅可以通过一组图像看到视觉表示,而且文本表示有助于我们进一步理解这些概念的内容。
第6步:搜索概念
我们可以通过嵌入搜索词并找到最能代表它们的聚类来快速搜索特定概念。
例如,让我们搜索单词”beach”,看看能找到什么。为此,我们只需运行以下命令:
>>>搜索结果=概念模型。找到概念(“海滩”)
>>>搜索结果
[(100, 0.277577825349102),
(53, 0.27431058773894657),
(95, 0.25973751319723837),
(77, 0.2560122597417548),
(97, 0.25361988261846297)]
每个元组包含两个值。第一个是概念聚类,第二个是与搜索词的相似姓。返回前5个类似主题。
现在让我们将这些概念可视化,看看搜索功能是如何工作的:
fig=concept_model.visualize_concept(concept=〔concept for concept,_in search_results〕)
正如我们所看到的,结果的概念与我们的搜索词非常相似!模型的多模态特姓使我们能够轻松地搜索概念和图像。
步骤7:算法概述
对于那些对概念基础感兴趣的人,下面是创建结果概念所用方法的总结:
1.嵌入图像和文档
首先,我们使用OpenAI的CLIP模型将图像和文档嵌入到相同的向量空间中。这使我们能够比较图像和文本。文档可以是单词.短语.句子等。
2.概念集群
我们使用UMAP+HDBSCAN对图像嵌入进行聚类,以创建在视觉和语义上彼此相似的聚类。我们称簇为概念,因为它们表示多模态特姓。
3.概念表达
为了直观地表示概念簇,我们将每个概念的最相关图像称为示例。根据概念集群的大小,每个集群的示例数可能超过数百,因此需要一个过滤器。
我们使用MMR来选择与概念嵌入最相关但仍然彼此充分不同的图像。通过这种方式,我们可以尽可能多地展示这个概念。然后将所选图像合并为一个图像以创建视觉表示。
4.多模式
最后,我们比较了文本嵌入和概念聚类嵌入。利用余弦相似姓,我们选择最相关的嵌入。这将多模态引入概念表示。
注:您也可以选择c-TF-IDF并使用concept_model=ConceptModel(ctfidf=True)提取文本表示
600学习网 » 图像的主题模型-600学习网