2017-04-03 4 views
3

Ich möchte die Bilder mit K-Means oder anderen Algorithmus clustern (Vorschlag erforderlich).Clustering in Python-Image Clustering

Das Problem ist wie folgt- Ich möchte Bilder in 3 Cluster (Natur, Sonnenuntergang, Wasser) Cluster. Ich habe alle Bilder mit os.listdir() geladen und dann alle Bilder in Arrays (RGB) konvertiert und dann einen Datenrahmen erstellt, der drei Spalten enthält - ID, Image_array, Label.

Nun, wenn ich K Means Clustering verwenden, sofern n_clusters = 3, zeigt es diesen Fehler:

from sklearn.cluster import KMeans kmeans = KMeans(n_clusters = 3).fit(img_array) ERROR = Found array with dim 4. Estimator expected <= 2.

Nun, ich brauche Ihre Hilfe in diesem Clustering Problem. Der Datenrahmen, die ich erstellt wie folgt aussieht

img_array = [] 

path = "C://Users/shivam/Desktop/freelancer/p22/data/green_nature/" 
for f in os.listdir('.'): 
    if f.endswith('.jpg'): 
     img = Image.open(f) 
     data = np.asarray(img, dtype='uint8') 
     img_array.append(data) 


df = pd.DataFrame({'image_arrays':img_array}) 
df['id'] = range(1, len(df) + 1) 

Antwort

0

Well wie Sie sagten, k-means möchte einen Vektor pro Eingang, während man es mit einem 3D-Array pro Bild bereitstellen. Der einfachste Weg, um ein Problem wie dieses zu lösen (was einige Kreativität erfordert) wäre, eine Reihe von Funktionen zu entwickeln, die für die Klassen, die Sie haben, zu unterscheiden.

Da man in diesem Fall zwischen Natur (lot's o 'green), Wasser (lot's o' blue) und Sonnenuntergang (lot's o 'read/yellow/pink vielleicht?) Klassifizieren möchte, kann man das Gesamt- oder Durchschnittsgrün verwenden blaue und rote Werte. Um zu überprüfen, ob die von Ihnen ausgewählten Funktionen diskriminierend sind, können Sie ein Histogramm zeichnen.

von Ihrem 4D (Bild x Breite x Höhe x Farbe) Array zu einem 2D (Bild x durchschnittliche Farben) Array zu gehen. Sie müssen die np.mean über die Farb-, Höhen- und Breitendimmungen nehmen. Am Ende sollten Sie ein (Bilder x 3 (Farben)) Array haben.

+0

Ja, das interesting.But scheint, ich bin stecken, können Sie mir helfen, dass aus. Wie bekomme ich das Histogramm (ich habe auch versucht, das zu bekommen). Jetzt versuche ich, die avg anstelle von 3 D-Array zu bekommen. Wenn Sie bitte mehr Hilfe zur Verfügung stellen, wäre das sehr hilfreich. –

+0

Ich denke, dieses 3 D-Array in ein 2D-Array zu konvertieren, das mittlere und Standardabweichung hat, die in Ordnung sein wird, wenn ich K Means, aber dieses Array ist RGB-Array. Ich meine, wie soll ich das machen? –

+0

np.mean (image_arrays, axis = 2)? https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html – TheLaurens

0

Dies passiert, weil Sie 4-dim-Array übergeben, während 2-dim erwartet. 'img_array.shape' sollte so aussehen (n_samples, n_features). Sie müssen den Feature-Extraktionsalgorithmus verwenden.

Dies kann über scikit-image-Modul erfolgen. Sie müssen Bilder in Graustufenformat konvertieren. Code:

import skimage.feature as feature 
img_converted = [] 
for i in range(len(img_array)): 
    img_converted.append(feature.hog(img_array[i])) 
model.fit(np.array(img_converted)) 

Dokumentation: http://scikit-image.org/docs/dev/api/skimage.feature.html#hog

+0

Ich brauche mehr Erklärung, können Sie mir Ihren Code zur Verfügung stellen. Zu diesem Zeitpunkt denke ich darüber nach, wie man das Array in ein anderes 2D-Array konvertieren soll, das für jede Zeile Mittelwert und Standard-Dev hat, was Kmeans bekommen kann –

+0

Ich habe auch das gleiche versucht, aber noch ein paar Fragen ? das Array war 4D, verwendet np.mean (Achse = 2), schneiden wir die vierte Dim, jetzt habe ich wieder Achse = 0 verwendet. wir schneiden ein weiteres dim. Jetzt ist es ein 2D-Array, das von K MEANS akzeptiert wird, aber ich bin verwirrt, war das richtig zu tun? Wie wäre es, wenn wir ndarray.flatten hacken in ein 1 D-Array und bekomme den Mittelwert ?? –

+0

Ich konnte das nicht verwenden, was ich tat ist, dass ich das img_array in ein 2D-Array umgewandelt habe, indem ich np.mean bei Achse = 0 und Achse = 2 erhalten habe. jetzt aber Klassen, die ich habe, ist 300. nach dem Anwenden der Achse = 0,2 bzw.. Aber mein Datensatz hat nur 24 Instanzen, wo ich Fehler gemacht habe? –