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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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