Autonomes Fahren auf dem Bürgersteig mit OpenCV und Tensorflow

Die Schaffung autonomer Autos ist mittlerweile ein beliebtes Thema, und hier auf Amateurebene passieren viele interessante Dinge.

Der älteste und bekannteste Kurs war ein Online-Abschluss von Udacity .

In autonomen Maschinen gibt es also einen sehr modischen Ansatz - das Klonen von Verhalten, dessen Kern darin besteht, dass der Computer lernt, sich wie eine Person (am Steuer) zu verhalten, wobei er sich nur auf aufgezeichnete Eingabe- und Ausgabedaten stützt. Grob gesagt gibt es eine Basis von Bildern von der Kamera und den entsprechenden Lenkwinkel.

Nachdem wir ein neuronales Netzwerk auf diese Daten trainiert haben, können wir es theoretisch eine Maschine antreiben lassen.
Dieser Ansatz basiert auf einem Artikel von Nvidia .

Es gibt viele Implementierungen, die hauptsächlich von Udacity-Studenten durchgeführt werden:


Noch interessanter ist die Anwendung in realen Projekten. Zum Beispiel wird das Donkey Car von einem speziell trainierten neuronalen Netzwerk gesteuert.

Eine solch gesättigte Infosphäre treibt die Aktion direkt voran, zumal mein Robotertank seit dem letzten Artikel eine Sackgasse in seiner Entwicklung erreicht hat und dringend neue Ideen brauchte. Es gab einen kühnen Traum - mit seinem Panzer im Park spazieren zu gehen, was im Allgemeinen nicht schlimmer ist als ein Haushund. Der Punkt ist klein - um dem Panzer beizubringen, auf dem Bürgersteig im Park zu fahren.

Was ist ein Bürgersteig in Bezug auf einen Computer?

Einige Bereiche im Bild unterscheiden sich farblich von anderen Bereichen.

So kam es, dass sich in den für mich zugänglichen Parks der Bürgersteig als das graueste Objekt auf dem Bild herausstellte.

(Die graueste bezieht sich auf die minimale Differenz zwischen den RGB-Werten). Dies ist eine graue Eigenschaft und wird für die Erkennung von Gehwegen von entscheidender Bedeutung sein.

Ein weiterer wichtiger Parameter von Grau ist die Helligkeit. Herbstfotos bestehen etwas weniger als vollständig aus Grau, so dass die Unterschiede zwischen Straße und Bordstein nur in Schattierungen bestehen.

Panzer in einem Park

Einige der naheliegendsten Ansätze sind die Vorkalibrierung - positionieren Sie den Roboter so, dass die Straße den größten Teil des Bildschirms einnimmt und

  • durchschnittliche Helligkeit nehmen (im HSV-Format)
  • oder ein durchschnittliches RGB-Stück, das garantiert aus Straße besteht (in diesem Fall ist es die untere linke Ecke).

Nachdem wir solche Kriterien für die Erkennung des Bürgersteigs festgelegt haben, laufen wir durch das Bild und erhalten eine Form der Straße.


Der nächste Schritt besteht darin, den grellen Punkt in Aktion zu versetzen - gehen Sie geradeaus oder biegen Sie rechts oder links ab.

Wir fahren geradeaus, wenn die rechte Kante sichtbar ist und der Winkel weniger als 45 Grad zur Vertikalen beträgt.

Wir biegen nach links ab, wenn der rechte Rand sichtbar ist und der Winkel von der Vertikalen nach unten abweicht.
Biegen Sie rechts ab, wenn wir den rechten Rand nicht sehen.

Der rechte Rand des grellen Flecks - die Verwendung von Geometrie zur Lösung dieses Problems ist ziemlich freudlos. Besser, wenn der künstliche Verstand nach Neigungsmustern in diesen Fetzen sucht.

Hier kommen die neuronalen Netze zur Rettung.

Originalbilder werden ausgewaschen, zusammengedrückt und beschnitten, wir erkennen den grauen Bürgersteig und erhalten Schwarz-Weiß-Masken 64x64.

Wir zerlegen diese Masken in drei Gruppen - Links, Rechts, Gerade und trainieren den Klassifikator für das neuronale Netzwerk darauf.

Das Sammeln und Aufbereiten von Daten ist eine mühsame Aufgabe, die einige Monate gedauert hat.

Hier sind Beispielmasken:

Links:


Rechts:


Gerade:


Um mit einem neuronalen Netzwerk zu arbeiten, habe ich Keras + Tensorflow verwendet.

Anfangs gab es die Idee, die Struktur des neuronalen Netzwerks von Nvidia zu übernehmen, aber offensichtlich ist es für mehrere andere Aufgaben ausgelegt und kommt mit der Klassifizierung nicht sehr gut zurecht. Als Ergebnis stellte sich heraus, dass das einfachste neuronale Netzwerk aus einem Tutorial zur Klassifizierung mehrerer Kategorien durchaus akzeptable Ergebnisse liefert.

model = Sequential() activation = "relu" model.add(Conv2D(20, 5, padding="same", input_shape=input_shape)) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, 5, padding="same")) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500)) model.add(Activation(activation)) model.add(Dense(cls_n)) opt = SGD(lr=0.01) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 

Nachdem ich die erste Version des Netzwerks trainiert hatte, stieß ich auf dessen Inkompatibilität mit dem Raspberry Pi. Vorher habe ich Tensorflow Version 1.1 verwendet und Schamanismus verwendet, der von einer sehr klugen Person gesammelt wurde.

Leider ist diese Version veraltet und konnte keine Modelle von Keras lesen.

Vor kurzem sind Google-Leute jedoch endlich heruntergekommen und haben TF unter dem Raspberry Pi gesammelt, allerdings unter der neuen Version von Raspbian - Stretch. Stretch war gut für alle, aber vor einem Jahr hatte ich kein OpenCV dafür, also ging der Tank an Jessie.

Jetzt musste ich unter dem Druck der Veränderung zu Stretch wechseln. Tensorflow stand problemlos auf (obwohl es mehrere Stunden dauerte). OpenCV stand auch ein Jahr lang nicht still und Version 4.0 wurde bereits veröffentlicht. Also schaffte sie es, es unter Stretch zu sammeln, so dass es keine Hindernisse für die Migration gab.

Es gab Zweifel, wie Raspberry ein Monster wie Tensorflow in Echtzeit ziehen würde, aber alles stellte sich als allgemein akzeptabel heraus - trotz der anfänglichen Belastung des Netzwerks für einige Sekunden kann die Klassifizierung selbst mehrmals pro Sekunde ohne signifikanten Speicher- und CPU-Verbrauch funktionieren.

Infolgedessen treten die meisten Probleme und Fehler genau in der Phase der Erkennung der Straße auf.
Das neuronale Netzwerk fehlt trotz der Einfachheit der Struktur sehr selten.

Mit aktualisierter Firmware schneidet der Tank durch den Park.

Aufgrund der erlittenen Verletzungen bläst der Roboter ständig nach rechts, so dass er ohne künstliche Intelligenz schnell zum Rasen aufbricht.


Sie können ihn jetzt morgens begleiten und entgegenkommende Hunde erkennen.

Referenzen:

Source: https://habr.com/ru/post/de439928/


All Articles