2016-09-02 3 views
3

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:

Positive image example 1

Negative image example 1

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:

  1. Dummy-Set, LBP: Training in 1 Phase gestoppt. Schnelle Erkennung, keine Objekte erkannt
  2. 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.
  3. 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.
  4. 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

+0

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

Antwort

0

Ich kann nicht genau sagen, aber ich habe eine Idee, warum Sie keine HAAR (LBP) Kaskaden trainieren können, um beliebig orientierte Autos zu erkennen.

Diese Kaskaden funktionieren gut, wenn erkannte Objekte mit ungefähr der gleichen Form und Farbe (Helligkeit) erkannt werden. Ein frontal orientiertes Gesicht ist ein gutes Beispiel für diese Objekte. Aber es funktioniert viel schlimmer, wenn das Gesicht eine andere Ausrichtung und Farbe hat (es ist kein Witz, Standard-Haar-Kaskaden von OpenCV haben Probleme mit der Erkennung eines Mannes mit dunkler Haut). Obwohl diese Probleme das Ergebnis eines Trainingssatzes sind, der nur die Gesichter frontal orientierter Europäer enthält. Aber wenn wir versuchen, zu Übungsflächen mit allen Farben und räumlichen Orientierungen zu kommen, stehen wir vor denselben Problemen wie Sie.

Während des Trainingsprozesses versucht der Trainingsalgorithmus in jeder Phase den Satz von Merkmalen (HAAR oder LBP) zu finden, der negative und positive Proben trennt. Wenn das erkannte Objekt eine komplizierte und variable Form hat, ist die Anzahl der erforderlichen Merkmale sehr groß. Die große Anzahl der erforderlichen Funktionen führt dazu, dass der Kaskadensichter sehr langsam arbeitet oder überhaupt nicht trainieren kann.

Damit HAAR (LBP) Kaskaden nicht für die Erkennung von Objekten mit variabler Form verwendet werden können. Aber Sie können auf Deep Convolution Neuronale Netze schauen. Sie können diese Probleme lösen, wie ich weiß.

+0

Hi Ermlg. Ich habe es schließlich herausgefunden, um eine Kaskade zu trainieren, die funktioniert. Es scheint, dass die Fenster Trainingsgröße kleiner sein muss als die Größe der negativen Bilder. Ich denke, das ist wegen des opencv trainingsalgorithmus, der positive bilder in die negativen überlagert, um die robustheit zu erhöhen, aber ich bin mir nicht sicher.vorerst funktioniert es nur für autos in vertikaler position, aber jetzt versuche ich die kaskade mit gedrehten versionen zu trainieren positive Proben, ich werde mit den Updates posten. Vielen Dank. – Federico

Verwandte Themen