k-means 中的聚类中心?

Cluster centers in k-means?

我有一张 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

我认为您在 space 中进行 K 均值聚类时存在一些混淆。在问题中包含的代码片段中,您正在使用矢量化面部图像作为数据点来训练 KMeans 模型。 K-means 集群与您提供的数据位于相同的 space 中,因此(正如您所注意到的)您的集群质心也将是矢量化人脸图像。重要的是,这些人脸图像的维度是 9216,而不是维度 2(即 x-y 坐标)!

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

这可能真的很令人困惑,所以我将尝试添加一个示例。举个例子,您有 "face images",宽 3 像素,高 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 中使用这个 "image",你实际上是 运行在 12 维 space 中使用你的 K-means 算法,上图将被矢量化为:

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

那么你的 K-means 聚类质心也将位于相同的 12 维 space。

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

1 1
0 2
2 3

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