SmartCart – Der smarte Einkaufswagen

Das Projekt des Jahres 2020! Zusammen mit Christoph Baschnagel & Marius Zimmermann wurde ein Einkaufswagen entwickelt, der automatisch seine Inhalte erkennen, die Gesamtsumme berechnen und den Checkout per PayPal abwickeln kann.

Projektidee

Die Projektidee ist ein intelligenter Einkaufswagen, der mit Hilfe von Objekterkennung in der Lage ist, selbstständig Produkte zu erkennen, die sich aktuell im Einkaufswagen befinden. Unser intelligenter Einkaufswagen hört auf den Namen SmartCart. In einem Dashboard werden dem Benutzer des SmartCarts alle notwendigen Informationen über die Produkte innerhalb seines Einkaufswagens angezeigt. Als Dashboard fungiert hierbei das Smartphone des Benutzers. Der in diesem Projekt entwickelte SmartCart soll den klassischen Einkaufswagen allerdings nicht ersetzen, sondern intelligente Funktionen als Nachrüstsatz ergänzen.

Entwicklung

Für den SmartCart wurde folgende Komponenten verwendet:

– ein Raspberry PI 4 mit 4 GB RAM

– eine Raspberry Pi Kamera V2 mit 8 Megapixel

– eine 20 kg Wägezelle / Gewichtssensor

– einen HX711 Modul

Die einzelnen Hardware-Komponenten wurden mit mehreren Jumper-Kabeln verbunden. Daraus ergibt sich folgenden schematischen Aufbau.

Wie der schematische Aufbau bereits erkennen lässt, bildet der Raspberry PI 4 das Herzstück des SmartCart. Auf dem Einplatinencomupter werden nicht nur die Daten der Kamera und des Gewichtsensors verarbeitet, sondern auch der selbst trainierte Objekterkennungsalgorithmus läuft auf dem Raspberry PI 4. Weiterführend bildet der Raspberry PI auch die Schnittstelle zur AWS-Cloud. Die hier verarbeiteten Daten bilden die Grundalge für die individuellen Dashboards der einzelnen SmartCarts. Die Raspberry Pi Kamera liefert die rohen Bilddaten, welche wiederum als Grundlage für den Objekterkennungsalgorithmus dienen.

Weitere wichtige Bausteine des SmartCarts bilden die Wägezelle und das HX711 Modul. Durch das Zusammenspiel dieser beiden Komponenten kann der SmartCart ununterbrochen das Gesamtgewicht des Inhaltes messen. Eine Kombination dieser beiden Komponenten ist notwendig, da die eingesetzte Wägezelle einen analogen Wert ermittelt, der durch das verwendete HX711 Modul in einen digitalen Wert umgewandelt wird. Diese Umwandlung ist erforderlich, damit die ermittelten Werte von dem angeschlossenen Raspberry PI verarbeitet werden können. Weiterführend wird die Kontrolle des Gewichts benötigt, um erkennen zu können, ob ein Produkt in den SmartCart hineingelegt (Gewichtszunahme) oder herausgenommen (Gewichtsabnahme) wurde. Zusätzlich werden diese Komponenten auch zur Aktivierung des SmartCarts eingesetzt.

Objekterkennung mit SSD MobileNet V2

