【问题标题】:Color Segmentation: A better cluster-analysis to find K颜色分割:找到 K 的更好的聚类分析
【发布时间】:2018-01-09 22:27:31
【问题描述】:

我知道有很多这样的问题和一些解决方案,但我希望有另一种方法。

目标:最终目标是对给定图像的颜色进行聚类,然后允许用户更改这些颜色。用户不需要输入任何k。算法确定K

方法:目前,我使用的是剪影分数指标 (http://scikit-learn.sourceforge.net/dev/modules/generated/sklearn.metrics.silhouette_score.html#sklearn.metrics.silhouette_score)。我正在使用 MiniBatchKMeans 对图像进行聚类,然后在 k (4-8) 的范围内计算 silhouette_score。代码是:

# silhouetteCoeff determination
def silhouetteCoeff(z):
max_silhouette = 0
max_k = 0
for i in range(4, 17):
    clt = MiniBatchKMeans(n_clusters = i, random_state = 42)
    clt.fit(z)
    silhouette_avg = silhouette_score(z, clt.labels_, sample_size = 250, random_state = 42)
    print("k: ", i, " silhouette avg: ", silhouette_avg)
    if (silhouette_avg == 1.0):
        max_k = i
        break
    elif (silhouette_avg > max_silhouette):
        max_silhouette = silhouette_avg
        max_k = i
print("Max silhouette: ", max_silhouette)
print("Max k: ", max_k)
return int(max_k)

即使我事先对图像进行了颜色量化(到 16 种颜色),该函数仍然需要 6-8 秒才能运行(假设图像大小为 400x400)。

我的问题是,是否有任何更好或更快的方法可以找到 k?我也尝试过 Elbow 方法,但仍然要计算那里的 SSE。通过对一些图像的测试,我发现 k = 8 的平均值很好。但是在颜色更密集的图像上,算法会丢失一些颜色。

【问题讨论】:

    标签: algorithm machine-learning computer-vision cluster-analysis k-means


    【解决方案1】:

    衡量你的瓶颈!

    Silhouette 在 O(n²) 中,因此很可能会成为您方法的瓶颈。此外,还有比 sklearn 中的更快的 k-means 变体......所以有很大的潜力可以让事情变得更快。

    Minibatch kmeans 甚至不会收敛,而只是近似结果。据我所知,如果您无法将所有数据都保存在内存中,这才有意义。

    据说将调色板减少到只有 16 种颜色根本没有帮助。

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2017-05-12
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2017-03-22
      相关资源
      最近更新 更多