2013-04-08 10 views
6

Also habe ich meine eigenen Codes für HoG und seine Variante geschrieben, um mit Tiefenbildern zu arbeiten. Ich bin jedoch dabei, meine trainierte SVM im Erkennungsfenster zu testen.Wie implementiert man einen besseren Schiebefensteralgorithmus?

Alles, was ich gerade gemacht habe, ist, zuerst Bildpyramiden aus dem Originalbild zu erstellen und ein Schiebefenster von 64x128 Größe von oben links nach unten rechts zu laufen.

Hier ist ein Video-Capture davon: http://youtu.be/3cNFOd7Aigc

Nun das Problem ist, dass ich mehr Fehlalarme bekommen als ich erwartet hatte.

Gibt es einen Weg, dass ich alle diese falschen Positiven entfernen kann (neben dem Training mit mehr Bildern)? Bis jetzt kann ich die "Punktzahl" von SVM bekommen, was der Abstand zum Rand selbst ist. Wie kann ich das nutzen, um meine Ergebnisse zu nutzen?

Hat jemand einen Einblick in die Implementierung eines guten gleitenden Fensteralgorithmus?

Antwort

7

Sie können einen Verarbeitungsschritt hinzufügen, um die lokal stärkste Antwort von SVM zu finden. Lassen Sie mich erklären.

Was erscheint Ihnen im Augenblick zu tun:

für jedes Schiebefenster W, Rekord category[W] = SVM.hardDecision(W)

Harte Entscheidung bedeutet es eine boolean oder ganze Zahl zurückgeben, und für 2-Kategorie Klassifizierung könnte werden wie folgt geschrieben:

hardDecision(W) = bool(softDecision(W) > 0) 

Da Sie OpenCV erwähnt, in CvSVM::predict sollten Sie returnDFVal auf True setzen:

returnDFVal - Gibt einen Typ des Rückgabewerts an. Wenn "true" und das Problem eine 2-Klassen-Klassifizierung ist, gibt die Methode den Entscheidungsfunktionswert zurück, bei dem es sich um eine vorzeichenbehaftete Entfernung zum Rand handelt. Andernfalls gibt die Funktion eine Klassenbezeichnung (Klassifizierung) oder einen geschätzten Funktionswert (Regression) zurück.

von the documentation.

Was könnten Sie tun, ist:

  1. für jedes Schiebefenster W, Rekord score[W] = SVM.softDecision(W)
  2. für jeden W, Rechen- und Rekord:
    • neighbors = max(score[W_left], score[W_right], score[W_up], score[W_bottom])
    • local[W] = score[W] > neighbors
    • powerful[W] = score[W] > threshold.
  3. für jede W, haben Sie eine positive, wenn local[W] && powerful[W]

Da Ihr Klassifikator wird eine positive Antwort für Fenster Tuch (im Raum und/oder Aussehen), um Ihre wahre positiv, die Idee ist, um die Messwerte für jedes Fenster aufzeichnen, und dann auch nur Positives halten, die

  • eine lokal maximale Punktzahl sind (größer als seine Nachbarn) ->local
  • sind stark genug ->powerful

Sie Schwelle auf 0 gesetzt könnte und stellen Sie es, bis Sie befriedigende Ergebnisse zu erhalten. Oder Sie können es mit Ihrem Trainingssatz automatisch kalibrieren.

+0

Große Antwort, aber ich habe noch ein paar Fragen, wenn Sie oder jemand anderes nichts dagegen hat. Wie verwende ich es zusammen mit dem Skalenraum? Behandle ich erkannte Fenster in einem anderen Maßstab als nur einen anderen Nachbarn? Und wie kommt die nicht-maximale Unterdrückung ins Spiel? Trotzdem, vielen Dank für Ihre klare Antwort. –

+2

Gute Frage zu Waagen! Sie könnten in der Tat die Skalierung in der Nachbarschaft einbeziehen (links/rechts/oben/unten/kleiner/größer), aber es hängt stark von Ihren Daten und Ihrem Endziel ab - erhalten Sie viele Multi-Scale-False-Positives? Leider ist Trial-and-Error die beste praktische Methode in der Computer Vision. Über nichtmaximale Unterdrückung, nun, was ich beschrieben habe, ist eine Form der nicht-maximalen Unterdrückung (Sie behalten nur lokale Maxima). – Antoine