但是,如果我见告您,当您考试测验构建更好的模型时,另一种类型的集群可能对您更主要呢?我不是在评论辩论 CPU 或 TPU,或任何其他类型的硬件。
我什至没有评论辩论模型演习过程。
我说的是一种古老的无监督机器学习任务,称为聚类,它将帮助您深入理解数据
毕竟,数据是预测能力流动的源泉。

若何对图像进行聚类_集群_数据 绘影字幕

利用 CLIP 嵌入创建的集群,通过 UMAP 降维在 FiftyOne 运用程序中可视化,并利用 GPT-4V 分配标签。

在本博客中,我们将先容聚类的根本知识,并向您展示如何利用开源机器学习库 Scikit-learn 和 FiftyOne 构建可视化数据!

什么是聚类?

聚类类比的艺术描述。
由 Amanda Venso 利用 DALLE-3 天生的图像。

集群的构建模块

想象一下,地板上散布着大量各种形状和大小的乐高积木。
是时候把乐高积木收起来了,你意识到你没有足够大的箱子来存放所有的乐高积木。
幸运的是,您创造了四个较小的箱子,每个箱子可以容纳大致相同数量的物品。
你可以将任意种类的乐高积木扔进每个垃圾箱,然后就到此为止了。
但是,下次你去探求一件特定的作品时,你会花很多韶光去挖掘它。

相反,您有一个更好的主张:将相似的物品放入同一个垃圾箱中可以为您节省大量韶光并减少往后的麻烦。
但是,您将利用什么标准将乐高积木放入垃圾箱呢?您要为不同颜色分配垃圾箱吗?或者将所有方形碎片放入一个箱子中,将圆形碎片放入另一个箱子中?这实际上取决于您拥有什么乐高积木!
简而言之,这便是聚类。

更正式地说,聚类或聚类剖析是一组对数据点进行分组的技能。
聚类算法吸收一堆工具,并为每个工具分配分配。
然而,与分类不同的是,聚类并不是从类列表开始对工具进行分类,而是逼迫工具落入预设的桶中。
相反,聚类考试测验创造给天命据的存储桶。
换句话说,聚类是关于揭示数据中的构造,而不是预测预先存在的构造中的标签。

末了一点值得重复:聚类不是预测标签。
与分类、检测和分割任务不同,聚类任务没有真实标签。
我们称这种算法为无监督的,与监督和自监督学习任务形成比拟。

言归正传,集群是无需演习的。
聚类算法将接管数据点(工具)的特色,并利用这些特色将工具分成组。
如果成功,这些组会突出显示独特的特色,让您理解数据的构造。

这意味着聚类是探索数据的极其强大的工具 - 特殊是当您的数据未标记时!

集群如何事情?

如果您一贯密切关注,您可能已经把稳到聚类和聚类算法之间的奇妙差异。
这是由于集群是一个涵盖各种技能的总称!

聚类算法有多种类型,其差异在于它们用于分配聚类成员资格的标准。
一些最常见的聚类风格是:

基于质心的聚类:例如,K-means 和 Mean Shift 聚类等技能。
这些方法试图找到定义每个簇的中央点(称为质心),其寻求最大化簇内点之间的某些同等性观点。
这种聚类风格可以很好地扩展到大型数据集,但对非常值和随机初始化很敏感。
常日,会实行多次运行,然后选择最好的一次。
您可能会创造 K 均值等技能难以处理高维数据(“维数灾害”),但与均匀流形逼近和投影 (UMAP) 等降维技能合营利用时,可以更好地揭示构造。
我们将不才面阐明如何将两者配对。

基于密度的聚类:DBSCAN、HDBSCAN 和 OPTICS 等技能根据特色空间的稀疏或密集程度来选择聚类。
从观点上讲,这些算法将高密度区域视为簇,当点在特色空间中充分分散时将簇冲破。
DBSCAN 等大略的基于密度的技能可能难以处理高维数据,由于这些数据可能不会密集地共置。
然而,像 HDBSCAN 这样更繁芜的技能可以战胜个中一些限定,并从高维特色中揭示显著的构造。

层次聚类:这些技能旨在:

