在大型数据集上使用提取的特征向量进行图像聚类

Image clustering with extracted feature vectors on a large dataset

提问人:vmchance 提问时间:11/3/2023 最后编辑:vmchance 更新时间:11/7/2023 访问量:63

问:

我一直在尝试在一个非常大的图像数据集(大约 100 万张图像)上使用多种聚类技术。该过程非常标准 - 例如,使用预训练的 CNN(在本例中为 VGG19)来提取特征并测试许多聚类方法(目前是分层和 k 均值)以将图像组合在一起。这适用于我的数据子集。

但是,当我在大型数据集上执行此操作时,我有两个主要问题:

  • Python 中的大多数聚类示例都需要数组作为输入。我的数据太大,无法放入内存中的数组中(我目前有 64gb)。
  • 我可以使用 keras 中的图像生成器/批处理方法处理 VGG16 中的特征,但是我找不到一种方法在不转换为数组的情况下在聚类算法(例如,scipy 的分层聚类或 sklearn 聚类)中使用这些输出。

我基本上无法弄清楚如何在不使用数组的情况下将这些提取的特征(可以很容易地批量处理)移动到聚类方法。

这些图像实际上来自大约 4,000 个“类”,但它们在不同类之间并不完全不同。这种聚类方法的目标是使用无监督聚类将这些类减少到更广泛的类别 - 所以我确实需要所有数据,而且我没有办法对其进行子集(我已经使用了来自随机图像样本的测试用例,现在我正在尝试将其应用于整个数据集)。

有没有办法像在 scipy 或 sklearn 中使用数组进行集群包,或者我应该以不同的方式解决这个问题?

我尝试使用 dask 和 numpy mmemap 查看 TensorFlow 数据集,但我不太清楚如何获取这些对象/示例中的任何一个并使用聚类算法处理它们。从本质上讲,我有一些运气处理并将提取的特征存储为输出,但似乎卡在将其移动到聚类模型/不同模型中。

我还探索了降维,但我同样找不到任何可以方便地使用 TF 数据集之类的东西,在这些数据集中,我处理过的特征可以很容易地从模型中存储。

更新:经过一些调查和有用的评论,似乎成对距离计算是某些聚类算法所需的问题。这仍然给我留下了一些可以使用的方法(例如批处理 KMean),尽管如果有其他解决方案可以计算较大数组/特征上的成对距离,我会很感兴趣。

python scikit-learn 聚类分析 numpy-ndarray tensorflow-datasets

评论

1赞 Marco Parola 11/3/2023
一个特征向量的大小是多少?顺便说一句,我认为解决这个问题的最好方法是运行聚类算法的map-reduce版本。否则,您可以对数据集进行采样,并对数据的子集进行分析
1赞 micans 11/6/2023
数组是对象 - 特征数组,还是所有对象与所有对象-对象数组?如果是后者,您可以研究网络聚类算法,其中通常使用截止值,并且高于截止值的相似性会在两个对象之间引起(加权)边缘,从而导致数据结构(网络)更稀疏,并且通常存储为稀疏矩阵。仍然存在所有与所有比较的问题。在某些应用程序中,索引可以加快速度。
0赞 vmchance 11/6/2023
我一直在等待模型完成计算特征向量大小,但遗憾的是仍在运行。无论如何,每个图像是 (224,224,3),VVG16 输出 4092 个特征,因此数组的大小为 (n,4092)。更让我困惑的是,我将提取的特征存储在磁盘上,其大小只有 5gb,但我认为特征的成对距离数组现在是问题所在。该数组是一个特征数组,因此不是所有对象与所有对象-对象数组,但是我可能仍将网络聚类作为潜在的解决方案进行研究。
1赞 micans 11/7/2023
如果我理解正确的话,你所说的“与特征的成对距离数组”就是我所说的“对象-对象”数组;因此,这将具有大小 (n,n),对吗?在这种情况下,您现在对这是/可能是问题的观察是有道理的,网络聚类算法可能值得研究。
1赞 vmchance 11/7/2023
这将解释很多。我将更新我的原始帖子 - 特征数组本身不是问题,它是成对距离数组(对象-对象数组),正如您提到的我尝试使用的一些聚类算法所需的。感谢您推荐网络聚类算法 - 我一定会看一看!

答: 暂无答案