Red-eye detection
-
Ich komme einfach nicht weiter über Hough und Edge Detection.
Ich nutze im Moment OpenCV und dachte mir nun, ich baue mir ein eigenes Testset für HaarDetection auf.
Denn die eingebaute Facedetection funktioniert leider immer nur, wenn das Gesicht nicht von der Seite zu sehen ist, in meinem Fall brauche ich aber wirklich zuverlässige Erkennung. Also dachte ich mir ich baue eine Datenbank aus Augen auf, von vorne, schräg, von der Seite usw. Nur bin ich mir noch nicht ganz darüber klar, welche Referenzen ich nehmen soll.
Rote Augen als positive Templates und normale als negative oder einfach nur Augen als positive Templates und alles andere (Bäume, Landschaften usw) als negative Templates?
Was meint ihr? Gleich auf rote Augen trainieren oder nur Augen und dann mit einer anderen Funktion gucken, ob die Pupille rot ist?
-
Für sowas gibt's keine allgemeingültige Regel. Da mußt Du einfach ausprobieren was besser funktioniert.
-
Ist es sinnvoller Bilder mit Augen so zu zuschneiden, das nur das Gesicht darauf ist oder macht das keinen Unterschied? Wie bekomme ich am Besten die Bounding-Boxes? Muss ich jedes mal ein Bildbearbeitungsprogramm aufrufen, um die Koordinaten zu finden? Das wird ja eine sch***s Arbeit
Habe bis jetzt 2800 Bilder mit Gesichtern und 1000 normale Hintergründe.
-
Um so kleiner Deine Bilder sind, umso schneller kannst Du Sachen testen... andererseits sind auf den Bildern vielleicht noch andere Dinge drauf, die eben nicht erkannt werden sollen. Wenn Du die abschneidest kannst du schlecht kontrollieren, ob dein algorithmus die vielleicht fälschlicherweise erkennt.
Was dieses Koordinaten-Zeug angeht: Schreib Dir dafür doch ein kleines Tool, mit dem man in Bildern Rechtecke markieren kann. Die legst Du für Bild.jpg einfach in Bild.txt ab. Dann noch nen Weiter- und nen Zurückknopf mit dem Du durch die Bilder im aktuellen Verzeichnis durchschalten kannst und schon kannst Du wesentlich effizienter arbeiten. Klar, 1000 Bilder anschaun ist schon aufwendig. Aber ein paar Daten sollte man schon haben. Mach halt immer mal 100 oder so.
-
Für Windows scheint es das Tool objectmarker zu geben, aber ich nutze Linux und da ist es im OpenCV-Paket nicht dabei, damn. Naja mal schauen.
Macht es Sinn die Bilder zu skalieren oder kann es dann sein das er anders lernt als wenn ich alle Bilder auf 3008x2000px lasse?
-
Das kommt auf's verfahren an. Benutzt Du immer noch template-matching? Da kommt es auf die Größe wohl nicht zu sehr an. Und template-matching ist für große Bilder extrem langsam. Insofern sind kleine Bilder da nicht schlecht. Andererseits schadet es nicht die großen Bilder zu labeln. Das Labeling der kleinen Bilder lässt sich daraus ja berechnen. Allerdings scheint mir 3000x2000px doch sehr übertrieben. 640x480 sollte eigentlich auch noch locker reichen, wenn die Objekte die Du erkennen willst nicht gerade sehr klein sind.
-
Dann werde ich die Bilder mal alle ein wenig skalieren. Ich bin nur noch die ganze Zeit am Überlegen ob ich auch auf rote Augen trainieren soll. Nachher erkennt der Augen nicht die rot sind, also wäre es wohl besser auf normale und rote Augen zu trainieren.
-
Sonst such doch erstmal Augen in Grauwertbildern (ist auch nochmal ne Ecke schneller) und prüf anschließend ob sie rot sind.
-
Ja stimmt gute Idee.
-
Ich habe jetzt erst einmal 500 Bilder zusammengesucht, wo Augen drauf sind.
Ich habe alle Bilder auf 640x480 skaliert und als Graustufenbild gespeichert.
Jetzt habe ich 2 Fragen:1. Muss ich die negatives nun auch alle als Graustufenbild anbieten (wahrscheinlich schon)?
2. Hier mal zwei Beispiele:
http://img401.imageshack.us/img401/5341/frame12kj7.jpg
http://img514.imageshack.us/img514/7231/frame124nd8.jpgSind bei dem zweiten Bild die Augen zu klein? Sollte ich es lieber ausschneiden und vergrößern? Oder geht das in Ordnung? Die meisten Bilder, die ich besitze, sind eher wie das zweite.
-
Ich würde ein 2-stufiges Verfahren versuchen:
1. Schritt: mögliche Augen finden (region of interest suchen)
2. Schritt: region of interest ausschneiden, auf eine standardgröße skalieren (so 20x20 Pixel) und darauf einen Klassifikator verwenden.
Konkret: Schritt 1 mit Hough bzw. Fast radial symmetry oä. Kreise finden (oder auch mit nem template, wird aber schwieriger, wenn die kreise verschieden groß sein können). Dann ne bounding-box drum und kleinskalieren.
Schritt 2 würde ich dann mit nem Verfahren versuchen, das aus Beispielen lernen kann (positive und negative). Etwa ne Support-Vektor-Maschine oder ein neuronales Netz. Da gibt's ja jede Menge fertige Implementierungen. Das hat den Vorteil, dass Du das System verfeinern kannst, indem Du Beispiele die es falsch bewertet als Trainingsdaten hinzufügst.
Außerdem kann man mit der Zweiteilung des Verfahrens recht gut rausfinden wo's klemmt, wenn's nicht so gut läuft wie's soll.
-
Wenn Du Lust hast kannste auch mal ins IRC kommen um drüber zu quatschen. #cpp auf euirc.