通过从单个点开始并迭代地将簇组合成更大的复合体或解构集群,从一个集群中的所有工具开始,然后迭代地将集群划分为更小的组件。

随着数据集的增长,诸如聚合聚类之类的布局性技能在打算上变得昂贵,但对付中小型数据集和低维特色来说,性能可能相称令人印象深刻。

有关 10 多种最常用聚类算法的全面谈论,请查看 Scikit-learn 供应的直不雅观且编写良好的指南!

我要基于哪些功能进行集群?

对付我们开始谈论的乐高积木,其特色(长度、宽度、高度、曲率等)是独立的实体,我们可以将其视为数据表中的列。
在对这些数据进行归一化以使没有一个特色支配其他特色之后,我们可以将一行数值作为特色向量通报到每个乐高积木的聚类算法中。
从历史上看,集群有许多这样的运用程序,对数据表或韶光序列中经由轻微预处理的数值进行操作。

由于一些大略的缘故原由,像图像这样的非构造化数据不太适宜这个框架:

图像的大小可能有所不同(长宽比和分辨率)原始像素值可能非常喧华像素之间的干系性可能是高度非线性的

如果我们要经历重塑和标准化所有图像大小、标准化像素值、去噪以及将多维数组展平为“特色向量”的麻烦,那么将这些处理过的像素数组视为特色会给我们带来巨大的压力用于揭示构造的无监督聚类算法。
这适用于 MNIST 等大略数据集,但在实践中常日不是一个选择。

幸运的是,我们有强大的非线性函数逼近工具,称为深度神经网络!
将我们的把稳力限定在图像领域,我们有像 CLIP 和 DINOv2 这样的模型,其输出是输入数据的故意义的表示,并且我们有针对图像分类等特界说务演习的模型,我们常日从中获取倒数第二个的输出网络层。
还有变分自动编码器(VAE)网络,常日从中获取中间层的表示!

不同的模型具有不同的架构,并针对不同的数据集和不同的任务进行演习。
所有这些元素都奉告模型学习的特色类型。
做好作业吧:)

利用 FiftyOne 和 Scikit-learn 对图像进行聚类设置和安装

理解完所有这些背景后,让我们将理论转化为实践,并学习如何利用聚类来构建非构造化数据。
我们将利用两个开源机器学习库:scikit-learn,它预先打包了最常见的聚类算法的实现,以及五十一,它简化了非构造化数据的管理和可视化:

pip install -U scikit-learn fiftyone

FiftyOne 集群插件让我们的生活变得更加轻松。
它供应了 scikit-learn 的聚类算法和我们的图像之间的结缔组织,并将所有这些包装在 FiftyOne 运用程序内的大略 UI 中。
我们可以从 CLI 安装插件:

fiftyone plugins download https://github.com/jacobmarks/clustering-plugin

我们还须要其余两个库:OpenAI 的 CLIP GitHub 存储库,使我们能够利用 CLIP 模型天生图像特色;以及 umap-learn 库,它使我们能够运用称为统一流形逼近和投影 (UMAP) 的降维技能这些特色以二维办法可视化它们:

pip install umap-learn git+https://github.com/openai/CLIP.git

请把稳,这两个库都不是绝对必要的 - 您可以利用 FiftyOne Model Zoo 中公开嵌入的任何模型天生特色,并且可以利用 PCA 或 tSNE 等替代技能实行降维。

安装完所有必要的库后,在 Python 进程中导入干系的 FiftyOne 模块,并从 FiftyOne Dataset Zoo 加载数据集(如果您乐意,也可以加载您的数据!
)。
在本演习训练中,我们将利用 MS COCO 数据集中的验证分割(5,000 个样本):

import fiftyone as foimport fiftyone.brain as fobimport fiftyone.zoo as fozfrom fiftyone import ViewField as F# load dataset from the zoodataset = foz.load_zoo_dataset("coco-2017", split="validation")# delete labels to simulate starting with unlabeled datadataset.select_fields().keep_fields()# rename and persist to databasedataset.name = "clustering-demo"dataset.persistent = True# launch the app to visualize the datasetsession = fo.launch_app(dataset)

