KI-basierte Wasserzählerablesung (Teil 1): Bringen Sie Ihren alten Zähler ins IoT!

Intelligente Wasserzähler sind bereits seit einiger Zeit auf dem Markt, aber das Ersetzen unserer alten Zähler gestaltet sich oft nicht so einfach, aus technischen oder bürokratischen Gründen. Mit diesem Projekt kann ein analoger Zähler jeglicher Art mithilfe einer ESP32-CAM Plattform und eines künstlichen Intelligenz (KI) system. Da wir auch viele Hintergrundinformationen in diesem Artikel enthüllen werden, haben wir ihn in zwei Teile aufgeteilt.

Italien ist eines der europäischen Länder, das am meisten Wasser für den zivilen Gebrauch entnimmt und verbraucht, nur noch übertroffen von Griechenland. Diese Zahlen sind besorgniserregend, insbesondere vor dem Hintergrund der Wasserkrisen, die unser Land regelmäßig treffen. Die durchschnittliche Verfügbarkeit ist in den letzten drei Jahren um etwa 19 % gesunken, verschärft durch zunehmend heiße Temperaturen und einen Mangel an Niederschlägen. Dieses Problem ist nicht nur in Italien vorhanden, und mehrere Nationen ergreifen drastische Gegenmaßnahmen, wie die Begrenzung des Verbrauchs oder die Bereitstellung von Mitteln zur Renovierung privater oder staatlicher Verteilanlagen, um Leckagen zu vermeiden.

Darüber hinaus haben mehrere Versorgungsunternehmen in den letzten Jahren Schritte unternommen, um die Ablesung der Zähler für Zivilpersonen effizienter zu gestalten. Diese Maßnahme dient dazu, die Verschwendung des Rohstoffs zu vermeiden, aber auch die Ablesungen, die von Haus zu Haus von Betreibern durchgeführt werden, zu reduzieren.
In diesem Artikel werden wir dieses Problem ansprechen: die Ablesung eines analogen Zählers, um ihn digital zu machen und die Werte an uns oder an einen unserer Server zu übertragen. Das Ganze basiert auf einer ESP32-CAM, einer Plattform, die vielen bereits bekannt ist, und einem KI-System, das Fotos erkennen und in potenzielle Ablesungen übersetzen kann.

Abonnieren
Tag-Benachrichtigung zu ESP32 jetzt abonnieren!

Architektur

Künstliche Intelligenz (KI)-Systeme sind auf vielfältige Weise in unseren Alltag eingezogen, denken Sie nur an Sprachassistenten oder Bilderkennung. Für die komplexen Berechnungen, mit denen ein KI-System umgehen muss, ist es möglich, sich auf Cloud-Computing-Plattformen oder dedizierte Online-Plattformen zu verlassen, oder sie direkt auf dem Chip, im sogenannten Edge Computing, durchzuführen. Mit der zunehmenden Verbesserung von Prozessoren breitet sich dieser zweite Verarbeitungsmodus aus und bildet die Grundlage unseres Projekts.

Dabei werden ein KI-Netzwerk und ein ESP32-CAM zusammenarbeiten, um dem Benutzer ein digitales Ergebnis zu liefern, das durch digitales Fotografieren eines klassischen analogen Wasserzählers erzielt wird. Die Erkennung und Digitalisierung erfolgt durch den ESP32-CAM mithilfe eines Convolutional Neural Networks (CNN), auf das wir später im Artikel eingehen werden.

Der erste Schritt bei der Umsetzung unseres Projekts besteht darin, die Firmware auf unserem ESP32-CAM zu installieren. Anschließend benötigen wir eine Kalibrierungsphase, in der wir die Bereiche identifizieren, die für die Erkennung der Zahlen und Anzeigen auf unserem Zähler vorgesehen sind. Sobald dies abgeschlossen ist, haben wir alle Informationen verfügbar, um sie digital dorthin zu senden, wo wir es wünschen.

Neuronale Netze und KI

