2015-11-14 13 views
6

Edit: Hier ist der vollständige Code für jedermann mit Fragen noch github.comPython Bag of Words Clustering

Ich versuche, eine Bilderkennung Projekt zu tun mit SIFT und Bogen. Bis jetzt versuche ich, mein Wörterbuch zu trainieren und zu bauen. Ich habe Bilder aus 5 verschiedenen Klassen gelesen, berechnete Deskriptoren und fügte sie alle einer Python-Liste ([]) Seite an Seite hinzu. Jetzt versuche ich die Python-Version von BOWMeansTrainer zu verwenden, um meine Deskriptoren mit k = 5 zu clustern (ist das korrekt? Für 5 Klassen?). Ich versuche, Cluster() meinen Descriptor Vektor passieren, aber ich erhalte die Störung

Traceback (most recent call last): 


File "C:\Python27\Project2\beginning.py", line 40, in <module> 
    bow.cluster(des) 
TypeError: descriptors data type = 17 is not supported 

Ich bin nicht wirklich sicher, welches Format in meinem numpy Array zu setzen, hat jemand eine Idee?

sift = cv2.SIFT() 

descriptors = [] 
for path in training_paths: 
    image = cv2.imread(path) 
    print path 
    gray = cv2.cvtColor(image, cv2.CV_LOAD_IMAGE_GRAYSCALE) 
    kp, dsc= sift.detectAndCompute(gray, None) 
    descriptors.append(dsc) 

des = np.array(descriptors) 

k=5 
bow = cv2.BOWKMeansTrainer(k) 
bow.cluster(des) 

Wie Sie halte ich sehen kann, die Sift Deskriptoren anhängt, und dann versuchen, zu einem numpy Array (das benötigte Format) zu konvertieren.

+0

Der Parameter k des BoW-Algorithmus hat nichts mit der Anzahl der Klassen zu tun, die Sie versuchen zu klassifizieren, es ist die Anzahl der Cluster (dh visuelle Wörter). Es zeigt im Wesentlichen die Dimensionalität des resultierenden Merkmalsvektors an, 5 ist zu klein. Ich habe es mit Erfolg von k von 500-1000 bis zu 1M verwendet. Schauen Sie [hier] (http://cs.nyu.edu/~fergus/teaching/vision_2012/9_BoW.pdf) – powder

+0

Sie haben Recht, Pulver, das ist ein älterer Beitrag, aber ich erinnere mich, dass 5 Cluster logisch war, weil Ich hatte 5 Klassen, also wollte ich 5 Zentroide. Eine realistischere Zahl wäre viel höher – briansrls

Antwort

5

dachte es nur dank der opencv Foren aus, stattdessen eine andere Liste der Verwendung von (I-Deskriptoren oben verwendet), um nur die Deskriptoren fügen Sie direkt in Ihre Tasche mit bow.add (dsc) finden

dictionarySize = 5 

BOW = cv2.BOWKMeansTrainer(dictionarySize) 

for p in training_paths: 
    image = cv2.imread(p) 
    gray = cv2.cvtColor(image, cv2.CV_LOAD_IMAGE_GRAYSCALE) 
    kp, dsc= sift.detectAndCompute(gray, None) 
    BOW.add(dsc) 

#dictionary created 
dictionary = BOW.cluster() 

EDIT: Für alle anderen Probleme habe ich den Rest des Skripts hochgeladen here

+0

Hallo, ich möchte eine 10-Klassen Bildklassifizierung machen, die ich auf Android Smartphone ausführen möchte. Kannst du mir deine Ergebnisse mit Python sagen? – sau

+0

@Sau Könnten Sie klarstellen, wonach Sie suchen? – briansrls

+0

Ich möchte ein Deep-Learning-Modell auf dem Smartphone laufen lassen, um das Bild in einige Kategorien einzuteilen. Jetzt möchte ich, dass dieses Modell sehr, sehr klein ist. – sau