0

このような問題や解決策がたくさんあることは知っていますが、別の方法があると思います。カラーセグメンテーション:より良いクラスター分析を見つける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を見つけました。しかし、より濃い色の画像では、アルゴリズムはいくつかの色を失います。

答えて

0

ボトルネックを測定してください!

シルエットはO(n²)なので、あなたのアプローチのボトルネックになりそうです。また、Sklearnのものよりもはるかに高速なk-meansのバリエーションがあるので、物事をより速くする可能性があります。

ミニバンkmeansは収束さえしませんが、結果を近似するだけです。私が理解できる限り、すべてのデータをメモリに保存する余裕がない場合にのみ意味があります。

カラーパレットをわずか16色に縮小することは、まったく役に立たないでしょう。

関連する問題