Der Jetson Nano ist ideal für kleine Projekte am Wochenende. Eine Vielzahl an Projekten sind in den letzten Monaten entstanden und online verfügbar. Sehr gut hat mit das Projekt gefallen das ich auf Medium unter der folgenden URL gefunden habe. Dabei handelt es sich um ein Beispiel aus dem Bereich der Gesichtserkennung. Hierfür ist der kleine Jetson Nano von NVIDIA ideal. Ich habe das Projekt hier auf meinem Blog beschrieben und um eine Schranke und ein paar Feinheiten erweitert. So ist es möglich abhängig von den Zugangsrechten einer Person / dem Gesicht die Schranke sich öffnen oder schließen zu lassen.

Die nachfolgende Anleitung führt Schritt für Schritt durch das Projekt. Es wird neben dem Jetson Nano und einer CSI Kamera noch ein Servo-Motor sowie Servo-Kontroller benötigt. Nachfolgend kommt die Einkaufsliste der Hardware die für dieses Projekt benötigt wird.

Jetson Nano Gesicht Erkennung und Zugangskontrolle

Jetson Nano Gesicht Erkennung und Zugangskontrolle

Einkaufsliste für dieses Projekt

Der Jetson Nano ist das Herzstück des Projektes.

Loading ...

Die micro SD-Karte wird benötigt um auf dieser das Betriebssystem des Jetson Nano zu installieren.

Loading ...

Hier ist die Wahl der richtigen CSI Kamera  wichtig. Am besten funktioniert die Raspberry Pi CSI Kamera Version 2.1.

Loading ...

Mit dem Servo-Motor wird die Schranke bewegt.

Loading ...

Der PCA9685 Servo-Kontroller sorgt dafür, dass der Servo-Motor angesteuert werden kann.

Loading ...

Mit den Jumper-Kabeln wird der Servo-Kontroller am I²C Bus des Jetson Nano angeschlossen.

Loading ...

Jetson Nano – SD-Karte vorbereiten

Es sollte immer das aktuelle Image für den Jetson Nano von der NVIDIA Seite herunter geladen werden. Für diese Anleitung wurde das Image mit dem Namen “” verwendet. Das neueste Image findet sich immer unter der folgenden Seite:

URL: https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

Das Image selber kann mit z. B. Win32DiskImager (Windows) oder Etcher (Windows, MacOS und Linux) auf eine 32GB große micro SD-Karte aufgespielt werden. Beide Programme gibt es über die nachfolgenden Seite zum Download.

URL: https://sourceforge.net/projects/win32diskimager/

URL: https://www.balena.io/etcher/

Nach dem das Image auf die micro SD-Karte aufgespielt ist und der Jetson Nano in das eigene W-LAN eingehängt ist kann es weiter gehen die eigentliche Software für die Gesichtserkennung zu installieren.

Jetson Nano – Software Installation

In diesem Abschnitt erkläre ich welche Pakete alle installiert werden müssen um auf den Jetson Nano mit der Gesichtserkennung starten zu können. Dabei gehe ich darauf ein wie eine SWAP Datei aufgesetzt werden kann und welche Bibliothek benötigt wird um eine kleine Schranke mit einem Servo-Motor bewegen zu können.

SWAP File – einrichten

Da der Jetson Nano mit seinen 4GB Ram nicht wirklich viel Arbeitsspeicher hat hilft die Anlage einer Swap Datei um eventuelle Problemen zu begegnen die entstehen da zu wenig Arbeitsspeicher verfügbar ist. Die Lösung ist eine Swap Datei mit einer Größe von 6GB die auf der micro SD-Karte angelegt wird. Das Anlegen der Swap Datei geht mit den nachfolgenden Befehlen die im Terminal Fenster ausgeführt werden.

Befehl: sudo fallocate -l 6G /var/swapfile

Befehl: sudo chmod 600 /var/swapfile

Befehl: sudo mkswap /var/swapfile

Befehl: sudo swapon /var/swapfile

Befehl: sudo bash -c 'echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab'

Nach dem alle Befehle der Reihe nach ausgeführt wurden bitte den Jetson Nano neu starten. Anschließend steht die SWAP Datei zur Verfügung.

Libaries und Bibliotheken installieren

Als erstes wird die Ubuntu Installation auf den neuesten Stand gebracht. Dazu bitte den folgenden Befehl ausführen.

Befehl: sudo apt-get update

Anschließend wird eine Reihe von Bibliotheken installiert. Diese Installation dauert ein paar Minuten.

Befehl: sudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev

Das Beispiel ist in Python programmiert und verwendet numpy und daher wird diese Bibliothek noch zusätlich benötigt.