Neuronale Netze sind rechnerische Modelle, die von der Funktionsweise des menschlichen Gehirns inspiriert sind. Es sind KI-Systeme, die versuchen, die Art und Weise nachzuahmen, wie das Gehirn Informationen verarbeitet. Neuronale Netze werden in maschinellem Lernen verwendet, einem Bereich, der sich damit befasst, Computer zu trainieren, bestimmte Aufgaben auszuführen, ohne explizit dafür programmiert zu sein.

Neuronale Netze spielen eine entscheidende Rolle in Deep-Learning-Modellen, einem Bereich des maschinellen Lernens, der sich auf die Verarbeitung komplexer Daten konzentriert. Sie bestehen aus rechnerischen Einheiten, die als künstliche Neuronen oder Knoten bezeichnet werden. Diese Neuronen sind über künstliche Verbindungen, sogenannte Gewichte, miteinander verbunden. Jede Verbindung hat einen zugeordneten numerischen Wert, der die Bedeutung der Verbindung für das Modell darstellt.
Neuronale Netzwerke sind in Schichten organisiert, wobei eine oder mehrere Schichten zwischen der Eingabeschicht und der Ausgabeschicht verborgen sind. Die erste Schicht, die Eingabeschicht genannt wird, empfängt die Eingabedaten. Die mittleren Schichten, genannt versteckte Schichten, verarbeiten die Informationen durch ihre Neuronen. Schließlich erzeugt die letzte Schicht, die Ausgabeschicht genannt wird, die gewünschten Ergebnisse, wie in Figur 1 schematisch dargestellt.

Figur 1: Neuronale Netze bestehen aus einer Eingabeschicht, einer Ausgabeschicht und vielen Zwischenschichten, die als versteckte Schichten bezeichnet werden.

Neuronale Netze können in einer Vielzahl von Anwendungen eingesetzt werden, wie zum Beispiel maschinelle Übersetzung, natürliche Sprachverarbeitung, medizinische Diagnose und in unserem Fall Bilderkennung. In diesem speziellen Fall werden während des Trainingsprozesses Filter auf das Bild in verschiedenen Auflösungen angewendet, und die Ausgabe jedes verarbeiteten Bildes wird als Eingabe für die nächste Schicht verwendet. Die Filter beginnen mit grundlegenden Merkmalen wie Helligkeit oder Kanten und werden mit zunehmendem Fortschritt immer komplexer, einschließlich Merkmalen, die das Objekt eindeutig definieren.

Convolutional Neural Networks (CNNs) sind eine spezielle Art von neuronalen Netzwerken, die für die effiziente Verarbeitung strukturierter Daten wie Bilder oder Video entwickelt wurden. Was CNNs von traditionellen neuronalen Netzwerken unterscheidet, ist die Verwendung einer Operation namens Faltung. Während der Faltung gleitet ein kleines Fenster namens Filter oder Kernel über das Eingabebild, und eine Reihe mathematischer Operationen werden auf jeden Teil des Bildes angewendet. Dieser Prozess ermöglicht es CNNs, relevante Merkmale wie Kanten, Texturen oder Muster automatisch und effizient aus den Bildern zu extrahieren.

Diese Netzwerke bestehen auch aus einer Eingabeschicht, einer Ausgabeschicht und vielen Zwischenschichten, die als versteckte Schichten bezeichnet werden. Sie enthalten drei Haupttypen von Schichten, nämlich:

  • Faltungsschicht
  • Pooling-Schicht
  • Vollständig verbundene (VV) Schicht.

Die Faltungsschicht ist die erste Schicht eines Convolutional Neural Networks. Er ist dafür verantwortlich, die herausragenden Merkmale aus dem Eingabebild zu extrahieren. Auf Convolutional-Schichten können weitere Convolutional-Schichten oder Pooling-Schichten folgen. Anschließende Convolutional-Schichten verarbeiten weiterhin die Merkmale, die aus den vorherigen Schichten extrahiert wurden, was dem Netzwerk ermöglicht, immer komplexere und abstraktere Merkmale zu erlernen.

