Ich versuche, einen Auto-Detektor von UAV-Bildern mit Python 2.7 und OpenCV 2.4.13 zu tun. Das Ziel besteht darin, Autos in einer beliebigen Richtung in einer städtischen Umgebung zu erkennen. Ich habe Probleme mit der Zeitausführung und Genauigkeit.Verbesserung der LBP/HAAR-Erkennung XML-Kaskaden
Detector funktioniert gut, wenn ich es mit einigen Kaskaden verwenden, die ich aus dem Internet erhalten:
- Banana Sichter (natürlich ist es nicht Autos erkennen, aber die Objekte erkennen, die es als Bananen erkennt): (coding- robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html)
- Gesichtserkennung Kaskaden von OpenCV (gleiches Verhalten wie Banane Klassifikator)
Für den Nachweis selbst, Ich verwende detectMultiScale()
mit scaleFactor = 1.1-1.2
und minNeighbors=3
Die Erkennung wird in einer angemessenen Zeit (ein paar Sekunden) in einem 4000 x 3000 px Bild durchgeführt.
Die Probleme entstehen, wenn ich versuche, meine eigenen trainierten Klassifikatoren zu verwenden. Die Ergebnisse sind schlecht und es dauert sehr lange, um die Erkennung durchzuführen (mehr als eine halbe Stunde).
Für das Training extrahierte ich sowohl positive als auch negative Bilder von einem großen Orthomosaik (das ich ein paar Mal herunterskalierte), die einen Parkplatz hat viel mit vielen Autos. Ich habe insgesamt 50 Autos (25x55 Pixel) extrahiert, die ich dann horizontal reflektierte, was zu 100 positiven Bildern führte, und 2119 negative Bilder (60x60 Pixel) aus demselben Orthomosaik. Ich nenne dieses Set den "kompletten Satz" von Bildern. Von diesem Satz, habe ich eine Teilmenge (4 Positive und Negative 35), die ich die "Dummy-Set" nennen:
Für das Training, ich opencv_createsamples
und opencv_traincascade
verwendet. Ich habe 6000 Proben aus den 100 positiven Bildern, die Autos von 0 bis 360 Grad drehen:
perl bin/createsamples.pl positives.txt negatives.txt samples 6000 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 -maxzangle 6.28 -maxidev 40 -w 60 -h 60"
So, jetzt habe ich 6000 60x60 Pixel Beispielbilder von Autos in jede Richtung über zufällige Hintergründe.
Dann ausgeführt ich mergevec.py
die samples.vec
-Datei zu erstellen und die Ausbildung Anwendung opencv_traincascade
laufen:
python mergevec.py -v samples/ -o samples.vec
opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 3700 -numNeg 2119 -w 60 -h 60 -mode ALL -precalcValBufSize 3096 -precalcIdxBufSize 3096
Mit dieser Methode habe ich vier Klassifizierer trainiert, zwei den kompletten Satz verwendet wird, und die anderen beiden mit der Dummy-Set, ein LBP und ein HAAR für jeden Satz. Die Ergebnisse, die ich bekomme, sind die folgenden:
- Dummy-Set, LBP: Training in 1 Phase gestoppt. Schnelle Erkennung, keine Objekte erkannt
- Dummy-Set, HAAR: Training in 1 Phase gestoppt. Die Erkennung dauert ewig (oder mindestens mehr als eine halbe Stunde). Ich habe den Prozess unterbrochen, weil es offensichtlich nicht funktioniert.
- Komplettes Set, LBP: Training gestoppt in 6 Stufen. Sehr langsame Erkennung (1-2 Minuten in einem 500x400 Pixel großen Bild mit scaleFactor = 2). Ermitteln Sie eine sehr kleine Anzahl von Objekten (2), keine Autos, wenn mindestens 10 Autos im Bild sind, und auch das gleiche Bild für das Training.
- Komplettes Set, HAAR: Ich habe in der 4. Stufe mit dem Training aufgehört, um es zu testen. Gleiches Verhalten wie beim Dummy-Set.
Was mache ich falsch? Da die Banane und die Gesichtskaskaden in einer vernünftigen Zeit funktionieren und Objekte erkennen, liegt das Problem offensichtlich in meinen Kaskaden, aber ich kann es nicht herausfinden warum.
Ich schätze Ihre Hilfe sehr. Danke im Voraus, Federico
Update: Ich habe einen Zwischensatz mit HAAR-Funktionen trainiert. Es funktioniert sehr langsam und es erkennt nichts außer einem Objekt in der Mitte des Bildes, unabhängig von dem Bild, das ich verwende. Anscheinend hat die Kaskade kein Feature gelernt :( – Federico