Ich wollte mit meinem Jetson Nano nicht nur ein Donkey Car steuern sondern ebenfalls auch das ein oder andere Neuronale Netz / Projekt ausprobieren. Dabei kommt man im Yolo nicht herum wenn es um die Objekterkennung geht. Daher erklärt die nachfolgende Anleitung wie Yolo auf dem Jetson Nano installiert werden kann. Die Projekt Seite von Yolo findet sich mit vielen Hilfreichen Tips unter der folgenden URL.
Yolov3 Homepage: https://pjreddie.com/darknet/yolo/
Um Yolov3 auf dem Jetson Nano zu installieren bitte erst einmal das nachfolgende Git Repository auf den Nano klonen.
Befehl: git clone https://github.com/pjreddie/darknet
Befehl: cd darknet
Makefile editieren
Das Makefile muss vor dem Ausführen des Befehls „make“ noch editiert werden. Ich verwende dazu immer den Texteditor nano im Terminal Fenster.
Befehl: nano Makefile
In den ersten drei Zeilen muss jeweils die 0 auf eine 1 geändert werden um die entsprechende Unterstützung der Hardware und Software des Jetson Nano verwenden zu können. Das nachfolgende Bild zeigt das von mir bereits editierte Makefile.
Ich hatte noch anfangs Probleme das ich nach dem starten des „make“ Befehls die Meldung „NVCC not found“ erhalten habe. Dieses Problem konnte dank dem folgenden Hinweis aus dem NVIDIA forum lösen. Daher müssen noch die beiden folgenden Befehle ausgeführt werden bevor der „make“ Befehl gestartet werden kann.
Befehl: export LD_LIBRARY_PATH=/usr/local/cuda/lib
Befehl: export PATH=$PATH:/usr/local/cuda/bin
Jetzt kann der „make“ Befehl ausgeführt werden und der Build-Prozess sollte ohne Fehler durchlaufen.
Befehl: make
Nach ca. 40 Minuten sollte der Build-Prozess erfolgreich durchgelaufen sein. Das folgende Bild zeigt die entsprechende Meldung die auf meinem Jetson Nano ausgegeben wurde.
Yolov3 Weights
Jetzt müssen noch die „Weight“ Dateien für die jeweilige Yolov3 Version herunter geladen werden. Die volle weiths Datei macht dem Nano schon etwas zu schaffen. So komme ich nur auf ca. 3,2 bis 4 FPS. Auch eine 12GB SWAP Datei auf der SSD Festplatte auf der ich alles installiert habe hat zu keiner Verbesserung der Framerate geführt.
Mit dem folgenden Befehl wird die volle weights Datei herunter geladen.
Befehl: wget https://pjreddie.com/media/files/yolov3.weights
Tiny YOLOv3 Weights
Neben der vollen weights Datei gibt es auch eine kleine die sogeannte tiny weights Datei. Diese kann nicht so viele Objekte erkennen aber die Framerate ist deutchlich höher.
Mit dem folgenden Befehl wird die kleine / tiny weights Datei herunter geladen.
Befehl: wget https://pjreddie.com/media/files/yolov3-tiny.weights
Yolo Konfiguration anpassen
Da der Jetson Nano doch eine ziemlich schmale Hardware Umgebung ist muss die yolov3-Konfiguration noch angepasst werden. Dazu bitte die yolov3.cfg Datei öffnen. Mit dem Text-Editor Nano und dem nachfolgenden Befehl sollte das klappen.
Befehl: nano /darknet/cfg/yolov3.cfg
In der yolov3.cfg Datei müssen die ersten vier Zeilen wie nachfolgend gezeigt angepasst werden.
batch=1
subdivisions=1
width=220
height=220
Das nachfolgende Bild zeigt die editierte Datei.
Yolov3 starten
Mit dem folgenden Befehl wird Yolov3 gestartet. Die Video-Quelle ist die angeschlossene Raspberry Pi CSI Kamera. Bevor der Befehl ausgeführt werden kann musst Du in den Intallationsordner von yolo wechseln.
Befehl: ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights „nvarguscamerasrc auto-exposure=1 ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink -e“
Nach dem Ausführen des obigen Befehls lädt Yolov3 im Terminal Fenster und öffnet nach ein paar Sekunden ein Fenster mit dem live Video der Kamera. Hält man jetzt Objekte vor die Kamera wie z. B. eine Schere wird diese auch sofort als solche erkannt.
Das folgende Bild ist bei mir im Büro entstanden.
Hinweis: Bild steht auf dem Kopf:
Für den Fall, dass das Bild auf dem Kopf steht kann dieses gedreht werden. Dazu bitte in dem Auruf nach „flip-method=0“ suchen und die 0 durch eine 2 ersetzen. Ich musste allerdings meinen Nano einmal neustarten damit das Drehen des Bildes geklappt hat. Die Vermutung ist, dass immer noch Speicher belegt war und es daher zu einem Fehler kam.
Tiny Yolov3 starten
Tiny Yolov3 kann ebenfalls gestartet werden. Dabei unterscheidet sich der Aufruf um das Netzwerk zu starten nur minimal. Die weights Datei muss auf die „tiny“ Variante geändert werden. Weiter muss noch die „yolov3-tiny.cfg“ Konfigurationsdatei angepasst werden wie schon zuvor geschehen mit der yolov3.cfg Datei.
Befehl: nano /darknet/cfg/yolov3-tiny.cfg
Die angepasste Datei sollte jetzt wie folgt aussehen.
Der Befehl sieht dann wie folgt aus.
Befehl: ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights „nvarguscamerasrc auto-exposure=1 ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink -e“
Mit der Tiny Yolo Version kommt der Jetson Nano auf ca 10 FPS bis 11 FPS aber es werden deutlich weniger Objekte erkannt.
Zusammenfassung
Yolov3 und der Jetson Nano machen richtig Spaß. Es ist einfach toll zu sehen wie die Ojekterkennung funktioniert und das wirklich zu einem kleinen Preis. Toll ist auch das die installation wirklich recht einfach war und dank dem NVIDIA Forum konnte ich auch die notwendingen Befehle und Lösungen nachlesen und hier für meine Anleitung verweden. Daher geht auch ein großes Dankeschön an die NVIDIA Community die so lebhaft die Jetson Produkte unterstützt.
Auf make hin bekomme ich den Fehler:
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc‘
to the PKG_CONFIG_PATH environment variable
No package ‚opencv‘ found
Was nun?