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

时间:2018-10-09 12:58:17

标签: python computer-vision cluster-analysis k-means unsupervised-learning

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

3 个答案:

答案 0 :(得分:2)

标记一些示例,并使用分类。

聚类可能会给您聚类“带有淡蓝色的图像”,“灰度扫描”和“温暖的色温”。这是引用这类图像的合理方法。

此外,k均值对异常值非常敏感。而且您可能在那里。

由于您想要您的集群与某些人类概念相对应,因此您需要使用分类。

答案 1 :(得分:1)

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

  1. 从图像中获取特征:将原始像素用作特征会给您带来较差的效果。通过预先训练的CNN传递图像(您可以在线获取其中的一些图像)。然后使用最后一个CNN层(就在完全连接之前)作为图像特征。
  2. 特征聚类:每个图像都有丰富的特征,您可以对它们进行聚类(例如K-means)。

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

答案 2 :(得分:1)

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

我的用例具有人的图像,因此我从每个图像中提取了面部嵌入(也称为特征)矢量。我已经使用dlib进行人脸嵌入,因此每个特征向量均为128d。

通常,可以提取每个图像的特征向量。预先训练的VGG或CNN网络,其最终分类层已删除;可以用于特征提取。

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

然后创建一个单一的特征向量,即X,它由文件夹/组中每个需要聚类的图像的各个特征向量组成。

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

然后可以使用该特征向量来拟合聚集层次集群。需要凭经验微调距离阈值参数。

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

就我而言,每个文件夹大约有50张图像,因此这是一个可管理的解决方案。这种方法能够将一个人的图像分组为一个集群。例如,PERSON1的15张图像属于CLUSTER 0,PERSON2的10张图像属于CLUSTER 2,依此类推……