Für diejenigen, die KI-Anwendungen in eingebetteten Systemen entwickeln möchten, bietet TensorFlow Lite (TFLite) kleine und schnell laufende Modelle. Durch die Integration mit C++ können hochleistungsfähige Objekterkennungssysteme insbesondere auf Edge-Geräten wie Android-Geräten, Raspberry Pi und Nvidia Jetson eingerichtet werden.
In diesem Leitfaden wird Schritt für Schritt erklärt, wie Sie mit TensorFlow Lite C++ eine COCO-basierte Objekterkennungsanwendung von Grund auf entwickeln. Wir gehen auf jedes Detail ein, von der Leistungsoptimierung bis zum Label-Management.
Was ist TensorFlow Lite?
TensorFlow Lite ist eine von Google entwickelte Open-Source-Bibliothek, die es ermöglicht, TensorFlow-Modelle schnell auf Geräten mit geringem Stromverbrauch auszuführen.
-
Geringe Latenz
-
Kleine Modelldateien (.tflite)
-
Android/iOS/Linux-Unterstützung
-
C++, Java, Python, Swift Integrationen
⚙️ Vorbereitung: Erforderliche Dateien und Konfiguration
-
Ihre
.tflite
Modelldatei (mobilnetv2-ssd, yolov5-lite usw.) -
labelmap.txt
odercoco_labels.txt
(Klassennamen des COCO-Datensatzes) -
TensorFlow Lite C++ API
-
OpenCV (für die Bildverarbeitung)
-
Build-System mit CMake oder Makefile
sudo apt install libopencv-dev
Was ist ein COCO-Label?
COCO (Common Objects in Context) ist ein weit verbreiteter Datensatz zur Objekterkennung, der aus 80 Klassen besteht.
Beispielklassen:
-
person, bicycle, car, motorbike, airplane, dog, cat, chair, tv...
Die von Ihnen verwendete coco_labels.txt
-Datei sieht normalerweise wie folgt aus:
0
person
bicycle
car
...
Die erste Zeile sollte leer sein (Hintergrundklasse). Die Indexreihenfolge kann je nach Modell variieren.
️ Laden des TensorFlow Lite-Modells mit C++
#include "tensorflow/lite/model.h"
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/kernels/register.h"
#include "tensorflow/lite/tools/gen_op_registration.h"
std::unique_ptr model =
tflite::FlatBufferModel::BuildFromFile("model.tflite");
Interpreter-Konfiguration:
std::unique_ptr interpreter;
tflite::ops::builtin::BuiltinOpResolver resolver;
tflite::InterpreterBuilder(*model, resolver)(&interpreter);
interpreter->AllocateTensors();
Vorbereitung des Bildeingangs (mit OpenCV)
cv::Mat frame;
cv::resize(frame, resized, cv::Size(300, 300)); // Modell-Eingangsgröße
uint8_t* input = interpreter->typed_input_tensor(0);
memcpy(input, resized.data, 300 * 300 * 3);
Auslesen der Ausgabe-Tensoren
float* boxes = interpreter->typed_output_tensor(0);
float* class_ids = interpreter->typed_output_tensor(1);
float* scores = interpreter->typed_output_tensor(2);
int* detections = interpreter->typed_output_tensor(3);
Jede Box: [ymin, xmin, ymax, xmax] und alle Werte liegen zwischen 0 und 1.
Visualisierung der Erkennungsergebnisse
for (int i = 0; i < detections[0]; ++i) {
if (scores[i] > 0.5) {
int class_id = class_ids[i];
cv::rectangle(frame, cv::Rect(...));
cv::putText(frame, labels[class_id], ...);
}
}
Empfehlungen zur Leistungsverbesserung
-
Verwenden Sie ein quantisiertes Modell (INT8)
-
Verwendung von Delegates: GPU Delegate, NNAPI
-
Reduzieren Sie die Modellgröße (mobilnet vs.)
-
Reduzieren Sie die Eingangsgröße (300x300 → 224x224)
-
Begrenzen Sie die Analysezeit pro Frame
Raspberry Pi Anwendungsszenario
-
Installieren Sie Raspberry Pi OS Lite und kompilieren Sie die OpenCV + TFLite-Bibliotheken
-
Verwenden Sie das Raspberry Pi Camera Module oder schließen Sie eine USB-Kamera an
-
Erzielen Sie Echtzeit-Erkennung mit C++-Leistung anstelle von Python
-
Für GPU-gestützte Ausführung können Sie zusätzliche Hardware wie den Coral USB Accelerator verwenden
C++ Objekterkennung mit Android NDK
-
Die NDK-Installation erfolgt über Android Studio
-
Die TFLite C++ Library wird mit JNI aufgerufen
-
Die Kameraintegration kann mit dem OpenCV Android SDK erfolgen
-
Das .tflite-Modell wird zum
assets
-Ordner hinzugefügt und mit demAssetManager
geladen
❗️ Häufige Probleme und Lösungen
Problem | Beschreibung und Lösung |
---|---|
Inkompatibilität der Modell-Eingangsgröße | Passen Sie die Größe mit OpenCV resize an (z. B. 300x300) |
Interpreter AllocateTensors gibt einen Fehler aus | Die Modelldatei ist möglicherweise beschädigt. Stellen Sie sicher, dass die richtige Datei geladen wurde |
Anstelle des Klassennamens wird nur eine Zahl angezeigt | Lesen Sie die Label-Datei Zeile für Zeile und überprüfen Sie, ob die Indizes übereinstimmen |
Die Leistung ist sehr niedrig | Verwenden Sie ein INT8-quantisiertes Modell und aktivieren Sie die OpenGL-Beschleunigung auf dem Raspberry Pi |
Das Modell kann unter Android nicht geladen werden | Stellen Sie sicher, dass Sie die Datei aus dem assets-Ordner mit dem AssetManager öffnen |
Der Frame wird nicht sofort aktualisiert | Verbinden Sie den Kamerastream korrekt mit cv::VideoCapture |
Fazit
Das Einrichten von Echtzeit-Objekterkennungssystemen, die mit TensorFlow Lite auf C++-Seite laufen, ist dank weit verbreiteter Datensätze wie COCO sehr flexibel. Label-Management, Eingangs-/Ausgangs-Tensoranalyse, der Deployment-Prozess auf Geräten wie Raspberry Pi & Android und Leistungsoptimierungen sind die Schlüsselfaktoren für den Erfolg bei solchen Projekten.