k-means聚类中的聚类中心?

我有一张96×96像素的灰度人脸图像。我试图找到眼睛中心和嘴唇角。我在人脸图像上应用了一个Gabor滤波器(theta=pi/2, lamda=1.50),卷积后得到的滤波器输出如下所示。

Gabor滤波器响应

从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.shapeprint '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_,输出看起来像一个代码书。我没有看到聚类中心的坐标。

Kmeans代码书

我使用了这篇论文中描述的步骤:http://jyxy.tju.edu.cn/Precision/MOEMS/doc/p36.pdf


回答:

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

要获得2维(x, y)坐标作为你的k-means聚类中心,你需要使用2维输入数据运行算法。仅凭直觉,似乎你可以对人脸图像应用一个黑暗阈值,并组装一个仅包含暗像素位置的聚类数据集。然后在你对这个数据集运行k-means后,聚类中心希望能接近人脸图像中最多的暗像素位置。这些位置(假设你的训练数据中的人脸图像已经大致对齐)应该与你希望的眼睛和嘴角位置相当接近。

这可能真的很 confusing,所以我会尝试添加一个例子。假设你有“人脸图像”,宽3像素,高4像素。在对其中一张图像进行阈值处理后,它可能看起来像这样:

0 1 2  <-- x坐标0 0 0  0  ^ y坐标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 10 22 3

在这个例子中,我们从这个“图像”中提取了3个2维点;有了更多的图像,你会得到更多的2维点。在你使用这些2维数据点运行k-means后,你将得到可以解释为原始图像中像素位置的聚类中心。你可以将这些中心位置绘制在你的图像上,并查看它们在图像中的对应位置。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注