Im fünften Beitrag der Serie hast du die Coral Camera kennengelernt und gesehen, wie man sie an das Coral Dev Board Mini anschließt. In diesem Beitrag startest du damit dein erstes KI-Projekt. Es geht dabei um Bilderkennung. Das Programm sagt dir zu Gegenständen, die du in die Kamera hältst, was es erkennt und wie hoch es die Wahrscheinlichkeit einschätzt, dass die Erkennung korrekt ist.
|
Zunächst verbindest du das Dev Board Mini über den microHDMI-Anschluss mit einem Monitor und wie gewohnt über den Anschluss USB-OTG mit deinem Host-PC. Öffne die Git Bash und starte mit mdt shell das Terminal von Mendel Linux. Lege als Erstes eine Umgebungsvariable fest, die später den Code vereinfacht:
export DEMO_FILES="$HOME/demo_files"
Einzelnes Foto erkennen
Wir beginnen mit einem einfachen Projekt, in dem das Programm ein vorgegebenes Foto erkennt. Es zeigt dir die grundlegende Vorgehensweise und du siehst, wie Bilderkennung funktioniert. In dem Beispiel erfährst du, wie man mit Hilfe der TensorFlow Lite API und unterstützt durch die PyCoral API eine Inferenz auf der Edge TPU des Boards durchführt. Eine Inferenz ist eine aus einem Regelsystem erzeugte Schlussfolgerung. Die PyCoral API ist auf der TensorFlow Lite Python API aufgebaut und vereinfacht den Code. TensorFlow Lite wiederum ist ein Machine-Learning-Framework. Im Bereich der künstlichen Intelligenz ist Python als Programmiersprache erste Wahl.
Zunächst erstellst du einen Ordner und lädst PyCoral von Github herunter. Dazu führst du nacheinander die folgenden Befehle in der Shell des Dev Boards durch
mkdir coral && cd coral
git clone https://github.com/google-coral/pycoral.git
cd pycoral
Anschließend installierst du den Code für das Projekt. Das erledigst du mit
bash examples/install_requirements.sh classify_image.py
Als Ergebnis erhälst du die Datei „classify_image.py“. Jetzt wird es spannend: Du führst die Bilderkennung mit dem Foto von einem Papagei durch. Dazu führst du diesen Code aus:
python3 examples/classify_image.py \
--model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--labels test_data/inat_bird_labels.txt \
--input test_data/parrot.jpg
Du kannst diesen und die nachfolgenden Codes auch von dieser Seite kopieren und im Terminal des Boards einfügen, um Tippfehler zu vermeiden. Dazu klickst du mit der rechten Maustaste auf die Zeile, in der der Cursor steht, und klickst auf „Paste“.
Die Erkennung wird fünf Mal durchgeführt und wirft am Ende das wahrscheinlichste Ergebnis aus.
Herzlichen Glückwunsch! Du hast eine Inferenz auf der Edge TPU mit TensorFlow Lite durchgeführt! Das Beispiel wiederholt die Inferenz fünf Mal und gibt die benötigte Zeit für jede Inferenz aus. Die unterste Zeile zeigt das Top-Klassifizierungsergebnis mit einem Konfidenzwert zwischen 0 (keine Wahrscheinlichkeit) und 1 (100 Prozent Wahrscheinlichkeit). Im Beispiel handelt es sich also mit einer Wahrscheinlichkeit von 75,8 Prozent um einen Ara macao. Da ein Papagei auch Ähnlichkeiten mit anderen Vögeln hat, kann sich das Programm nie zu 100 Prozent sicher sein. 75 Prozent ist schon ein sehr guter Wert.
Der Befehl ruft das Programm „classify_image.py“ auf und übergibt als Parameter das Modell, die Labels und das zu erkennende Foto. Mit less classify_image.py kannst du dir den Quellcode ansehen. Das Skript kommt mit gut 100 Zeilen Code aus. Die Modell-Datei hat die Endung .tflite. Das steht für TensorFlow Lite. TensorFlow ist ein Framework für maschinelles Lernen und künstliche Intelligenz, und Lite steht für eine schlanke Version davon. Mit TensorFlow Lite ist es nicht möglich, Modelle zu trainieren. Es ist für das Anwenden von bereits trainierten Modellen konzipiert. An dem Namensbestandteil edgetpu erkennst du, dass das Modell für die Edge TPU kompiliert wurde, die sich auf dem Dev Board Mini befindet.
Um die Leistung zu vergleichen, kannst du ein Modell verwenden, das nicht für die Edge TPU kompiliert wurde. Es läuft stattdessen auf der CPU. Dafür ersetzt du im obigen Befehl den Parameter, der das Modell übergibt. Der Befehl sieht dann so aus:
python3 examples/classify_image.py \
--model test_data/mobilenet_v2_1.0_224_inat_bird_quant.tflite \
--labels test_data/inat_bird_labels.txt \
--input test_data/parrot.jpg
Das Ergebnis ist eindeutig: Statt rund 19 Millisekunden benötigt die Inferenz in diesem Fall rund 260 Millisekunden. Ohne Kompilierung für die Edge TPU ist das Programm somit um den Faktor 13,7 langsamer. Das spielt im Bereich von Millisekunden keine große Rolle, aber bei komplexeren Projekten mit Bilderkennung in Echtzeit ist Geschwindigkeit ein wesentlicher Faktor.
Im Verzeichnis /home/mendel/coral/pycoral/test_data befindet sich die Datei mit den Labels, sprich den Vogelnamen. Mit cat inat_bird_labels.txt kannst du die lange Liste ausgeben. Über die SD-Karte kannst du eigene Vogelbilder in dem Verzeichnis ablegen und schauen, ob sie erkannt werden.
Diesen Papagei erkennt die Bilderkennung deines Dev Board Mini mit großer Wahrscheinlichkeit als Ara macao.
Bilderkennung im Kamera-Stream
Ein einzelnes Foto zu erkennen ist ja ganz nett. Viel spannender ist es jedoch, einen beliebigen Gegenstand zu identifizieren, den du vor die Linse der Coral Camera hältst.
Im ersten Schritt lädst du das Modell für die Bildklassifizierung und eine Datei mit den Labels herunter. Das geht so:
wget -P ${DEMO_FILES}/ https://github.com/google-coral/test_data/raw/master/mobilenet_v2_1.0_224_quant_edgetpu.tflite
wget -P ${DEMO_FILES}/ https://raw.githubusercontent.com/google-coral/test_data/release-frogfish/imagenet_labels.txt
Die beiden Befehle gehören jeweils in eine Zeile.
Wie du am Dateinamen erkennst – der edgetpu enthält – ist dieses Bilderkennungs-Modell bereits für die Nutzung mit der Edge TPU auf deinem Board compiliert. quant im Dateinamen weist darauf hin, dass es sich um ein quantisiertes Bildklassifizierungsmodell handelt. Quantisierte Modelle bieten die kleinste Modellgröße und die schnellste Leistung auf Kosten der Genauigkeit. Als Gegenstück liefern Gleitkommamodelle die beste Genauigkeit auf Kosten der Modellgröße und -leistung.
Das verwendete Modell erkennt und klassifiziert 1.000 verschiedene Objekte, die du der Coral Camera präsentierst. Bevor du nun die Bilderkennung startest, stellst du sicher, dass die Coral Camera mit dem Board verbunden und das Board an einen Monitor angeschlossen ist. Dann rufst du das Projekt auf mit
edgetpu_classify \
--model ${DEMO_FILES}/mobilenet_v2_1.0_224_quant_edgetpu.tflite \
--labels ${DEMO_FILES}/imagenet_labels.txt
Hier kommt ein anderes Programm zum Einsatz: edgetpu_classify. Das Python-Skript liegt im Verzeichnis /usr/bin und importiert edgetpuvision, eine Python-API zur Durchführung von Inferenzen auf Bilddaten, die von der Kamera stammen. Als Parameter übergibst du das Modell und die Datei mit den Labels. Mit cat imagenet_labels.txt | more kannst du dir die 1.000 Labels anschauen. Um zusätzliche Gegenstände erkennen zu können, müsstest du das Modell neu trainieren.
Auf dem Monitor siehst du nun den Stream der Kamera. Halte vor einem möglichst einheitlichen Hintergrund einen Gegenstand in die Kamera. Achte dabei auf die korrekte Ausrichtung, denn eine Flasche, die auf dem Kopf steht, wird das Programm schwerlich erkennen. Auf dem Monitor erscheinen mehrere Begriffe, was das Programm zu erkennen glaubt, und ein Konfidenz-Score. Mit [Strg]+[C] beendest du das Projekt.
Hintergrundwissen: MobileNet V2 ist eine Familie von neuronalen Netzwerkarchitekturen für eine effiziente Bildklassifizierung, trainiert auf dem ImageNet ILSVRC2012-Datensatz. ImageNet wiederum ist eine Bilddatenbank. Jedes Bild ist einem Substantiv zugeordnet. Zu jedem Substantiv wiederum liegen im Durchschnitt etwa 500 Bilder vor. Mehr als 14 Millionen Bilder wurden dafür von Hand mit Anmerkungen versehen.
In diesem Beispiel erkennt das Programm den Gegenstand zuverlässig als Kaffee-Tasse.
Die vortrainierten Modelle sind das Herzstück der Projekte mit dem Dev Board Mini. Ein Sammelbecken für solche Modelle ist die Webseite TensorFlow Hub. Auf der Seite zu den Coral AI Modellen von Google findest du trainierte Modelle, die für die Coral Edge TPU compiliert wurden. Grundsätzlich lassen sich die vortrainierten Modelle anpassen, um eigene Bilder und Objekte zu erkennen. Das ist sehr aufwendig. Aber mit den trainierten Modellen steht genug Material zur Verfügung für spannende Experimente und KI-Projekte.
APIs erleichtern die ArbeitDie Basis für KI-Projekte mit deinem Board ist das Framework TensorFlow Lite. Darauf bauen APIs auf, um den Code zu vereinfachen und zusätzliche Funktionen bereitzustellen. Für das Dev Board Mini spielen vor allem zwei APIs eine Rolle.Die Edge TPU API bietet einfache APIs, die Bildklassifizierung und Objekterkennung durchführen. Sie baut auf der TensorFlow Lite C++ API auf und abstrahiert einen Großteil des Codes, der für die Verarbeitung von Eingabe- und Ausgabetensoren erforderlich ist. Die PyCoral API ist auf der TensorFlow Lite Python API aufgebaut. Sie kann den Code vereinfachen, wenn du eine Inferenz auf der Edge TPU ausführst. Und sie stellt erweiterte Funktionen für die Edge TPU bereit. PyCoral ist die modernere und vielseitigere der beiden APIs. Code-Beispiele findest du im GitHub-Repositorium von PyCoral. |