Der Raspberry Pi ist zu vielem in der Lage, so eignet er sich auch im Bereich Machine Learning. Zusätzlich gibt es Tools wie TensorFlow, die die Raspberry Pi Objekterkennung (Object Detection) mittels vortrainierter neuronaler Netze sehr vereinfachen.
Das Erkennen von Objekten (Personen, Tiere, Autos, etc.) kann z.B. in Überwachungssystemen oder Automatisierungsprozessen („Öffne die Tür, wenn die Katze raus will“), Car PC, uvm. verwendet werden.
In diesem Tutorial installieren wir TensorFlow auf einem neuen Raspberry Pi und schließen eine Kamera an, in dessen Stream die Objekte erkannt und ausgegeben werden.
Benutztes Zubehör
Um dem Tutorial zur Objekterkennung folgen zu können, sind lediglich wenige Komponenten nötig:
- Raspberry Pi (umso mehr Rechenleistung, umso besser)
- (Offizielle) Raspberry Pi Kamera
- Micro SD Karte (16GB+)
- Stromversorgung
- Optimal: Kompatibler Touchscreen
- Optional für mehr FPS: Google Coral USB Accelerator
Du kannst auch jede andere kompatible USB Kamera nutzen. Die Auflösung sollte allerdings ausreichend sein. Das offizielle Raspberry Pi Modul bietet sich aufgrund der kompakten Größe an. Außerdem wird keiner der USB Ports belegt.
Was ist Objekterkennung?
Auf Bildern ist es für Menschen recht einfach bekannte Muster und Objekte zu erkennen. Dies kommt daher, dass wir diese Objekte bereits häufig in verschiedenen Ausführungen gesehen haben. Ein Algorithmus kann dies ebenfalls erlernen, indem man ihm die entsprechenden Daten zum Lernen bereit stellt.
Wikipedia sagt dazu:
Object detection is a computer technology related to computer vision and image processing that deals with detecting instances of semantic objects of a certain class (such as humans, buildings, or cars) in digital images and videos. Well-researched domains of object detection include face detection and pedestrian detection. Object detection has applications in many areas of computer vision, including image retrieval and video surveillance.
Einige Beispiele (und Beispielbilder) findet man auf der TensorFlow Website.
Vorbereitung Installation von TensorFlow auf dem Raspberry Pi
Wir beginnen mit dem Flashen des Betriebssystems auf eine Micro SD Karte. Hierfür laden wir eine Version von Raspbian (ich benutze Raspbian Buster) von der offiziellen Seite. Um das Image in der Zip-Datei auf die SD Karte zu flashen, kannst du diesem Tutorial folgen.
Anschließend kannst du dich entweder per SSH mit dem Raspberry Pi verbinden, oder aber Bildschirm und Tastatur anschließen und direkt auf dem Pi arbeiten.
Wir beginnen damit die Kamera anzuschließen. Die offizielle Kamera wird per CSI angeschlossen (siehe Bild). Wir aktivieren das Modul zunächst:
sudo raspi-config
Unter „Interfacing Options“ > „Camera“ schaltest du die Kamera aktiv und musst danach neustarten.
Falls du eine USB Kamera nutzt, solltest du zunächst prüfen, ob diese erkannt wurde. Mehr dazu gibt es in diesem Tutorial.
Installation von TensorFlow Lite
Machen wir nun mit dem Aktualisieren der Paketquellen weiter. Starte das Terminal und gib folgenden Befehl ein:
sudo apt-get update sudo apt-get upgrade
Anstatt alle Pakete und Dateien selbst zu erstellen, nutzen wir ein veröffentlichtes Repository und klonen dieses.
git clone https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi tflite1 cd tflite1
In diesem Ordner erstellen wir eine „virtuelle Umgebung“ (virtualenv): Damit ist es möglich unterschiedliche Pakete (und Versionen) für verschiedene Projekte zu installieren, ohne dass man dies global machen muss.
sudo pip3 install virtualenv
Das neue Environment erstellen wir folgendermaßen:
python3 -m venv tflite1-env
Dadurch wird ein Ordner mit dem angegebenen Namen erstellt, der alle Python Pakete für dieses Environment enthält. Diesen aktivieren wir nun.
source tflite1-env/bin/activate
Falls du eine neue Konsole öffnest, muss das Environment erneut aktiviert werden.
Die Installation aller benötigter Pakete, ist zusammengefasst in einem Bash-Skript, das wir ausführen (dauert eine Weile). Alternativ kannst du die Befehle unten auch manuell ausführen.
bash get_pi_requirements.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#!/bin/bash # Get packages required for OpenCV sudo apt-get -y install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt-get -y install libxvidcore-dev libx264-dev sudo apt-get -y install qt4-dev-tools sudo apt-get -y install libatlas-base-dev # Need to get an older version of OpenCV because version 4 has errors pip3 install opencv-python==3.4.11.41 # Get packages required for TensorFlow # Using the tflite_runtime packages available at https://www.tensorflow.org/lite/guide/python # Will change to just 'pip3 install tensorflow' once newer versions of TF are added to piwheels #pip3 install tensorflow version=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') if [ $version == "3.9" ]; then pip3 install https://github.com/google-coral/pycoral/releases/download/v2.0.0/tflite_runtime-2.5.0.post1-cp39-cp39-linux_armv7l.whl fi if [ $version == "3.8" ]; then pip3 install https://github.com/google-coral/pycoral/releases/download/v2.0.0/tflite_runtime-2.5.0.post1-cp38-cp38-linux_armv7l.whl fi if [ $version == "3.7" ]; then pip3 install https://github.com/google-coral/pycoral/releases/download/v2.0.0/tflite_runtime-2.5.0.post1-cp37-cp37m-linux_armv7l.whl fi if [ $version == "3.6" ]; then pip3 install https://github.com/google-coral/pycoral/releases/download/v2.0.0/tflite_runtime-2.5.0.post1-cp36-cp36m-linux_armv7l.whl fi if [ $version == "3.5" ]; then pip3 install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp35-cp35m-linux_armv7l.whl fi |
Beispielprojekt: Raspberry Pi Objekterkennung mittels Kamera-Livestream
TensorFlow Lite arbeitet mit sogenannten „Detection Models“. Hierfür kann man seine eigenen Modelle trainieren, um Objekte zu erkennen. Alternativ bietet Google (und andere) ebenfalls solche Modelle zum Download an. Jedes Modell besteht aus folgenden zwei Dateien:
- detect.tflite: Enthält den Graphen des Models (nicht-lesbarer Bytecode)
- labelmap.txt: Enthält die entsprechenden Bezeichnungen (Labels) der Objekte als Textdatei. Diese Namen kannst du ändern (z.B. übersetzen).
Auf der offiziellen TensorFlow Webseite findet sich ein solches Model zum Download („Download starter model and labels“). Kopiere diesen Link (Rechtsklick) und ersetze ihn im folgenden Befehl ().
wget <Link>
Anschließend entpacken wir die Datei in einen Ordner:
unzip coco* -d Sample_TF_Lite_Model
Nun führen wir die Python Datei aus (falls du per SSH arbeitest, muss X11 installiert sein):
python3 TFLite_detection_webcam.py --modeldir=Sample_TF_Lite_Model
Es öffnet sich ein neues Fenster, in dem der Kamerastream zu sehen ist. Außerdem sind die Rechtecke markiert, in denen Objekte gefunden wurden.
Bei mir wurden folgende Objekte richtig erkannt:
- Dining Table
- Cell Phone
- Apple
- Orange
- Banana
Wie du siehst, gibt es zusätzliche Prozentangaben, wie wahrscheinlich es ist, dass es sich um jenes Objekt handelt.
Wenn wir uns die entsprechende Datei ansehen, erkennen wir, dass Tensorflow uns ebenfalls die Rechtecke (Boxen), Labels und Scores ausgibt.
184 185 186 187 188 |
# Normalize pixel values if using a floating model (i.e. if model is non-quantized) if floating_model: input_data = (np.float32(input_data) - input_mean) / input_std |
Im nächsten Tutorial gehen wir genauer darauf ein, wie man einfach sein eigenes Model trainiert und einbindet.
38 Kommentare
Hallo,
die vorgestellte Anwendung Objekterkennung mittels TensorFlow und Kamera ist sehr interessant.
Nun möchte ich nicht die vorgestellten Objekte in diesem Beispiel erkennen sondern ein Eichhörnchen im Garten.
Was muss ich tun und welche Software benutzen (iOS), um ein Eichhörnchen Foto für die Objekterkennung aufzubereiten?
Ich bin dabei ein weiteres Tutorial zu erstellen, in dem ich zeige wie mannsehr einfach sein eigenes Modell in Tensorflow nutzt. Kommt demnächst 🙂
Hallo Felix,
danke für die Anleitung. Ich warte auch sehnlichst auf das neue Tutorial für die eigenen Modelle (Katzen). Ich habe abe rnoch zwei kleine Probleme. Meine Kamera hat einen Rot/rosa Stich und das Programm hängst sich nach einer Zeit auf. Hast du eine Idee woran das liegen Kann?
Danke
Axel
Hallo Axel,
das Tutorial kommt wahrscheinlich morgen.
Welche Kamera nutzt du denn?
Edit: Link ist im Tutorial ergänzt.
LG, Felix
Hallo,
gibt es dieses Tutorial schon?
Super Tool
hat auch auch Funktioniert ,konnte wie im Beispiel Objekte erkennen .Super Tutorial ,Dankeschön
Wenn ich das jetzt nochmal Probiere kommt die Fehlermeldung
„TF_Lite_Model
Traceback (most recent call last):
File „TFLite_detection_webcam.py“, line 19, in
import cv2
„ModuleNotFoundError: No module named ‚cv2‘
Mit freundlichen Grüßen
Udo
Hast du das gleiche virtual environment aktiv?
Hallo Felix ,
hat so Funktioniert Dankeschön
Udo
Ich komme leider nicht weiter: Nach dem clonen des Tensor-Flow Programmes, bekomme ich immer die Meldung „Kein Speicherplatz mehr verfügbar“. trotz einer 32 GB SD Karte auf einem Raspberry 3B+.
Unter
raspi-config
kannst du einstellen, dass der gesamte Speicherplatz der SD Karte genutzt werden soll (expand).Hallo Felix,
ich nutze die „grüne“ original Raspberry V2.1. Die Einzelbilder sehn gut aus, aber die Bilder die ich die Remoteverbindung von deinem Script angezeigt bekomme, sind deutlich dunkler und haben einen rot Stich. Gibt es die Möglichkeit eines Weißabgleiches?
Besten Dank
Axel
Hallo Axel,
die Bildern holen wir über das OpenCV Package, mit dessen Hilfe du es vor dem Processing Schritt auch bearbeiten kannst.
Hi Felix,
Dankeschön erstmal für dein super Tutorial. Bin gerade dabei dieses umzusetzen für unsere zukünftigen Praktikanten.
Nun zu meiner Frage.
Nachdem herunterladen des Models von der TensorFlow Webseite und erfolgreichen entpacken bekomme ich die Fehlermeldung :
„can´t open file ‚TFLite_detection_webcam.py‘: [Errno 2] No such file or directory
Innerhalb der Zip Datei habe ich auch nur
– detect.tflite
– labelmap.txt
–> Dateipfad hab ich angepasst
Was mach ich Falsch?
Dankeschön!
Gruß,
Jakob
Hallo Felix,
super Anleitung.
Gibt es auch die Möglichkeit eine Netzwerkkamera mit Stream einzubinden ?
Ich wollte jetzt nicht unbedingt eine zweite Kamera installieren.
Danke im Voraus.
Hey ,
tolles Tutorial! Klappt alles.
Nur wie kann ich es realisieren, dass z.B. eine bestimmte Funktion ausgelöst wird, sobald ich z.B. zu 60% ein Apfel im Bild habe?
Ist das möglich?
Hallo,
leider habe ich ein Problem bei dem Schritt mit dem Befehl ,,unzip coco* -d Sample_TF_Lite_Model“. Immer wenn ich diesen ausführe, bekomme ich als Ausgabe, dass es diese ZIP Datei nicht gibt… Kann mir da vielleicht jemand helfen?
Kannst du mal mit
ls
ausgeben, welche Dateien im Verzeichnis existieren?Hallo,
als Ausgabe nach dem Befehl „ls“ bekomme ich dann:
‚1?lite-format=tflite‘ test1.jpg
Android test.mp4
doc tflite1-env
get_pi_requirements.sh TFLite_detection_image.py
Raspberry_Pi_Guide.md TFLite_detection_stream.py
README.md TFLite_detection_video.py
ssd_mobilenet_v1_1_metadata_1.tflite TFLite_detection_webcam.py
Viele Grüße
Konntest du das Problem lösen?
Probiere den Link: https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
–> du hast den falschen benutzt, hatte selbes Problem
Mit wget komme ich nicht weiter. Ein Beispiel mit einen funktionierden Eintrag würde mir helfen.
Hallo zusammen,
Leider komme ich nicht weiter.
Bekomme nach: python3 -m venv tflite1-env
immer folgende Fehlermeldung:
Error: Command ‚[‚/home/pi/tflite1/tflite1-env/bin/python3‘, ‚-Im‘, ‚ensurepip‘, ‚–upgrade‘, ‚–default-pip‘]‘ returned non-zero exit status 1
Kann mir jemand helfen?
Vielen Dank!
Ich komme nicht weiter beim Schritt: „Startermodell herunterladen“. Der Link lädt lediglich eine „ssd_mobilenet_v1_1_metadata_1.tflite“ Datei. Was mache ich falsch?
Arghh… der Link ist weiter unten: https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
Dieses Tutorial läuft nicht auf Raspberry PI 4 2B
1) Die angegebene OpenCV Version existiert nicht für diese Platform
2) Mit numpy gibt es auch gerade ein Problem
Ich möchte die Werte von Ganz normalen Würfeln von 1 bis 6 von senkrecht oben
fotografiert, erkennen. um die Daten zu speichern. Ginge das mit diesem System?
Welche Ausrüstung wäre nötig?
Vielen Dank für diese Anleitung!
Top, funktioniert sofort!
Im Vergleich zu anderen Tutorials (z.B. auf Youtube) extrem einfach und nachvollziehbar.
Freut mich, dass es dir gefallen hat 🙂
Hallo Felix,
nachdem ich gestern dieses Beispiel sofort zur Funktion brachte, wollte ich mit einem eigenen Modell experimemtieren. (Ihr zweites Tutorial) klappte leider nicht — sehr viele Fehlermeldungen.
Da der Code / das Beispiel von dieser Seite (Raspberry Pi KI: Objekterkennung mittels TensorFlow und Kamera) hervorragend funktioniert, würde ich gern die Trainingsfiles von Google (converted_tflite.zip bzw. labels.txt und model_unquant.tflite) hier einfügen, finde da aber keine Möglichkeit.
Gibts da eine Lösung?
Danke, Michael
NACHTRAG
Die genannten vielen Fehlermeldungen im zweiten Tutorial scheinen daher zu kommen, dass der Link: wget https://github.com/PINTO0309/Tensorflow-bin/raw/master/tensorflow-2.1.0-cp37-cp37m-linux_armv7l.whl ins Leere läuft (404) und keine Alternative zu finden ist. (Jedenfalls nicht für mich Anfänger) 😉
läuft auch bei mir ins leere.. hab leider auch nichts weiteres gefunden auf dem repository.
Hi Felix,
ich würde gerne alle xx Minuten meinen Stromzählerstand fotografieren, mit der Objekterkennung die Zahl auslesen und in eine Tabelle schreiben.
Geht das mit TensorFlow?
Gruß Ingo
Hi Ingo,
das geht zwar, aber dafür bietet sich OpenCV besser an, da es genau das mitbringt, was du brauchst. Bei Interesse kann ich dazu mal ein Tutorial erstellen.
LG, Felix
Hi Felix,
ein Tut dazu wäre echt super!!!
Momentan knipse ich alle 10 Minuten ein Foto vom Stromzähler und schneide mit MovieMaker ein tägliches Zeitraffervideo zusammen.
Anderen Lösungen mit dem PI ein Zeitraffervideo zu erstellen scheitern an meiner Beschränktheit ☺
Gruß Ingo
Hallo Felix, vielen Dank für das super beschriebene Tutorial. Ich komme allerdings an einer bestimmten Stelle nicht weiter.
Beim Erstellen des wheels erhalte ich folge Meldung:
„Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
ERROR: tflite_runtime-2.5.0.post1-cp39-cp39-linux_armv7l.whl is not a supported wheel on this platform.“
Ich habe im Netz nach einer Lösung gesucht und es mit „pip install –upgrade pip setuptools wheel“ versucht. Auch habe ich es mit der aktuellen opencv-Version 4.5.5 versucht leider scheitert es bei mir immer an dieser Stelle und ich bin mit meinem laienhaftem Latein am Ende.
VG Björn
Okay, ich habe den „Fehler“ gefunden. Ich habe ein PI-OS 64bit-Version auf dem Raspi. Mit der tflite_runtime Version tflite_runtime-2.5.0.post1-cp39-cp39-linux_aarch64.whl scheint es nun zu funktionieren.
Den Link oben
Auf der offiziellen TensorFlow Webseite findet sich ein solches Model zum Download („Download starter model and labels“). Kopiere diesen Link (Rechtsklick) und ersetze ihn im folgenden Befehl ().
gibt es nicht mehr. Es kommt 404.
Da ich mit den Sachen hier neu bin, wäre eine korrekte URL super.
hallo
ich habe das problem das wenn ich mein model benutze immer die meldung bekomme index out of range, woran kann das liegen?