Die vollständig verbundene Schicht, auch Ausgabeschicht genannt, ist die letzte Schicht eines CNNs. Auf dieser Ebene werden die extrahierten Merkmale verwendet, um Vorhersagen oder Klassifizierungen zu treffen. Diese Ebene ist dafür verantwortlich, die endgültige Ausgabe des Convolutional Neural Networks bereitzustellen.
Mit jeder Ebene nimmt die Komplexität des CNN zu, während das Netzwerk immer anspruchsvollere und abstraktere Merkmale des Eingabebildes lernt. Darüber hinaus nimmt mit dem Fortschreiten durch die Faltungsebenen der Teil des Bildes zu, der von dem neuronalen Netzwerk identifiziert und im Detail analysiert wird, wie in Figur 2 dargestellt. Im Gegensatz zu einem traditionellen neuronalen Netzwerk hat ein CNN gemeinsame Gewichte und Versatzwerte, die für alle Neuronen versteckt in einer bestimmten Schicht gleich sind. Nachdem die Merkmale in mehreren Schichten gelernt wurden, geht die Architektur eines CNN zur Klassifizierung über.

Figur 2: Mit jeder Schicht nimmt die Komplexität des CNN zu.

Die vorletzte Schicht ist eine vollständig verbundene Schicht, die einen Vektor der Größe K erzeugt (wobei K die Anzahl der vorhersagbaren Klassen ist) und die Wahrscheinlichkeiten für jede Klasse eines klassifizierten Bildes enthält. Die letzte Schicht der CNN-Architektur verwendet eine Klassifizierungsschicht, um die Ausgabe der endgültigen Klassifizierung bereitzustellen. In der Regel gibt es vortrainierte Modelle dieser Netzwerke, die offensichtlich mehrere MB oder GB wiegen. In unserem Fall werden dies ein paar MB sein, aber sie werden auf der SD-Karte gespeichert, um den internen Speicher des Chips nicht zu belasten.

Konkret gibt es mehrere Dateien im Konfigurationsordner mit der Erweiterung tflite, was für Tensorflow Lite steht. TensorFlow, hervorgegangen aus Google Brain im Jahr 2015, hat sich zu einer Referenzbibliothek für die Erstellung von Deep-Learning-Modellen entwickelt. Ursprünglich intern von Google entwickelt, wurde es Open Source gemacht und erlangte schnell Popularität in der maschinellen Lerngemeinschaft. Es bietet eine breite Palette von Maschinenlern- und Deep-Learning-Modellen und -Algorithmen, die als neuronale Netze bekannt sind, und stellt sie Entwicklern über eine intuitive API zur Verfügung.

TensorFlow nutzt die Leistung von Python oder JavaScript, um eine benutzerfreundliche Programmierschnittstelle für die Erstellung von Anwendungen bereitzustellen. Die Ausführung solcher Anwendungen erfolgt jedoch in C++, was eine hohe Rechenleistung ermöglicht. Dies macht TensorFlow zu einer vielseitigen Wahl für groß angelegte maschinelle Lernprojekte.

Mit TensorFlow trainierte Modelle können auch auf mobilen oder Edge-Computing-Geräten implementiert werden, wie in unserem Fall, sowie auf iOS- oder Android-Betriebssystemen. Das TensorFlow-Ökosystem bietet Tools wie TensorFlow Lite, das TensorFlow-Modelle optimiert, um effizient auf solchen Geräten ausgeführt zu werden. Mit TensorFlow Lite kann ein Kompromiss zwischen der Größe des Modells und seiner Genauigkeit gefunden werden. Ein kleineres Modell kann weniger Platz einnehmen, wie z. B. 12 MB statt 25 MB oder sogar mehr als 100 MB, kann jedoch eine geringfügige Reduzierung der Genauigkeit aufweisen. Diese Genauigkeitsverlust ist jedoch oft vernachlässigbar, wenn man die Geschwindigkeits- und Energieeffizienzvorteile berücksichtigt, die das komprimierte Modell bietet.

IIn unserem Fall wird dieses mit TensorFlow trainierte Modell verwendet, um Zahlen innerhalb des Zählers zu unterscheiden und zu erkennen und die Richtung der Anzeiger zu bestimmen. Mit Hilfe von TensorFlow werden wir die Leistung des Deep Learning für die Datenanalyse und KI nutzen können, um die Effizienz und Genauigkeit unserer Anwendungen zu verbessern.