Befehl: pip3 install numpy

Da es in diesem Beispiel um die Erkennung von Gesichtern geht und wir hier nicht alles selbst erfinden müssen oder können wird die Dlib Library installiert. Dise Deep Learning Library für die Gesichtserkennung (face recognition) nimmt uns die Arbeit ab. Die Installation selber benötigt ca. 1 Stunde. Daher lohnt es sich jetzt nach dem der nachfolgende Befehl ausgeführt wurde z. B. einen Kaffee trinken zu gehen.

Als erstes muss die Library herunter geladen werden.

Befehl: wget http://dlib.net/files/dlib-19.17.tar.bz2

Nach dem die Datei z. B. im Home-Verzeichnis liegt wird diese entpackt.

Befehl: tar jxvf dlib-19.17.tar.bz2

Jetzt in das Verzeichnis wechseln mit der entpackten Dlib Library

Befehl: cd dlib-19.17

Leider kann auf dem Jetson Nano nicht gleich die Installation gestartet werden. Es muss noch eine kleine Anpassung an der “cudnn_dlibapi.cpp” Datei vorgenommen werden. Die Zeile die mit dem Eintrag “forward_algo = forward_best_algo;” beginnt und ca. bei der Zeilennummer 854 liegt muss auskommentiert werden.

Befehl: gedit dlib/cuda/cudnn_dlibapi.cpp

Die Zeile sollte jetzt wie folgt aussehen.

//forward_algo = forward_best_algo;

Jetzt nach dem die Anpassung abgespeichert wurde kann mit der eigentlichen Installation der Dlib Library begonnen werden.

Befehl: sudo python3 setup.py install

Nach dem alles soweit an Bibliotheken installiert wurde welche für die Gesichtserkennung benötigt werden folgt jetzt noch die Installation der Gesichtserkennungssoftware selber. Diese wird mit dem folgenden Befehl installiert.

Befehl: sudo pip3 install face_recognition

Nach dem die Installation durchgelaufen ist wäre alles soweit installiert um Gesichter erkennen zu können.

Adafruit Servo-Kontroller Bibliothek

Damit der kleine Servo-Motor über den Servo-Kontroller angesteuert werden kann muss noch auf dem Jetson Nano die Servo-Kontroller Bibliothek von Adafruit installiert werden. Dazu bitte den folgenden Befehl ausführen.

Befehl: pip3 install Adafruit_PCA9685

Die Pin Belegung des I²C Bus am Jetson Nano ist wie im folgenden Bild gezeigt.

Jetson Nano I2C bus

Jetson Nano I2C bus

Jetzt kann der PCA9685 Servo-Kontroller über den I²C Bus des Jetson Nano angesprochen werden. Ob der Servo-Kontroller auch erkannt wurde kann mit dem folgenden Befehl überprüft werden.

Befehl: sudo i2cdetect -y -r 1

Damit der User z. B. nano auch auf den I²C Bus zugreifen kann muss noch folgender Befehl ausgeführt werden.

Befehl: sudo usermod -a -G i2c <hier den usernamen eingeben>

Jetson Nano – Gesichtserkennung starten

Nach dem die Software Installation abgeschlossen ist muss noch das Beispielprogramm herunter geladen werden mit der doorcam.py Programm-Datei. Dieses Python Programm ist so zu sagen die Basis für die Gesichtserkennung an der Tür und mit diesem wird z. B. ermittelt wie oft jemand in z. B. den letzten Stunden an der Tür bzw. vor der Kamera war. Über den folgenden Befehl kann die doorcam.py Datei herunter geladen werden.

Befehl: wget -O doorcam.py tiny.cc/doorcam

Das Programm selber kann aber auch auf GitHub herunter geladen werden.

Die Gesichtserkennungssoftware selber wird über den folgenden Befehl gestartet. Gesichter die erkannt werden in der Datei known_faces.dat gespeichert. Die Datei known_faces.dat wird immer in dem Pfad abgelegt aus dem heraus die Software gestartet wird.

Befehl: python3 doorcam.py

Doorcam.py – Modifizierung Zugangsrechte

Damit auch Gesichter nicht angezeigt werden sondern zu jedem Gesicht auch ein Name sowie der Status des Zugangsrechts abgespeichert werden kann muss eine kleine Anpassung am Programm “doorcam.py” vorgenommen werden. Somit muss das Attribut “Name” und das Attribut “Zugang” erfasst werden wenn ein neues Gesicht erkannt wird. Hier bedienen wir uns der ganz einfachen Python Lösung von input als String. Dazu bitte die “doorcam.py” datei z. B. in Visual Studio Code öffnen und die Funktion “def register_new_face(face_encoding, face_image):” suchen. Gleich am Anfang wird die “input” Funktion von Python aufgerufen. Über diese Funktion können der Nachname und der Wert Yes/No für den Zugang erfasst werden.