如果您在 Jupyter Notebook 中事情,则可以通报 auto=False ,然后在浏览器中打开一个选项卡到 session.url 指向的任何位置(常日为 http://localhost:5151 /) 来看看该运用程序的全部辉煌。

创造我们的特色

现在我们有了数据,我们必须天生用于聚类的特色。
在本演习训练中,我们将研究两个不同的特色:由 CLIP Vision Transformer 天生的 512 维向量,以及通过 UMAP 降维例程运行这些高维向量天生的二维向量。

为了对 FiftyOne 样本凑集进行降维,我们将利用 FiftyOne Brain 的 compute_visualization() 函数,该函数通过 method 关键字参数支持 UMAP、PCA 和 tSNE。
我们可以利用数据集的 compute_embeddings() 方法天生 CLIP 嵌入,然后将其显式通报到我们的降维例程中。
相反,我们可以通过隐式见告 compute_visualization() 利用 CLIP 打算嵌入并将这些嵌入存储在字段 ”clip_embeddings” 中,然后利用它们来获取 2D 表示,从而一箭双雕:

res = fob.compute_visualization( dataset, model="clip-vit-base32-torch", embeddings="clip_embeddings", method="umap", brain_key="clip_vis", batch_size=10)dataset.set_values("clip_umap", res.current_points)

brain_key 参数许可我们通过名称访问这些结果,无论是通过编程办法还是在 FiftyOne 运用程序中。
末了一行获取我们天生的 2D 向量数组,并将它们存储在数据集的新字段 ”clip_umap” 中。

刷新运用程序并打开嵌入面板,我们该当看到数据集的 2D 表示,个中图中的每个点对应于单个图像:

打算和可视化集群

有了我们的特色向量,我们就可以利用 FiftyOne 聚类插件为我们的数据带来构造。
在 FiftyOne 运用程序中,按键盘上的反引号键并输入 compute_clusters 。
单击下拉列表中的条款以打开聚类模式。

输入 run_key (类似于上面的 brain_key )以访问聚类运行的结果。
当您这样做时,请不雅观察输入表单的动态更新。
此时,您须要做出两个关键决定:基于哪些特色进行聚类以及采取哪种聚类算法!

选择 ”kmeans” 作为聚类方法,选择 ”clip_umap” 作为特色向量。
将簇数设置为 20,利用所有其他参数的默认值。
按 Enter 键并让聚类算法运行。
该当只须要几秒钟。

打算完成后,请把稳样本上的新字段,个中包含整数的字符串表示形式,这表示给定样本分配到哪个集群。
您可以直接过滤这些值并在示例网格中一次查看一个集群:

更有趣的是我们的嵌入图中这些簇标签的着色:

像这样可视化集群可以让您对集群例程进行健全性检讨,并可以供应数据构造的直不雅观视图。
在此示例中,我们可以看到一群泰迪熊,它们与我们的别的数据很好地分开。
这种聚类过程还揭示了农场动物与大象和斑马等更奇异的动物之间的界线。

现在,创建一个新的聚类运行,将聚类数量增加到 30(不要忘却为这个新字段中的嵌入着色)。
根据一点随机性(所有例程的初始化都是随机的),大象和斑马现在很有可能霸占自己的集群。

回到最初的一组簇,让我们深入研究嵌入图中的末了一个区域。
请把稳,一些踢足球的人的图像如何被集中到一组紧张是网球的图像中。
这是由于我们将二维维数减少的向量通报到我们的聚类例程中,而不是嵌入向量本身。
虽然 2D 投影有助于可视化,并且 UMAP 等技能相称善于保留构造,但相对间隔并未完备保留,并且会丢失一些信息。

假设我们利用相同的超参数将 CLIP 嵌入直接通报到聚类打算中。
在这种情形下,这些足球图像以及飞盘和棒球等其他田径运动图像会被分配到与别的足球图像相同的集群。

关键要点是高维特色并不比低维特色更好,反之亦然。
每个选择都须要权衡。
这便是为什么您该当考试测验不同的技能、超参数和功能。

为了使这一点更加明显,让我们利用 HDBSCAN 作为我们的聚类算法,它不许可我们指定聚类的数量,将其更换为 min_cluster_size 和 max_cluster_size 等参数以及条件在其上合并集群。
我们将利用 CLIP 嵌入作为特色,作为一个粗略的出发点,我们只须要 10 到 300 个元素之间的集群。
如果集群太大,可能没有帮助;如果它太小,它可能会吸收到噪声而不是旗子暗记。
当然,详细值取决于数据集!

当我们按簇标签着色时,结果看起来有点混乱。
然而,当我们单独查看每个集群的图像时,我们创造我们在数据集中识别了一些非常有趣的样本凑集。

对付 HDBSCAN,标签 ”-1” 被授予所有背景图像。
这些图像不会合并到任何终极的簇中。

跟踪聚类运行

当您测试功能、集群技能和超参数的各种组合时,您可能希望跟踪用于天生一组特定集群的“配置”。
幸运的是,FiftyOne 集群插件利用自定义运行为您处理所有这些。
该插件公开了一个运算符 get_clustering_run_info ,它许可您通过 run_key 选择运行,并在运用程序中查看所有运行参数的格式良好的打印输出:

您还可以通过将 run_key 通报到数据集的 get_run_info() 方法来以编程办法访问此信息!

利用 GPT-4V 标记簇

到目前为止,我们的集群只有数字,我们将其用作美化的管家设备。
然而,如果我们对数据集中的某些特定特色进行聚类,我们该当能够识别它并利用它来疏松地标记我们的样本。
天真地,我们可以单独浏览我们的集群,仅选择和可视化给定集群中的图像,并考试测验自己标记集群。

或者......我们可以利用多模式大措辞模型来为我们做到这一点!
FiftyOne 集群插件供应了此功能,利用 GPT-4V 的多模式理解功能为每个集群供应观点标签。

要利用此功能,您必须有一个 OpenAI API 密钥环境变量(如有必要,创建一个帐户),您可以如下设置:

export OPENAI_API_KEY=sk-...

此功能是通过 label_clusters_with_gpt4v 运算符供应的,该运算符从每个集群中随机选择 5 个图像,通过特定于任务的提示将它们输入 GPT-4V,并处理结果。

根据您拥有的集群数量(GPT-4V 可能会很慢,并且这会随着集群数量线性扩展),您可能希望通过选中操作员模式中的框来委派操作的实行,然后从命令行为:

fiftyone delegated launch

结论

在本演习训练中,我们先容了如何将深度神经网络与盛行的聚类算法相结合,以利用 scikit-learn 和 FiftyOne 为非构造化数据带来构造。
在此过程中,我们看到您选择的特色向量、算法和超参数可以极大地影响聚类打算的终极结果,无论是聚类选择的内容还是它们识别数据构造的能力。

一旦您对数据运行了这些聚类例程,就会涌现一些关键问题:

如何定量比较和比拟这些聚类运行?如何综合多次聚类运行的见地以更好地理解我的数据?如何利用这些见地来演习更好的模型?

回答这些问题将帮助您得到集群的回报。
如果您喜好这篇文章并希望我先容这些后续主题,请见告我!

下一步是什么

如果您想更深入地理解集群天下,您可能须要探索以下几种路子:

嵌入模型的选择:我们利用了 CLIP,这是本演习训练的语义根本模型。
理解当您利用 Hugging Face 的 Transformers 库或 OpenCLIP 中的其他语义模型时情形会发生若何的变革。
现在看看当您利用 ResNet50 等“像素和补丁”打算机视觉模型或 DINOv2 等自监督模型时,图片会发生若何的变革。
集群超参数:在本演习训练中我们险些没有涉及集群的数量。
随着您增加或减少此数字,您的结果可能会有所不同。
对付某些技能(例如 k 均值聚类),您可以利用启示式方法来估计最佳聚类数。
不要就此止步;也考试测验其他超参数!
观点建模技能:本演习训练中的内置观点建模技能利用 GPT-4V 和一些灯光提示来识别每个集群的核心观点。
这只是办理开放式问题的一种方法。
考试测验利用图像字幕和主题建模,或创建您自己的技能!