Um unsere Objekterkennung zu realisieren, benutzen wir die Machine Learning Library Tensorflow, bereitgestellt von Google. Tensorflow bietet die Möglichkeit, Modelle für Objekteerkennung und andere Machine Learning Probleme umzusetzen und zu trainieren. Unsere Hauptanforderungen an das Modell war eine hohe Geschwindigkeit, da der Raspberry Pi Prozessor lediglich über eine Taktung von 1,4 GHz auf 4 Kernen verfügt. [Dies bedeutet eine entscheidende Einschränkung der Berechnungskapazitäten. Aus diesem Grund haben wir uns für eine für Geschwindigkeit optimierte Architektur entschieden. Das Modell basiert auf einer SSD MobileNet V2 Architektur. Diese ist konfiguriert mit einer Inputbildgröße von 300 auf 300 Pixel. Außerdem ist es als Tensorflow Lite Modell formatiert und alle Gewichte des neuronalen Netzes werden als 8-bit Integer abgespeichert (statt 32-bit Floats). All diese Faktoren sorgen für maximale Geschwindigkeit und ermöglichen Echtzeit Objekterkennung auf dem Raspberry Pi. Wir sehen die schnelle Erkennung der Objekte durch die Kamera als wichtiges Kriterium für eine gute User-Experience an. Aus diesem Grund erhielt der On-Device Inference Ansatz Vorrang vor einem möglichen Ansatz, der die Inference in die Cloud verlegt. Das Modell wurde mit unserem eigens erstellen Datenset trainiert. Dieses setzt sich aus den folgenden 8 Klassen zusammen:

– Apfel
– Aubergine – Orange
– Birne
– Banane
– Paprika
– Gurke
– Brokkoli

Für jede dieser Klassen wurden ungefähr 500 Bilder aufgenommen und annotiert.

Die Annotationen wurden entweder von Hand gezeichnet oder von unserem eigens entwickelten Image Capturing Program vollzogen, welches die Annotationen bereits selbst zum Zeitpunkt der Aufnahme vornimmt. Alle Bilder wurden hierbei nochmals durch einen menschlichen Betrachter verifiziert. Somit besteht unser Datenset aus 4000 Bildern, aufgeteilt in 95% Trainingsset und 5% Testset.

Mit Hilfe des TensorFlow Object Detection API wurde auf diese Daten ein Transfer Learning Ansatz angewandt. Dieser baut unser Modell auf einem bereits auf dem MS COCO Datenset trainierten Modell auf. Um darzustellen, wie das Modell konfiguriert wurde, finden sich folgend einige der relevantesten Hyperparameter:

  • Convolutional Layer Activation Function: Rectified Linear Unit (RELU)
  • Regularizer: L2
  • Random Initialization mit Standardabweichung von 0,03
  • Classification Loss Function: Gewichtete Sigmoid
  • Non-Max Suppression Threshold: 0,6 IoU
  • Batch Size: 6
  • Learning Rate: 0,004 mit Decay

Trainiert wurde das Modell für ca. 120.000 Schritte auf einem Nvidia Tesla K80 GPU, der auf der Google Cloud Plattform angemietet wurde. Die Dauer für einen Trainingslauf betrug ca. 30 Stunden.

Ergebnis

Das SSD MobileNet lieferte uns nach mehreren Iterationen (Label, Train, Evalulate) eine hohe Genauigkeit von > 85% mAP für den Großteil der Klassen. Aus Zeitgründen könnte dieser Zyklus nicht weiter optimiert werden, jedoch waren Geschwindigkeit und Genauigkeit ausreichend für die Anwendung auf dem RaspberryPi.

Um das trainierte Modell innerhalb der Klasse einzurichten, werden zuerst das Modell sowie die dazugehörige Labelmap geladen. Anschließend werden der Input Tensor (Frame) sowie die Output Tensors (Bounding Boxes, Klassen, Scores und Anzahl erkannter Objekte) zugeordnet. Nach dem das Bild aus dem Video Stream ausgelesen wurde, wird es zuerst von BGR auf RGB umcodiert und für die Inference auf 300 mal 300 Pixel reduziert. Anschließend wird das Bild analysiert und die Ergebnisse extrahiert. Die Ergebnisse der Inference werden nun ausgewertet und auf dem Frame eingeblendet.

Das Skript bietet neben der standardmäßig benutzen Tensorflow Lite Runtime ebenfalls die Möglichkeit, Inference auf einem Edge TPU von Coral durchzuführen. Dieser ist optimiert für die Operationen des von uns verwendeten SSD MobileNets und kann somit zu einer deutlich schnellere Inference und daraus resultierend auch zu einer höheren Framerate führen.

Um diesen Artikel nicht zu lang zu gestalten, finden Sie die ausführliche Dokumentation inklusive des Cloud Dashboards sowie des Zusammenspiels von Kamera und Waage in der unten verlinkten Dokumentation.

GitHub Repository & Dokumentation

Dokumentation: http://sickai.de/wp-content/uploads/2021/02/IoX_Coding_Innovation_-_BZS_Website.pdf

GitHub: https://github.com/leonsick/smartcart-bzs

Image Capturing Program – Annotation Acceleration

Als Teil des SmartCart Projektes wurde ein Programm entwickelt, dass für jedes aufgenommene Bild ein Label inkl. Bounding Box vorschlagen kann.

Beschreibung

Da für das SmartCart Projekt ein Objekterkennungsmodell trainiert werden musste, bedarf es an einem großen und diversen Datenset, dass alle Objektklassen, die die Kamera erkennen sollte, beinhaltet. Nach ausgiebiger Recherche stellt sich heraus, das ein solches Datenset noch nicht existierte. Daher wurden zuerst insgesamt 500 Bilder insgesamt über alle Klassen aufgenommen und gelabelt. Jedoch wurde ein noch diverseres und größeres Datenset für das Training benötigt. Um dies zu beschleunigen wurde ein Programm entwickelt, dass bereits einen Labelvorschlag für jeden Frame eines Videostreams vorschlägt.

Entwicklung

Zuerst wurde basierend auf dem bereits vorhandenen Datenset ein FasterRCNN trainiert. Dieses TensorFlow Modell wurde in ein Python Skript integriert. Das Skript hatte die Funktion, die Webcam des Laptops zu öffnen und real-time Objekterkennung auf dem Video Stream auszuführen. Mit einem Tipp auf die Leertaste konnte ein Bild ohne Labels aufgenommen werden, mit einem Tipp auf die Taste A konnten das Bild sowie alle Annotationen im Pascal VOC Format abgespeichert werden. So konnten innerhalb über 3500 Bilder erstellt und gelabelt werden. Diese wurde im Folgenden noch auf die korrekten Labels überprüft und dann dem Datenset hinzugefügt.

Ergebnis

Das Programm kann auf Unix-basierten Systemen mit ausreichender CPU Performance genutzt werden. Es ist zum freien Download auf GitHub verfügbar, muss jedoch auf die individuellen Anforderungen (Klassen, Labels, etc.) angepasst werden.

GitHub Link zum Projekt: https://github.com/leonsick/Image-Capturing-Program