Abonnieren
Tag-Benachrichtigung zu Artificial Intelligence jetzt abonnieren!

Hardware

Wie bereits erwähnt, ist die gewählte Plattform das ESP32-CAM von AI-Thinker, das dank seiner kompakten Größe (40,5 × 27 × 4,5 mm) das heilige Gral für jeden Bastler sein könnte. Als Nachfolger des bekannten ESP8266, über den wir später sprechen werden, besteht es aus einem ESP32-Modul mit einem Anschluss - dessen Pinbelegung in Figur 3 sichtbar ist - zur Aufnahme eines separaten Kameramoduls und einem Steckplatz für eine SD-Karte bis zu einer maximalen Größe von 4 GB. Im Detail sehen wir einen programmierbaren Mikrocontroller mit integriertem Wi-Fi und Bluetooth sowie einem zusätzlichen externen RAM von bis zu 4 MB.

Figur 3: Pinbelegung des ESP32-CAM-Moduls.

Nicht nur das, der neue Kameraanschluss kann entweder ein OV2640- oder OV7670-Modul einbetten; ersteres wird mit dem Modul selbst geliefert und hat eine Auflösung von 2 Megapixeln. Seine SPI-Geschwindigkeit beträgt 8 MHz und die Größe des Bildpuffers beträgt 384 KB. Der normale Stromverbrauch beträgt 70 mA, während er im Stromsparmodus nur 20 mA verbraucht, was ihn auch aufgrund seiner geringen Leistungsaufnahme wünschenswert macht.

Auf der Platine befindet sich auch eine Hochhelligkeits-LED (Figur 4), die als Blitz oder Beleuchtung der zu filmenden Szene verwendet werden kann. Diese Funktion ist für unser Projekt entscheidend, da es in der Regel in sehr dunklen Umgebungen platziert wird. Wir werden sehen, dass es möglich sein wird, dieses Licht zu modulieren, um das gewünschte Ergebnis zu erzielen. Natürlich, sollte dies nicht ausreichen, ermöglichen uns die zahlreichen GPIOs auf der Platine möglicherweise, bei schlechten Lichtverhältnissen einen externen Beleuchtungskörper anzubringen.

Figur 4: Der ESP32-CAM ist das Herz dieses Projekts.

Für kleine Anwendungen wirkt dieser Chip sehr robust und verfügt über eine hohe Verarbeitungsleistung, die auf 2 x 32-Bit-Kernen mit 120 MHz beruht. Diese letzte Eigenschaft ermöglicht es ihm, eine recht hohe Bildwiederholrate zu haben, abhängig vom Format und der Größe: Indikativ können wir eine Durchsatz von bis zu 8 JPEGs in SVGA (800x600) pro Sekunde erreichen.

Die Programmierung unseres ESP32-CAM-Moduls kann auf verschiedene Arten erfolgen: Die klassischste Methode beinhaltet die Verwendung eines Adapters von FTDI (Figur 5)), der dank der FT232RL-Schnittstelle RS-232- und COM-Ports simuliert und somit ein schnelles Plug-and-Play des Geräts ermöglicht.

Figur 5: Der USB/TTL-Wandler mit FT232RL.

Hinweis des Herausgebers: Das im "Ähnliche Produkte" Rahmen am Ende dieses Artikels vorgeschlagene Modul - vollständig stiftkompatibel und im Elektor Store erhältlich - integriert einen Micro-USB-Anschluss mit der entsprechenden seriellen Schnittstelle zum Chipsatz, wodurch externe serielle Adapter überflüssig werden.

Falls Sie das oben genannte Objekt nicht zur Verfügung haben, verzweifeln Sie nicht; tatsächlich kann dies von jedem Modul aus erfolgen, bei dem die TX- und RX-Pins vorhanden sind, also von verschiedenen Modellen von Arduino oder ESP.

Verdrahtung für die Programmierung des ESP32-CAM

Aus dem oben genannten Grund können verschiedene Arten von Verdrahtungen ähnlich, aber in einigen Aspekten unterschiedlich sein. Im Allgemeinen verfügt das ESP32-CAM-Modul nicht über USB, um direkt mit dem PC zu kommunizieren, und genau deshalb müssen wir ein externes Modul verwenden.

