【问题标题】:Cluster centers in k-means?k-means中的聚类中心?
【发布时间】:2015-06-04 19:26:37
【问题描述】:

我有一张 96x96 像素的灰度面部图像。我试图找到眼睛中心和唇角。我在面部图像上应用了一个 gabor 滤波器 (theta=pi/2, lamda=1.50),在卷积之后,我得到了这样的滤波器输出。

从 gabor 输出中可以看出,眼睛和嘴角清晰可辨。我应用 scikit kmeans 聚类将像素组合成 4 个聚类(2 个眼睛和 2 个唇角)

data = output.reshape(-1,96*96)
estimator = KMeans(n_clusters=4)
estimator.fit(data)
centroids = np.asarray(estimator.cluster_centers_) 
print 'Cluster centers', centroids.shape
print 'Labels', estimator.labels_, estimator.labels_.shape

输出

Input X,y: (100, 96, 96) (1783, 1)
Gabor Filters (1, 9, 9)
Final output X,y (100, 96, 96) (0,)
Shape estimator.cluster_centers_: (4, 9216)

现在问题来了:如何绘制 4 个聚类中心的质心 x,y 坐标?我能看到眼睛中心和嘴角吗

更多信息:我绘制了 estimator.cluster_centers_ 并且输出就像一本密码书。我没有看到集群质心的坐标。

我正在使用本文中描述的步骤:http://jyxy.tju.edu.cn/Precision/MOEMS/doc/p36.pdf

【问题讨论】:

    标签: image-processing numpy machine-learning scikit-learn


    【解决方案1】:

    我认为这里对您进行 K-means 聚类的空间有些混淆。在您问题中包含的代码 sn-p 中,您正在使用矢量化人脸图像作为数据点来训练 KMeans 模型。 K-means 聚类与您提供的数据位于相同的空间中,因此(如您所见)您的聚类质心也将是矢量化的人脸图像。重要的是,这些人脸图像的维度是 9216,而不是维度 2(即 x-y 坐标)!

    要将二维 (x, y) 坐标作为 K 均值质心,您需要使用二维输入数据运行算法。就在我的脑海中,您似乎可以对您的面部图像应用一个黑暗阈值,并组装一个仅包含黑暗像素位置的聚类数据集。然后,在此数据集上运行 K-means 后,质心有望靠近您的面部图像中最暗像素的像素位置。这些位置(假设您的训练数据中的人脸图像已经有些注册)应该稍微靠近您希望的眼睛和嘴角。

    这可能真的很令人困惑,所以我将尝试添加一个示例。假设只是一个示例,您有 3 像素宽 x 4 像素高的“面部图像”。在对其中一张图像中的像素进行阈值处理后,它可能看起来像:

    0 1 2  <-- x coordinates
    
    0 0 0  0  ^ y coordinates
    0 1 0  1  |
    1 0 0  2  |
    0 0 1  3  v
    

    如果您直接在 K-means 中使用此“图像”,您实际上是在 12 维空间中运行您的 K-means 算法,并且上面的图像将被矢量化为:

    0 0 0 0 1 0 1 0 0 0 0 1
    

    那么你的 K-means 聚类质心也将存在于同一个 12 维空间中。

    我想建议的是,您可以提取每张图像中 1 的 (x, y) 坐标,并将其用作 K-means 算法的数据。因此,对于上面的示例图像,您将获得以下数据点:

    1 1
    0 2
    2 3
    

    在这个例子中,我们从这个“图像”中提取了 3 个二维点;使用更多图像,您将获得更多二维点。使用这些二维数据点运行 K-means 后,您将获得簇质心,这些质心也可以解释为原始图像中的像素位置。您可以在图像顶部绘制这些质心位置,并查看它们在图像中的对应位置。

    【讨论】:

    • 看来我可能需要将维度降低到 2d 才能找到聚类中心。应用阈值是个好主意 :) 但即使在阈值之后,9216 中高强度像素维度的数量也超过 100。似乎无法将其变为 2d??
    • @pbu 很抱歉造成混乱。我的意思是,在您对图像中的像素进行阈值处理后,您可以提取每个暗像素的 (x, y) 坐标,因此您将从每个图像中提取约 100 个 (x, y) 位置,然后运行 ​​K - 表示在该组二维点上。我将添加一个示例。
    • @pbu 我刚刚阅读了您链接到的论文,这也是他们正在做的事情。仔细阅读 IV-B 和 IV-C 部分。
    • 我想通了 :) 感谢 lmjohna3 的广泛解释 :)
    猜你喜欢
    • 2016-05-29
    • 2020-02-21
    • 2016-01-01
    • 2018-09-30
    • 2015-04-11
    • 2013-01-11
    • 2016-02-01
    • 2016-08-27
    • 2018-09-19
    相关资源
    最近更新 更多