Die größte und rechenintensivste Arbeit beim Erstellen von Modellen für Machine-Learning Algorithmen ist die Generierung der Sample-Daten und das Evaluieren dieser Daten. Um dies zu vereinfachen kann man den Raspberry Pi und Teachable Machine nutzen, was ein Service von Google ist. Hiermit kann man sich anhand hochgeladener Daten verschiedene Modelle für Tensorflow erstellen – und diese direkt nutzen.
Wie dies genau funktioniert, ist in diesem Tutorial gezeigt. Dazu erstellen wir einen Datensatz mit fünf verschiedenen Objekte. Zum Schluss erkennt unser Beispielprogramm, welches der Objekte vor der Kamera ist.
Teachable Machine Zubehör
Für Tensorflow ist nicht viel Zubehör nötig. Du brauchst lediglich eine Kamera. Hier die vollständige Liste des Zubehörs, das für dieses Tutorial verwendet wurde:
- Raspberry Pi
- Offizielle Pi Kamera
- alternativ: USB Kamera
- Raspberry Pi Gehäuse
- USB Ladegerät (Typ C bzw. micro USB bei älteren Pi Modellen)
- optional: 3.2 Zoll LCD Touchscreen
Da wir Python als Programmiersprache benutzen, kann das Tutorial auch auf einem PC / Linux Rechner ausgeführt werden.
Was genau ist Teachable Machine by Google?
Die meisten Machine Learning Algorithmen basieren darauf, dass ein Modell erstellt wird, mit dem bekannte Objekte klassifiziert werden. Umso mehr Daten man verwendet, umso besser wird das Modell und umso genauer die spätere Klassifizierung. Das ist soweit nichts neues und ist in diesem Tutorials detailiert erklärt.
Tensorflow ist ein erweitertes Tool, um diese Klassifizierung durchzuführen. Dazu müssen wir aber entsprechende Modelle berechnen. Wofür diese Modelle berechnet werden, ist dabei nicht wichtig. Das können also Bilder, Musik oder sonstige Daten sein.
Google’s neues Tool „Teachable Machine“ automatisiert den Prozess, um an ein Modell zu gelangen. Das einzige was wir brauchen, sind die Demobilder. Mit Hilfe dieses Tools ist ein erster Machine-Learning Prototyp innerhalb kürzester Zeit erstellt.
Vorbereitung
Bevor wir starten, ist es sehr von Vorteil zu wissen, was Tensorflow ist und sich idealerweise damit schon einmal beschäftigt zu haben. Hierfür kannst du u.a. dieses Tutorial ansehen.
Zunächst schließen wir die (USB) Kamera an den Raspberry Pi an. Je nach Typ kann schon mal ein Testfoto erzeugt werden,, um sicher zu gehen, dass die Kamera richtig erkannt wurde und funktioniert.
Erstellen des Modell-Datensatz
Der Modelldaten wird unter teachablemachine.withgoogle.com erstellt. Auf der linken Seite werden die verschiedenen Objekte angelegt und Bilder aufgenommen. Hierbei können die Beispielbilder direkt aufgenommen werden oder lokal ausgewählt werden. Sofern du nur eine Kamera am Raspberry Pi angeschlossen hast, empfiehlt es sich die Website über den Pi aufzurufen.
In meinem Fall möchte ich zwischen diesen fünf Objekten unterscheiden:
- Raspberry Pi 4
- Raspberry Pi 3B (sieht dem Model 4 recht ähnlich)
- Erste Generation: Raspberry Pi Model B
- Raspberry Pi Zero
- ESP32 (als einziger in schwarz)
Es wird empfohlen mindestens 200 Bilder aus verschiedenen Winkeln und mit unterschiedlichem Licht aufzunehmen. Daneben darf sich kein weiteres Objekt, das erkannt werden soll, befinden. Außerdem kannst du einen zusätzlichen „leeren“ Eintrag erstellen, auf dem nur der Hintergrund zu sehen ist. Das ist nützlich, falls keines der Objekte eindeutig erkannt wird.
Sobald alle Bilder aufgenommen sind, sieht es folgendermaßen aus:
Im nächsten Schritt drücken wir den „Train Model“ Button, wodurch zunächst lokale Berechnungen stattfinden. Deine Sample Bilder werden nicht zu Google hoch geladen (es sei denn du speicherst das Projekt bewusst in Google Drive). Dieser Schritt dauert eine Weile.
Bevor wir das generierte Model erstellen, gibt es noch die Möglichkeit es zu testen:
Nun kannst du das Model exportieren.Wähle hierzu Tensorflow -> Savedmodel aus (die Konvertierung findet bei Google in der Cloud statt). Die converted_savedmodel.zip Datei kommt auf dem Raspberry Pi in den Home-Folder (/home/pi); entweder per Direktdownload oder per FTP.
Übrigens: Die Projekte gibt es auch zum Download (hier zum Frontend) – falls du Google die Daten nicht anvertraust.
Tensorflow Installation auf dem Raspberry Pi
Das erstellte Model kann nur mittels Tensorflow genutzt werden. Die Installation dessen ist allerdings nicht besonders schwer. Öffne eine Konsole und gib folgendes ein:
pip3 install virtualenv Pillow numpy pygame git clone --depth 1 https://github.com/tutRPi/rpi-vision cd rpi-vision python3 -m venv tflite-teachable-machine source tflite-teachable-machine/bin/activate
Hier gibt es die aktuelle Version und mehr Details zur Installation von den Tensorflow Binaries.
Die wichtigsten Befehle zum Installieren sind aber folgende:
wget https://github.com/PINTO0309/Tensorflow-bin/raw/master/tensorflow-2.1.0-cp37-cp37m-linux_armv7l.whl sudo -H pip3 install tensorflow-* sudo pip3 install -e .
Nun müssen wir den Raspberry Pi noch neustarten.
sudo reboot
Ausführung auf dem Raspberry Pi und Beispiel-Ausgabe
Für den folgenden Teil wird ein Display benötigt. Dazu kann entweder SSH mit X11 genutzt werden, oder aber eine Remotedesktopverbindung. Ich nutze Letzteres.
Dort öffnen wir wieder die Konsole und wechseln in das Verzeichnis von vorhin und aktivieren ebenfalls die virtuelle Umgebung.
cd rpi-vision source tflite-teachable-machine/bin/activate
Für das folgende Skript müssen wir den Bildschirm, auf dem die Ausgabe stattfinden soll, angeben. Diesen finden wir hiermit heraus:
echo $DISPLAY
Die Ausgabe darf nicht leer sein und ist in meinem Fall :10.0
Das Skript wird nun mit zwei Parametern gestartet: Dem Display und dem Pfad, unter der wir vorhin die zip Datei gespeichert haben.
sudo XAUTHORITY=/home/pi/.Xauthority DISPLAY=:10.0 /usr/bin/python3 tests/pitft_teachablemachine.py ~/converted_savedmodel.zip
Die Initialisierung dauert einen Moment. Nach etwa 20-30 Sekunden ist es soweit: Ein weiteres Fenster öffnet sich, auf dem das Bild der Kamera zu sehen ist.
Wir legen nun die verschiedenen Objekte, die wir vorher trainiert haben, unter die Kamera und sehen, dass sich das Label unterhalb ändert.
Das Skript kannst du mittels Strg + C beenden.
Außerdem können natürlich innerhalb des Skripts auch weitere Änderungen vorgenommen werden. Wenn du z.B. die Größe oder den Schwellwert (ab wann gilt ein Objekt als „erkannt“), ist dies kein Problem. Du kannst natürlich auch andere Aktionen beim Erkennen der Objekte triggern und die Kamera-Ausgabe komplett weglassen
Besteht weiteres Interesse an solchen Tutorials (Tensorflow und Objekterkennung)? Über Kommentare oder Projekt/Tutorialideen freue ich mich.
26 Kommentare
Ein sehr gut gemachte Tutorial, Herr Felix.
Ich werde mehre Artikeln über RPi und TensorFlow und OpenCV sehr begrüßen.
Persönlich halte ich ein 3.3″ Bildschirm als viel zu klein – aber es ist sehr leicht ein größeres Einzubauen.
Hallo Nigel,
vielen Dank! Falls du dir Tutorials zu bestimmten Themen wünschst, kannst du das gerne schreiben.
LG, Felix
Hallo Felix,
Wirklich ein super gutes Tutorial!
Es wäre schön, wenn du erklären könntest, wie die Informationen aus der Objekterkennung in ein Python Skript einbinden kann, sodass ich gewisse abhängigkeiten programmieren kann.
Beispiel:
Katze erkannt…öffne Tür usw…
Viele Grüße
Hallo Felix,
ich werde die nächsten Tage das auch mal versuchen nachzubauen.
Gerne würde ich Tauben auf dem Balkon erkennen und mit Wasser bespritzen.
Dazu fehlt mir noch die Position des Objektes und die Möglichkeit Servos in die Richtung zu lenken und eine kleine Pumpe an zu stellen…
Zumindest die Position bekommst du aus dem Bild heraus. Um die Tiefe auch herauszufinden, bräuchtest du eine zweite Kamera (Stereo Vision).
Hallo Felix,
das Tutorial von dir hat super geklappt, nur leider bekomme ich keine Positionsdaten der Objekte heraus. Hättest du eine Idee wie das möglich ist?
Hallo Hubertus,
da ich genau das selbe Problem mit Tauben auf meinem Balkon habe, hatte ich auch die Idee, bist du hier weitergekommen?
Grüße.
Hallo Daud,
hast du das Problem mit den Tauben gelöst?
Ich habe ein ähnliches Problem
Lg Erich
Hallo Felix,
aktuelle warte ich noch auf die EEPROM release Version für den RPi4
zum Booten von USB.
Dann würde ich gerne Personen vor der Haustür per IP Kamera erkennen
und mir über Home Assistent eine Benachrichtigung schicken lassen.
Als nächstes wäre dann das Carport an der Reihe, wo ich dann die Personen
auch erkennen möchte und Katzen per Wasserstrahl verteiben will.
Der Rasensprenger mit Bewegungsmelder soll nur Katzen erschrecken.
Habe mir den Coral USB Stick bestellt für Tensorflow.
Ich glaube den benötige ich für insgesamt 4 IP Kameras um das Haus…
Danke übrigens für die tollen Tutorials!
Hey Marcus,
das klingt ziemlich interessant! Wenn du Interesse hast das ganze mit den anderen zu teilen, kannst du dich gerne bei mir melden 🙂
Viele Grüße
Felix
Hi Felix,
super tutorials, danke. Schon paar Tage alt, ich hoffe du liest den chat noch.
@Marcus: genau das will ich auch machen, webcam-Inhalt mit PI erkennen und dann im homeassistant (läuft auf dem gleichen PI) Automatisierung auslösen. Bist du damit schon weiter gekommen? Wäre super, wenn du das teilen könntest.
Vielen dank schon mal und schöne Grüße!
Norbert
Hallo Felix,
vielen Dank für deine Tutorials! Meinerseits besteht ein Riesen Interesse an dem Thema Objekterkennung. Ich würde mich über eine Fortsetzung freuen!
(wie) Ist es denn möglich, ein erkanntes Objekt in einem Skript auszuwerten.
Beispielsweise: Eine Person läuft durch das Bild und wird erkannt. Im Skript wird dann Person +1 gezählt.
Aktuell ist es überall wichtig die Personenzahl genau zu erfassen, daher wäre dies ein sehr interessantes Thema.
Hallo Felix,
super Tutorials. Ich möchte mich damit beschäftigen bei erkannten Objekten dies auf einem NAS auzuzeichnen (Überwachungskamera). Hast Du evtl. hier schon Erfahrungen gemacht?
Gruß Manuel
Hallo Felix
Vielen Dank für die Tutorials. Bei mir wird leider die UBS-Kamera nicht erkannt im Script pitft_teachablemachine.py. Was muss ich ändern, dass nicht nur die Pi-Kamera, sondern auch eine USB-Kamera erkannt wird?
Viele Grüsse
Lukas
Gib mal ein:
ls -ltrh /dev/video*
bzw.lsusb
Hallo Felix,
Wie immer ein super Tutorial. Ist es möglich damit auch eine Gesichtserkennungssoftware zu schreiben (Gesichtserkennung (recognition) nicht Gesichtserkennung (detection) wenn du weißt wie ich meine :D)
Gruß Simon
Hallo Felix,
ich bekomme leider folgende Meldung:
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File „tests/pitft_teachablemachine.py“, line 19, in
from rpi_vision.models.teachablemachine import TeachableMachine
File „/home/pi/rpi-vision/rpi_vision/models/teachablemachine.py“, line 7, in
import tensorflow as tf
ModuleNotFoundError: No module named ‚tensorflow‘
Ich hoffe du oder jemand anderes hat eine Idee
Gruß Johannes
Hallo Felix,
danke für das Tutorial, es ist schon ein spannendes Thema.
Ich habe leider keine Ahnung von Python, ich hatte mir aber Googels teachablemachine-Ausgabeskript umgebogen, dass ich per Pygame.Camera ein Foto mache, welches dann vom diesem Skript erkennbar ausgewertet wird. Das alles steuert dann ein bash-Skript 🙂 Der ganze Vorgang der Bilderkennung dauert auf dem Raspberry 3 um die 50 Sekunden.
Nun wollte ich Dein Skript testen. Schon dieTextausgabe auf dem Monitor ist eine tolle Funktion.
Meine PI-Kamera ist leider verlorengegangen, ich habe deshalb versucht dein Skript auf die USB-Kamera umzubiegen.
Aber so weit komme ich nicht, es gibt die Meldung:
OSError: SavedModel file does not exist at: converted_savedmodel/model.savedmodel/{saved_model.pbtxt|saved_model.pb}
Mit diesen Fehler hatte ich schon einmal gekämpft, damals war python3-h5py nicht aktuell genug.
Tensorflow ist nun Version 2.4, kann das die Ursache sein?
Hallo Felix,
das Projekt sieht wirklich toll aus. Wenn das Script funktioniert, wäre das eine tolle und einfache Lösung zur Qualitätskontrolle für ein Montageprozess in unserer Behindertenwerkstatt. Leider scheitere ich im letzten Schritt. Wenn ich das Script starten möchte erscheint:
pygame 1.9.4.post1
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File „tests/pitft_teachablemachine.py“, line 18, in
from rpi_vision.agent.capture import PiCameraStream
ModuleNotFoundError: No module named ‚rpi_vision‘
Kannst Du mir einen Tip geben wo das Problem liegen könnte?
Beste Grüße Michael
Hi Michael,
schau mal hier, das könnte dir helfen: https://raspberrypi.stackexchange.com/a/61462/35207
Hallo Felix, ist zwar schon etwas älter, aber ich habe das gleiche Problem, hast Du eine Lösung gefunden??
Thanx Peter
Hi Felix,
der Link: wget https://github.com/PINTO0309/Tensorflow-bin/raw/master/tensorflow-2.1.0-cp37-cp37m-linux_armv7l.whl laäuft ins Leere (404) hast du eine Alternative?
Gruß, Michael
Servus, ich bin mir nicht Sicher obs klappt, versuchs grad selbst noch. Aber versuch mal den Link: https://github.com/PINTO0309/Tensorflow-bin
Hallo Michael,
ich bin leider kein Experte und bin mir daher nicht ganz sicher mit folgendem Vorschlag es mit einem echo download zu versuchen:
Versuche folgende Zeilen statt der „wget ….“:
curl -sc /tmp/cookie „https://drive.google.com/uc?export=download&id=1nAIYS-f-p-gmj1MzgZ9R3imtmrvlkna0″ > /dev/null
CODE=“$(awk ‚/_warning_/ {print $NF}‘ /tmp/cookie)“
curl -Lb /tmp/cookie „https://drive.google.com/uc?export=download&confirm=${CODE}&id=1nAIYS-f-p-gmj1MzgZ9R3imtmrvlkna0“ -o tensorflow-2.1.0-cp37-cp37m-linux_armv7l.whl
echo Download finished.
Bei mir hat es geklappt.
Grüße,
Tobi
Hallo Felix,
vielen Dank für das Tutorial 🙂 Ich würde gern ein Projekt mit dem Raspberry Pi und TensorFlow machen. Die Idee wäre eine KI, welche als Eingang Daten von Sensoren hätte und am Ende ein Wert für eine Variable ausgeben kann. Leider konnte ich dazu bisher nichts finden. Ist das irgendwie möglich an Stelle von Bildern oder Audio mit Zahlenwerten das Ganze zu machen? Hättest du dazu einen Tipp? Vielen Dank
Gruß Dori
Lieber Felix,
vielen Dank für Deine informativen Tutorials, jedoch
sudo XAUTHORITY=/home/pi/.Xauthority DISPLAY=:10.0 /usr/bin/python3 tests/pitft_teachablemachine.py ~/converted_savedmodel.zip
hier erhalte ich :
pygame 1.9.4.post1
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File „tests/pitft_teachablemachine.py“, line 18, in
from rpi_vision.agent.capture import PiCameraStream
ModuleNotFoundError: No module named ‚rpi_vision‘
obwohl rpi_vision vorhanden ist ???
echo $DISPLAY
gibt :0.0 ???? und ich benutze einen pi 3B+.
Irgendeine Ideee wo ich suchen muß?