Ich möchte Fahrzeuge (Autos, Motorräder usw.) aus einem statischen Bild erkennen. Ich dachte daran, SURF zu verwenden, um mir nützliche Schlüsselpunkte und Deskriptoren zu geben und dann ein MLP (Multi Layer Perceptron) Neuronales Netzwerk zu trainieren. Ich weiß jedoch nicht, was die Eingabe in das Neuronale Netzwerk sein wird und was es ausgegeben wird, damit ich feststellen kann, in welchem Teil des Bildes sich ein Fahrzeug befindet (wahrscheinlich ein Rechteck, das um es herum gezeichnet ist). Ich weiß, dass SURF nützliche Keypoints im Bild zusammen mit ihren Deskriptoren zurückgeben kann (ich habe dies getan). Die Schlüsselpunkte haben Winkel und jeder Schlüsselpunkt entspricht einem 64 oder 128 langen Vektor als Deskriptor. Was ich nicht weiß ist, was genau diese Schlüsselpunkte sind und wie sie als Input für das Neuronale Netzwerk verwendet werden könnten.
Ich verwende OpenCV mit Python .
Ich bin neu in der Verwendung von SURF und anderen Feature Extraction Methoden. Jede diesbezügliche Hilfe wird sehr gut sein.
Wenn Sie surf features verwenden, das bedeutet einen float set off vector [128] oder [64], abhängig von der Surfkonfiguration, wird das neurale Netz wie folgt eingestellt:
- Erstellen Sie eine Datenbank mit Modellen:
%Vor%- Nehmen Sie diferences Fotos von jeder Art von Objekten wie 10 Fotos von Diferences Modell aus Autos, 10 Fotos von Diferents Modell Off-Bikes 10 Fotos von differents Modell off LKW ... usw., um jedes Foto von jeder Objektklasse seine Surf zu extrahieren Feature-Vektoren.
- Jeder Objekttyp repräsentiert eine Objektklasse im neuronalen Netz wie diese;
%Vor%- Jedes Bit in der binären Repeentation entspricht einem Neuron in der Ausgabeschicht des Netzwerks und repräsentiert eine Klasse von zu erkennenden Objekten
Nun wird die Konfiguration des neuronalen Netzwerks auf der Größe des Merkmalsvektors und der Anzahl der Objekttypen basieren, die Sie auf diese Weise erkennen wollen;
Die Anzahl der Nuerons in der Eingabeebene, 64 oder 128, abhängig von der Größe des Surf-Feature-Vektors, den Sie konfiguriert und verwendet haben
Die Anzahl der nuerons in der Ausgabe-Schicht im neuronalen Netz ist die Anzahl der Klassen von Objekten, die Sie in diesem Beispiel 4 erkennen möchten
Die Aktivierungsfunktion, die für jedes Neuron notwendig ist, ist die Sigmoid- oder Tanh-Funktion ( Ссылка ), da die Surf-Features durch Floats-Nummern repräsentiert werden Wenn Sie freak fetaures oder einen anderen binären lokalen Merkmalsdeskriptor (Brisk, ORB, BRief) verwenden, dann werden Sie eine binäre Aktivierungsfunktion für jedes Neuron verwenden, wie die Funktion o sigm der Schrittfunktion
Der Algorithmus, der zum Trainieren des Netzwerks verwendet wird, ist die Backpropagation
bevor Sie fortfahren, müssen Sie den Datensatz einstellen und vorbereiten, um das neurale Netzwerk zu trainieren
Beispiel
%Vor%In diesem Beispiel haben Sie 4 Neuronen in der Ausgangsschicht und 128 0R 64 Neuronen in der Eingangsschicht.
-Die Ausgabe des neuronalen Netzes im Erkennungsmodus ist das Neuron, das den höchsten Wert dieser 4 nuerons hat.
es ist notwendig, die Normalisierung in dem Intervall [0,1] zu allen Merkmalen in dem Datensatz vor Beginn der Trainingsphase zu verwenden, da die Ausgabe des neuronalen Netzes die Wahrscheinlichkeit ist, dass der Eingangsvektor zu eins gehört Klasse des Objekts im Datensatz.
Der Datensatz zum Trainieren des Netzwerks muss wie folgt aufgeteilt werden:
%Vor%Wenn das neuronale Netzwerk trainiert wird, ist das Stoppkriterium die Erkennungsrate, wenn es nahe bei 85-90% liegt
warum neural net und nicht svm Maschinen verwenden, Svm-Maschinen funktionieren gut, aber es kann nicht die beste Trennungsklasse Karte in keine lineare Klassifizierung Probleme wie dies oder wenn Sie viele verschiedene Objekte Klassen oder Arten von Objekten haben, Dieser Mangel ist in den Ergebnissen der Recognition-Phase besonders ausgeprägt.
Ich empfahl Ihnen, etwas über die neuronale Netzwerktheorie zu lesen, um zu verstehen, wie sie funktionieren.
opencv haben Machine Learning-Klasse für neuronale Netze mlp-Modul
hoffe das kann dir helfen
Mein Vorschlag ist, BOW statt neuronales Netzwerk zu beobachten. Sehen Sie hier ein Beispiel für die Verwendung von SURF mit Bag Of Words-Modell für die Objektklassifizierung ( erster Teil , zweiter Teil ). Um die Klassifizierungsleistung zu verbessern, könnten Sie versuchen, den Naive Bayes Classifier durch SVM zu ersetzen. Außerdem hat der Autor gute zur Verfügung gestellt Quellcodebeispiel . Ich denke, es ist ein guter Anfang.
Eine einfache Möglichkeit, das erkannte Objekt zu trennen, ist das Ausführen eines Konturdetektors im Eingabebild wie das .
Danach können Sie die x, y-Koordinaten der einzelnen Schlüsselpunkte mit jedem vom neuronalen Netzwerk erkannten Merkmalsvektor verknüpfen und prüfen, wie viele dieser Schlüsselpunkte sich in jeder Kontur jedes Objekts befinden,
Gleichzeitig können Sie eine Schwelle setzen, um eine korrekte Autoerkennung zu bestätigen, zum Beispiel, wenn Sie 2 Taxis haben, 2 Kontur gehören zu jedem Auto und affter überprüfen, wie viele Schlüssel ponits in jeder Kontur sind;
Sie können als Taxi 1 o Auto 1 als Objekt erkannt geben
Wenn Sie ein validate-Objekt und seine Kontur erkannt haben, können Sie die Bouding-Box berechnen, die das Objekt geschlossen hat
Eine andere Möglichkeit ist es, jedem Trainingsbild-Extrakt seine Konturen zu jedem Objekt zuzuordnen, seine Begrenzungsbox zu berechnen, diese wie ein reines Bild zu verwenden, um die Merkmale zu extrahieren und es zu einem Bild in einem Set zu machen.
Tags und Links python neural-network opencv image-processing surf