来自许多数字和字符图片的图像聚类,将相似的图像聚类在一起

时间:2017-07-13 06:17:11

标签: python image-processing scikit-learn neural-network cluster-analysis

我有很多内容是其中之一的图片  0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,如下所示:

enter image description here

有一万张照片,我不想自己给它们贴上标签。所以我尝试使用sklearn来聚类它们。

我的计划:

  1. 选择一个sklearn聚类模型,例如Kmeans

  2. 由于1,l,I c,C o,O s,S x,X v,V z,Z相似,我可以设置较低n_cluster参数,例如56。

  3. 将所有图片填充到相同的大小,但位置随机(我认为这可能会带来好结果)。

  4. 群集完成后,
  5. 我可以将标签(1~56)标记为真实的char。然后可以使用此数据集来训练分类器。

  6. 但是梦想很美好,事实很难。

    我的代码:

    from sklearn import cluster
    data = load('data.pkl', '.')
    
    #data.shape
    #(103083, 76, 70)
    
    k_means = cluster.KMeans(n_clusters=56, n_jobs=-1)
    k_means.fit(data.reshape((data.shape[0], -1)))
    
    # print top 10 image which label by 25
    for i in data[np.where(k_means.labels_==25)[0][:10]]:
        plt.figure(figsize=(1,1)), plt.imshow(i, 'gray')
        plt.xticks([]), plt.yticks([])
    

    输出:

    enter image description here

    看起来kmeans只由位置决定(标签25都在中间右侧)。 我现在正在尝试其他模型(不包括神经网络),但是他们中的许多人没有n_job参数(用于并行处理),非常慢。我猜结果也可能像kmeans。所以我在这里为这种情况提出正确的解决方案。

2 个答案:

答案 0 :(得分:0)

如果我这样做,我会

  • 手工标记每个字符的几个样本(例如4个,约250个图像),

  • 对最近邻居进行自动分类,

  • 如果对分类存在疑问,建议最近的类并请求手动确认。当与最佳集群和第二个最佳集群的相似性差异超过估计的集群规模时,会产生疑问。

为了提高安全性,在第一个训练步骤之后,您可以检查每个群集中的异常值。

答案 1 :(得分:0)

K-means和几乎每个聚类算法都不会比较相邻的像素。因为载体中没有这种邻接。因此聚类算法无法对像素执行此操作。

即使是大多数分类算法也会对原始数据造成困难。显然,你应该进行分类,而不是聚类

如果你想要10年前的结果,那么仔细设计一些功能,如边缘功能,使用好的功能而不是像素

如果您想要对此类数据进行最新的分类性能,请使用深度学习。