使用无监督机器学习对图像进行聚类

Clustering images using unsupervised Machine Learning

我有一个包含身份证、账单和护照的图像数据库。
我想将这些图像分类为不同的组(即身份证、账单和护照)。
正如我所读到的那样,完成这项任务的方法之一是聚类(因为它将不受监督)。
我的想法是这样的:聚类将基于图像之间的相似性(即具有相似特征的图像将被分组在一起)。
我也知道这个过程可以通过使用 k-means 来完成。
所以对我来说问题是关于特征和使用 K-means 图像。
如果有人以前这样做过,或者对此有所了解,请推荐一些链接作为开始或建议任何有用的功能。

获得良好结果的最简单方法是将问题分解为两部分:

  1. 从图像中获取特征:使用原始像素作为特征会得到很差的结果。通过预训练的 CNN 传递图像(您可以在线获得其中的几个)。然后使用最后一个 CNN 层(就在完全连接之前)作为图像特征。
  2. 特征聚类:获得每张图像的丰富特征后,您可以对这些特征进行聚类(如 K-means)。

我建议分别在 Keras 和 Sklearn 中实现(使用已经实现的)1、2。

标注几个例子,使用分类。

聚类很可能为您提供聚类 "images with a blueish tint"、"grayscale scans" 和 "warm color temperature"。这是对此类图像进行聚类的合理方式。

此外,k-means 对异常值非常敏感。你可能有一些。

既然你想要你的集群对应于某些人类概念,分类就是你需要使用的。

我已经使用凝聚层次聚类实现了基于图像相似性的无监督聚类。

我的用例有人物图像,所以我从每张图像中提取了人脸嵌入(又名特征)向量。我使用 dlib 进行人脸嵌入,所以每个特征向量都是 128d。

一般来说,每张图片的特征向量都可以提取出来。预训练的 VGG 或 CNN 网络,其最终分类层已删除;可用于特征提取。

可以为文件夹中的所有图片创建一个以IMAGE_FILENAME为KEY,FEATURE_VECTOR为VALUE的字典。这将使文件名与其特征向量之间的相互关系更容易。

然后创建一个单一的特征向量,比如 X,它由 folder/group 中需要聚类的每个图像的各个特征向量组成。

在我的用例中,X 的尺寸为:文件夹中的图像数量,128(即每个特征向量的大小)。例如,X 的形状:50,128

此特征向量随后可用于拟合凝聚层次聚类。需要根据经验微调距离阈值参数。

最后,我们可以写一个代码来识别IMAGE_FILENAME属于哪个集群

就我而言,每个文件夹大约有 50 张图像,因此这是一个易于管理的解决方案。这种方法能够将单个人的图像分组到单个集群中。例如PERSON1的15张图片属于CLUSTER 0,PERSON2的10张图片属于CLUSTER 2等等...