lastname = input("Lastname: ")
access = input("Access (yes/no): ")

Weiter wird ein Array aufgebaut mit verschiedenen Attributen wie z. B. wie oft das Gesicht vor der Kamera bereits zu sehen gewesen ist “seen_count”. Am Ende dieses Arrays  hängen wir jetzt die zwei zusätzlichen Attribute “lastname” und “access” an.

"lastname": lastname,
"access": access,
Die fertige Funktion “register_new_face” sieht dann wie folgt aus und im Quellcode fett hervorgehoben sind die Anpassungen zu sehen.
def register_new_face(face_encoding, face_image):
"""
Add a new person to our list of known faces
"""
# Add the face encoding to the list of known faces
known_face_encodings.append(face_encoding)
print("new face")
lastname = input("Lastname: ")
access = input("Access (yes/no): ")
# Add a matching dictionary entry to our metadata list.
# We can use this to keep track of how many times a person has visited, when we last saw them, etc.
known_face_metadata.append({
"first_seen": datetime.now(),
"first_seen_this_interaction": datetime.now(),
"last_seen": datetime.now(),
"seen_count": 1,
"seen_frames": 1,
"face_image": face_image,
"lastname": lastname,
"access": access,
})
Damit der Name und der Zugangsstatus unter dem Bild angezeigt werden muss diese Information zusätlich ausgegeben werden.  Dazu muss der folgende Abschnitt im Programmcode noch erweitert werden. In fett sind die sätzlichen Zeilen markiert die eingefügt werden müssen bzw. die kleine Änderung der Position des Labels visit_label_v unter dem Bild des Besuchers.
for metadata in known_face_metadata:
            # If we have seen this person in the last minute, draw their image
            if datetime.now() - metadata["last_seen"] < timedelta(seconds=1) and metadata["seen_frames"] > 5:
                # Draw the known face image
                x_position = number_of_recent_visitors * 150
                frame[30:180, x_position:x_position + 150] = metadata["face_image"]
                number_of_recent_visitors += 1
                # Label the image with how many times they have visited
                visits = metadata['seen_count']
                visit_label_v = f"{visits} visits"
                visit_label_n = "Lastname: " +metadata['lastname']
                visit_label_a = "Access: " +metadata['access']
                if visits == 1:
                    visit_label_v = "First visit" + metadata['lastname']
                cv2.putText(frame, visit_label_v, (x_position + 10, 160), cv2.FONT_HERSHEY_DUPLEX, 0.6, (255, 255, 255), 1)
                cv2.putText(frame, visit_label_n, (x_position + 10, 180), cv2.FONT_HERSHEY_DUPLEX, 0.6, (255, 255, 255), 1)
                cv2.putText(frame, visit_label_a, (x_position + 10, 200), cv2.FONT_HERSHEY_DUPLEX, 0.6, (255, 255, 255), 1)
                access_actual = metadata['access']

Doorcam.py – Modifizierung Servo-Motor

Nach dem wir jetzt jedem Gesichts das Attribut Zugangsrecht vergeben können folgt jetzt die Anpassung damit der Servo-Motor auch die Schranke öffnet oder schließt. Dazu muss die Adafruit Servo-Kontroller Bibliothek eingebunden werden und abhängig vom erkannten Gesicht die Schranke geöffnet oder geschlossen wird. Die fertige und soweit angepasste doorcam.py Datei ist nachfolgenden als doorcam_update.zip erhältlich. Ich habe darauf verzichtet hier den Quellcode einzufügen da diese Modifizierung jetzt etwas länger ist.

Download: doorcam_update

Zusammenfassung

Dieses kleine Projekt ist ideal um die Möglichkeiten zu demonstrieren die mit wenig Aufwand in der Programmierung möglich sind. Der Jetson Nano ist hierbei ideal um in die Welt von künstliche Intelligenz einzusteigen. Das tolle an diesem Projekt ist, dass man sehr schnell die Grenzen des Setups kennen lernt. So reagiert die Software auch auf Bilder die z. B. über ein Display / Smartphone angezeigt werden. Steht das Bild schräg oder über Kopf funktioniert die Bilderkennung nicht mehr. So kann sich jeder selber überlegen wie sich das System austricksen lässt bzw. auch Tests durchführen welche Bilder von Gesichtern wie verfremdet noch erkannt werden und welche vielleicht fälschlicherweise nicht.

(Visited 1.775 times, 1 visits today)