このような問題や解決策がたくさんあることは知っていますが、別の方法があると思います。カラーセグメンテーション:より良いクラスター分析を見つけるK
ゴール:最終的な目標は、画像が与えられた色をクラスタ化し、ユーザーがそれらの色を変更できるようにすることです。ユーザーは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色)に画像を量子化しても、機能はまだ(画像サイズ400x400のを想定)を実行するためには良い6-8秒かかります。
私の質問は、より良いまたはより速い方法を見つけるには?私もエルボーメソッドを試しましたが、そこではSSEを計算する必要があります。いくつかの画像のテストから、私は良い平均k = 8を見つけました。しかし、より濃い色の画像では、アルゴリズムはいくつかの色を失います。