Beginnen wir mit dem klassischsten Modul: dem Arduino UNO. Als ersten Schritt identifizieren wir die Übertragungs- und Empfangspins auf unserem ESP32-CAM, die U0TXD bzw. U0RXD genannt werden. Diese müssen direkt mit den TX- und RX-Pins unseres Arduino verbunden werden. In dem Kameramodul entsprechen diese Pins auch den GPIO1- und GPIO3-Pins. Als nächstes verbinden wir die GND- und IO0-Kontakte auf dem ESP32-CAM, um eine ordnungsgemäße Kommunikation sicherzustellen. Für die Stromversorgung verbinden wir die 5V- und GND-Pins der beiden Plattformen parallel.

Schließlich, um den Arduino bei Bedarf zurückzusetzen, verbinden wir den RESET-Pin und den GND-Pin kurz. Zusammenfassend ergibt sich das Diagramm in Figur 6, das auch in Tabelle 1 dargestellt ist.
 

Figur 6: Das ESP32-CAM-Modul kann mit dem Arduino UNO programmiert werden.

Tabelle 1: Verkabelung von Arduino zu ESP32-CAM.

Arduino ⇒ ESP32-CAM Arduino ESP32-CAM
TX ⇒ U0TXD Reset ⇒ GND GPIO0 ⇒ GND
RX ⇒ U0RXD    
5V ⇒ 5V    
     

Wenn wir keinen Arduino UNO, sondern einen ESP8266 haben, ändert sich die Verdrahtung, aber nur sehr wenig. Tatsächlich ist die einzige erwähnenswerte Änderung die Kontakte, die auf unserem Programmiermodul kurzgeschlossen werden müssen: Sie sind nicht mehr RESET und GND, sondern EN und GND. Die Verdrahtung wird in Figur 7 gezeigt und auch in Tabelle 2 angegeben.

Figur 7: Verdrahtung zum Programmieren des ESP32-CAM mit einem ESP8266.

Tabelle 2: Verkabelung von ESP8266 zu ESP32-CAM.

ESP8266 ⇒ ESP32-CAM ESP8266 ESP32-CAM
TX ⇒ U0TXD EN ⇒ GND RX ⇒ U0RXD
5V ⇒ 5V    
GND ⇒ GND    

Schließlich die einfachste Verdrahtung von allen. Tatsächlich, wenn wir ein USB/TTL-Konvertermodul auf Basis des FTDI-Chips besitzen, ist das Ganze mit einer weniger Verbindung gelöst. Auf der Programmiererseite müssen wir tatsächlich nichts mehr kurzschließen, sondern müssen die TX- und RX-Kontakte miteinander austauschen, wie in Figur 8 und in Tabelle 3 gezeigt.

Figur 8: Verkabelung für die Programmierung mit einem USB/TTL-Wandler.

 

Tabelle 3: Verkabelung von FTDI zu ESP32-CAM.

FTDI ESP32-CAM
RX U0TXD
TX U0RXD
5V 5V
GND GND


Die beschriebenen Verbindungen werden nur während der Programmierphase des ESP32-CAM benötigt. Sobald die Programmierung abgeschlossen ist, versorgen Sie das ESP32-CAM-Modul einfach nur mit den 5V- und GND-Stromleitungen. Es ist nicht mehr erforderlich, es direkt mit dem Arduino zu verbinden oder andere Verkabelungen vorzunehmen.
In der zweiten und letzten Folge dieses Artikels werden wir das Verfahren für die Firmware-Installation, die korrekte Einstellung der Kameraobjektive für eine optimale Fokussierung, die Positionierung des Lesegeräts am Wasserzähler und natürlich den gesamten KI-basierten Prozess für die korrekte Erkennung und Ablesung der Elemente des Zählers sehen. Bleiben Sie dran!


Hinweis des Herausgebers: Interessiert an ESP32 und DIY-Projekten? Dieses Projekt erschien ursprünglich in Elettronica IN
 
 
  
Abonnieren
Tag-Benachrichtigung zu Embedded & AI jetzt abonnieren!