Wie finden Sie diesen Artikel? Helfen Sie uns, bessere Inhalte für Sie bereitzustellen.
Vielen Dank! Ihr Feedback ist eingegangen.
There was a problem submitting your feedback, please try again later.
Was denken Sie über diesen Artikel?
Einrichten eines Nvidia Jetson Nano und Experimentieren mit maschinellem Lernen, um eine Person zu erschaffen, die dem Roboter-Trolley folgt.
Einführung
Maschinelles Lernen und KI sind in der Tech-Branche derzeit der letzte Schrei. Es mag jedoch zunächst so aussehen, als ob die Hürde für den Eintritt in die Welt der KI hoch ist, aber in der Tat kann es genau das Gegenteil sein.
In diesem Projekt wollen wir einen Trolley bauen, der einer Person folgen kann – denken Sie an etwas wie einen Garten-Trolley, jedoch motorisiert und mit einem Computer-Vision-System, das eine Person identifizieren und diese nachverfolgen kann. Wir verwenden Jetson Nano, da es sich um eine Plattform handelt, die gut für integrierte Computervision und maschinelles Lernen geeignet ist, mit einer Nvidia Maxwell GPU und einem Quad-Core ARM-Prozessor.
Einstieg
Das erste, was wir taten, war das Jetson Nano-Entwicklerkit (199-9831) , das das an einer Trägerplatine befestigte Jetson Nano-Modul umfasst. Es wurden ein M.2-Steckplatz für die Speicherung, zwei MIPI-CSI-Stiftleisten für Kameras, eine 4K-fähige HDMI- und DisplayPort-Buchse, 4 x USB3-Anschlüsse, eine Raspberry Pi-kompatible GPIO-Stiftleiste, Ethernet sowie zwei Netzanschlüsse für Flexibilität ausgepackt – reichlich Ein- und Ausgänge für die meisten Anwendungen und das, was Sie typischerweise auf einem Single-Board-Computer erwarten würden.
Ein 5-V-Netzteil wird benötigt, um die Platine zu versorgen und die volle Leistung zu erzielen. Wir haben ein 4-A-fähiges Netzteil (144-0968) ausgewählt, um genügend Stirnraum zu bieten. Eine Raspberry Pi-Kamera v2 oder eine USB-Webcam ist ebenfalls erforderlich, um einen Live-Video-Stream aufnehmen zu können.
Um den Einstieg zu erleichtern, hat Nvidia eine klare Anleitung zur Verfügung gestellt, die die Schritte für den Einstieg detailliert beschreibt. Wir sind leicht von der Anleitung abgewichen und haben den Hinweis befolgt, das Netzteil auf den Klinkeneingang umzuschalten. Dies wird im Benutzerhandbuch für das Jetson Developer-Kit detailliert beschrieben. Es besteht aus einem beweglichen Jumper J48 (direkt neben dem Zylinder-Jack), um die beiden Stifte zu verbinden.
Mit dem neu konfigurierten Netzteil kann die SD-Karte mit dem von Nvidia bereitgestellten Bild geschrieben werden. Dies ist ein ziemlich großes ZIP-Archiv (6 GB), das dann auf 16 GB entpackt wird, sodass Sie sicher sein müssen, dass Sie genug Speicherplatz dafür zur Verfügung haben! Die Datei kann dann mithilfe eines Tools wie Balena Etcher oder Win32DiskImager auf eine SD-Karte geschrieben werden, ein Prozess, der jedem bekannt sein sollte, der zuvor einen Raspberry Pi oder einen anderen SBC verwendet hat.
Der Rest der Einrichtung bestand darin, ein paar Optionen auszuwählen – die Standardwerte sind eine gute Wahl – und dann das System mit "sudo apt update && sudo apt upgrade" zu aktualisieren.
Ein Beispiel
Nvidia has provided a range of examples tailored to running on the Jetson Nano, including a short course titled “Two Days to a Demo” which walks through setting up the environment, running some short examples and then building upon knowledge gained from the short examples to run more complex examples.
Nvidia hat eine Reihe von Beispielen zur Verfügung gestellt, die auf den Betrieb auf dem Jetson Nano zugeschnitten sind, einschließlich eines kurzen Kurses mit dem Titel „Zwei Tage zu einer Demo“, der die Einrichtung der Umgebung durchläuft, einige kurze Beispiele ausführt und dann auf den aus den kurzen Beispielen gewonnenen Kenntnissen aufbaut, um komplexere Beispiele auszuführen.
Es gibt auch die Jetson Community-Projects, die eine breitere Palette von Projekten bieten, von einfachen bis hin zu komplexeren Projekten wie z. B. der Echtzeit-Verkehrskegelerkennung.
Um unsere Einrichtung zu überprüfen, haben wir den Beispielsatz „Hello AI World“ verwendet, der die Deep-Learning-Objekt-Ableitung demonstriert. Um loszulegen, wurden die im GitHub-Repository unter „Building the Project from Source“ aufgeführten Schritte durchgeführt, die das Repository und alle erforderlichen Voraussetzungen klonen und dann alle Beispiele erstellen.
Dies dauert einige Zeit, da Modelle heruntergeladen und dann viele Codes kompiliert werden müssen. Standardmäßig sind nicht alle Bilderkennungsmodelle ausgewählt, aber wenn Sie später Ihre Meinung ändern, kann das Skript "download-models.sh" erneut ausgeführt werden, wodurch die Modelle geändert werden können.
Nachdem alles kompiliert und installiert war, führten wir ein Beispiel durch, das eine in das Entwicklungskit integrierte Pi-Kamera verwendet. Der erste Betrieb einer beliebigen Anwendung mit einem Modell, das zuvor nicht verwendet wurde, nahm einige Zeit in Anspruch, da die Netzwerkdatei des Modells optimiert wird, die dann auf der Festplatte zwischengespeichert wird, um zukünftige Ladezeiten zu beschleunigen.
Da diese Demonstration funktioniert hat, haben wir darüber nachgedacht, wie wir die Personenverfolgung erreichen könnten, ohne irgendeine Art von Gesichtserkennung zu verwenden.
Personen-Tracking
Objektverfolgung und -identifikation ist ein gut gelöstes Problem, das bereits in der Industrie in maschinellen Vision-Anwendungen weit verbreitet ist, z. B. bei Robotern auf Produktionslinien, die Gegenstände bewegen müssen, oder bei der Ablehnung von Gegenständen, die auf einem Förderband herabsteigen. Dies kann mit Etiketten erfolgen, die an den Gegenständen angebracht sind, insbesondere im Falle der Bewegungsverfolgung eines Artikels – das Problem, das wir angehen, sollte jedoch nicht dazu führen, dass der Benutzer ein Etikett tragen muss und in der Lage sein sollte, nur zu identifizieren, was er trägt.
Die Gesichtserkennung funktioniert, da sie eine Person identifiziert und verfolgt. Jedoch auch in dieser Situation würde sie nicht funktionieren, da der Trolley einer Person folgt, sodass ihr Gesicht nicht sichtbar ist. Dies schränkte uns einigermaßen ein, welche Methoden zur Verfügung stehen, um unser Ziel zu erreichen.
Einige umsichtige Suchen lieferten den Begriff „person re-identification“, der von ScienceDirect als „das Problem der Erkennung einer Person beschrieben wird, die zu verschiedenen Zeiten und/oder Orten über mehrere nicht überschneidende Kameraansichten erfasst wurde“. Dies ist näher an dem Problem, das wir zu lösen versuchen (Personenidentifikation), aber wiederum anders – wir haben nur einen Kamerawinkel und keine unterschiedlichen Zeiten.
Yolo v4 + DeepSORT
Objektverfolgung ist die nächste Annäherung an die Methode, die wir zu lösen versuchen. Mit einer weiteren liberalen Anwendung von Google-fu haben wir diesen Artikel gefunden, der "DeepSORT" zum Nachverfolgen von Objekten verwendet. Dies schien in die richtige Richtung zu gehen. Anhand von weiteren Recherchen fanden wir ein GitHub-Repository, das geeignet schien – in einem der Beispielvideos wird gezeigt, dass Personen identifiziert und verfolgt werden, während sie sich durch die Szene bewegen.
Das Beispiel zeigt auch, dass eine Box um die Menschen herum gezogen wird, was uns nahe gebracht hat, dass wir dann eine bestimmte Person mitten in der Szene zentrieren können, indem wir den Roboter bewegen.
Die Dokumentation im Repository sah auch gut aus, sodass wir uns entschieden haben, es auszuprobieren. Leider scheint es, als würde dieses spezielle Programm nicht funktionieren – der Jetson Nano konnte das große „YOLOv4“-Modell nicht bewältigen, schaffte es aber, das „YOLOv4-tiny“-Modell zu verarbeiten und wurde dann gedrosselt, als er versuchte, das eigentliche Objekterkennungsskript auszuführen. Dies ist möglicherweise nicht der Fall mit einem leistungsfähigeren Jetson SoM oder natürlich einem PC, der mit einer PCIe Nvidia GPU ausgestattet ist.
FastMOT
Als nächstes haben wir ein anderes Programm aus diesem GitHub-Repository ausprobiert, das ein „YOLOv4“-Modell verwendet. Auch hier war die Dokumentation klar mit einem Skript für den Einstieg.
Nachdem das GitHub-Repository geklont war, konnten wir mit der Installation beginnen. Es gibt ein Setup-Skript unter "scripts/install_jetson.sh", mit dem wir begonnen haben. Das sah vielversprechend aus, bis der Punkt der Installation von PyCuda erreicht wurde, der mit einer fehlenden Stiftleiste fehlschlug. Wiederum führte uns die Online-Suche zu diesem Nvidia-Forum-Thread, in dem ein anderes GitHub-Repository verlinkt wurde, das ein Skript speziell zur Installation von PyCuda enthielt.
Nachdem PyCuda nun erfolgreich installiert wurde, haben wir das ursprüngliche Installationsskript neu gestartet, das sich weiterentwickelt hat, bis der Versuch, eine andere Abhängigkeit zu installieren, unterbrochen wurde. Dies wurde durch eine fehlende Stiftleisten-Datei mit dem Namen "xlocale.h" verursacht. Erneut wurde die Lösung durch eine weitere Suche behoben. Die akzeptierte Antwort aus diesem Stackoverflow-Post funktionierte und bestand darin, den Befehl "ln -s /usr/include/locale.h /usr/include/xlocale.h" auszuführen, um einen symbolischen Link zur neuen "locale.h"-Stiftleiste zu erstellen.
Mit dem symbolischen Link haben wir das ursprüngliche Skript "install_jetson.sh" ausgeführt, um es erneut zu versuchen. Diesmal wurden alle Abhängigkeiten installiert und viel Zeit mit der Kompilierung von LLVM verbracht. Das dauert auf dem Jetson Nano ein paar Stunden. Es lohnt sich also, das Programm zu verlassen und sich etwas anderes zu suchen, um Ihre Zeit zu füllen.
Nachdem nun alles installiert war, haben wir die notwendigen Modelle heruntergeladen, die so einfach waren wie die Ausführung von "./scripts/download_models.sh" – oder so dachten wir. Das Skript installiert eine Python-Bibliothek namens "gdown", die das Herunterladen großer Dateien von Google Drive handhabt. Diese sollte als ausführbare Datei in der Shell angezeigt werden. Dies war jedoch leider nicht so. Wenn Sie weiter suchen, finden Sie den Pfad, in dem die von pip heruntergeladenen ausführbaren Dateien gespeichert werden, und zwar in "/home/jetson/.local/bin/" befand.
Mit dem jetzt modifizierten Skript (jede Instanz von "gdown", die als ausführbares Programm verwendet wurde, wurde durch "/home/jetson/.local/bin/gdown" ersetzt) wurden alle Modelle heruntergeladen. Anschließend erfolgt eine weitere Kompilierung, um das TensorRT-Plugin gemäß der Dokumentation im Repository zu erstellen, und dann ist das Programm bereit zur Ausführung.
Wir haben das Programm mit dem Befehl "python3 app.py --input_uri csi://0 --mot --gui" aus der Desktop-Umgebung gestartet. Dies dauerte einige Zeit, da alle ~700 MB der Modelle kompiliert wurden. Dies hat zunächst nicht funktioniert – aber eine Lösung ist bereits hier auf dem GitHub-Ereignis-Tracker des Projekts dokumentiert. Durch die Änderung einer Zeile über zwei Dateien „yolo.py“ und „reid.py“ von „1 <<30“ auf „1 <<28“ wurde das Problem behoben.
Das erneute Ausführen des anfänglichen Befehls zum Starten des Programms dauerte etwas länger (die Kompilierung wurde zuvor unterbrochen) und schließlich wurde ein Fenster eingeblendet! Dies war ein gutes Zeichen, da ein Kamera-Feed angezeigt wurde. Wir gingen dann in das Sichtfeld der Kamera und bekamen eine Box und eine Nummer angezeigt. Dies war ein Erfolg und zeigte, dass das Netzwerk in der Lage ist, Personen zu erkennen und zu verfolgen, die sich bewegen. Die Leistung war nicht überragend, aber dies ist zu erwarten, da die Dokumentation einen Jetson TX2/Xavier/Xavier NX spezifiziert, während der Jetson Nano weniger Verarbeitungsleistung zur Verfügung hat.
Jetzt, da wir eine funktionierende Tracking-Lösung erzielt haben, können wir dann mit der Arbeit beginnen, den Code zu den Ausgangskoordinaten zu ändern, die dann verwendet werden können, um die Roboter-Elektronik zu steuern. Dies sollte nicht zu schwierig sein, da der Beispielcode bereits Kästen um die verfolgten Gegenstände zieht.
Fazit
In diesem Beitrag haben wir uns mit dem Einstieg mit dem Nvidia Jetson Nano beschäftigt, uns eine Vielzahl von verschiedenen Methoden zur Nachverfolgung einer Person in einem Rahmen angeschaut und einen auf FastMOT basierenden Personen-Tracker erfolgreich in Betrieb genommen. In Teil 2 betrachten wir den Aufbau des Rahmens für den Roboter.
Kommentare