NEWS
Wasserzähler - Selfmade
-
@Stev8176 Könnte sein. Schick mir einfach ein paar kritische falsch erkannte 8er, ich baue die dann am WE ein.
-
@Stev8176 Hi Steve,
das reicht mir so mit den Bilder. Ich teache sie am Wochenende. Noch ein Hinweis: deine Zimmer haben relativ viel Rand:

Das in Kombination mit einem deutlich helleren Hintergrund bringt dann irgendwann die Ziffernerkennung an die Grenzen.
Neben meinem Teachen könntest du auch mal einen etwas kleineren Bildausschnitt wählen. Ich wäre neugierig, ob das schon reicht.
Beste Grüße,
jomjol -
@Stev8176 Hi Steve,
das reicht mir so mit den Bilder. Ich teache sie am Wochenende. Noch ein Hinweis: deine Zimmer haben relativ viel Rand:

Das in Kombination mit einem deutlich helleren Hintergrund bringt dann irgendwann die Ziffernerkennung an die Grenzen.
Neben meinem Teachen könntest du auch mal einen etwas kleineren Bildausschnitt wählen. Ich wäre neugierig, ob das schon reicht.
Beste Grüße,
jomjol@Stev8176 Das neu trainierte Netzwerk ist verfügbar:
https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_CNN_Digital-Readout_Version_6.1.0.h5oder als tflite:
https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_CNN_Digital-Readout_Version_6.1.0.tfliteAktuell habe ich es noch nicht in die Rolling, ... eingebunden - daher bitte manuel in deiner Config ändern.
Gruß,
jomjol -
Ich habe in meinem Haus schon länger den Strom- und Heizungsverbrauch erfasst. Einzig der Wasserzähler fehlte noch aufgrund seiner analogen Natur.
Update 23.02.2020: Inzwischen gibt es ein graphisches Tool zum Erstellen der Konfiguration per WYSIWYG (Referenzbilder, ROIs, Parameter, ...):
http://wasserzaehler.ignorelist.com
Es ist noch im Beta-Status, daher bitte ich gerne um Feedback und etwas Geduld.Jetzt habe ich eine selfmade Lösung entwickelt, die zuverlässig funktioniert und das möchte ich gerne mit der Community teilen, auch um weitere Anregungen zu bekommen.
Das Grundprinzip basiert auf einer Kamera mit ESP8266-Steuerung, die regelmäßig ein Bild aufnimmt, durch eine Bilderkennung auswertet und den Zählerstand digitalisiert:

Die einzelnen Komponten sind entweder auf Thingiverse oder GitHub veröffentlicht. Dort findet ihr auch die 3D-Printfiles, Schaltung und Software für die Datenauswertung.
Überblick: https://github.com/jomjol/water-meter-measurement-system
- 3D-Druck Halterung für ESP32-CAM: https://www.thingiverse.com/thing:3860911 <- RECOMMENDED
- Bildaufnahme: https://github.com/jomjol/water-meter-picture-provider
- Server für Bildverarbeituung: https://github.com/jomjol/water-meter-system-complete
auch als lauffähiges Docker Image verfügbar - WYSIWYG-Tool zum Einstellen des Servers: http://wasserzaehler.ignorelist.com
Details zur Signalverarbeitung:
- Alignment und Zerlegen des Bildes: https://github.com/jomjol/water-meter-image-cut
- Bilderkennung für Zeiger: https://github.com/jomjol/neural-network-analog-needle-readout
- OCR für Digits: https://github.com/jomjol/neural-network-digital-counter-readout
Ich habe jetzt jede Komponente und auch einen vollständigen Server veröffentlicht.
Stehe gerne für Feedback und Fragen zur Verfügung.Beste Grüße,
Jomjol
Hallo,
zunächst vielen Dank für das tolle Projekt - bin beeindruckt.
Konnte der sehr ausführlichen Anleitung auch folgen.
Leider bleibe ich an einem blöden Punkt hängen - der Rotation des Bildes.Lade ich das bild direkt von der ESP-cam runter, ist es um 88,71° verdreht.

Zur Erstellung der Config habe ich gemäß der Anleitung: die Referenzpunkt gesetzt. Dafür habe ich gimp benutzt.
Also mit gimp das Bild um 88.71° gedreht und die Koordinaten ermittelt.
Die Drehung ( initial_rotation_angle=88.71) in die Config eingetragen und getestet.
Das kam dabei heraus:

Hmm....Um zu checken ob ich die Koordinaten oder etwas anderes falsch eingetragen habe, habe ich in gimp das um 88.71 gedrehte Bild abgespeichert, am Server die config geändert (initial_rotation_angle=0) und dem Server dann das gedrehte Bild analysieren lassen - Ergebnis war Perfekt:

Ich bin jetzt etwas ratlos, Erkennung läuft aber die Rotation der Aufnahme funktioniert nicht. Wenn ich die Kamera so drehe, dass das Bild direkt richtig herum steht, gibt es ungünstige Reflektoren.
Jemand einen Tipp ??
-
Hallo,
zunächst vielen Dank für das tolle Projekt - bin beeindruckt.
Konnte der sehr ausführlichen Anleitung auch folgen.
Leider bleibe ich an einem blöden Punkt hängen - der Rotation des Bildes.Lade ich das bild direkt von der ESP-cam runter, ist es um 88,71° verdreht.

Zur Erstellung der Config habe ich gemäß der Anleitung: die Referenzpunkt gesetzt. Dafür habe ich gimp benutzt.
Also mit gimp das Bild um 88.71° gedreht und die Koordinaten ermittelt.
Die Drehung ( initial_rotation_angle=88.71) in die Config eingetragen und getestet.
Das kam dabei heraus:

Hmm....Um zu checken ob ich die Koordinaten oder etwas anderes falsch eingetragen habe, habe ich in gimp das um 88.71 gedrehte Bild abgespeichert, am Server die config geändert (initial_rotation_angle=0) und dem Server dann das gedrehte Bild analysieren lassen - Ergebnis war Perfekt:

Ich bin jetzt etwas ratlos, Erkennung läuft aber die Rotation der Aufnahme funktioniert nicht. Wenn ich die Kamera so drehe, dass das Bild direkt richtig herum steht, gibt es ungünstige Reflektoren.
Jemand einen Tipp ??
@ehome deine 3 Referenz Punkte stimmen nicht.
Hast du zum einrichten diese Seite benutzt?
http://wasserzaehler.ignorelist.com/
Wenn nicht, dann versuche deine config.ini damit zu erstellen -
Hallo,
zunächst vielen Dank für das tolle Projekt - bin beeindruckt.
Konnte der sehr ausführlichen Anleitung auch folgen.
Leider bleibe ich an einem blöden Punkt hängen - der Rotation des Bildes.Lade ich das bild direkt von der ESP-cam runter, ist es um 88,71° verdreht.

Zur Erstellung der Config habe ich gemäß der Anleitung: die Referenzpunkt gesetzt. Dafür habe ich gimp benutzt.
Also mit gimp das Bild um 88.71° gedreht und die Koordinaten ermittelt.
Die Drehung ( initial_rotation_angle=88.71) in die Config eingetragen und getestet.
Das kam dabei heraus:

Hmm....Um zu checken ob ich die Koordinaten oder etwas anderes falsch eingetragen habe, habe ich in gimp das um 88.71 gedrehte Bild abgespeichert, am Server die config geändert (initial_rotation_angle=0) und dem Server dann das gedrehte Bild analysieren lassen - Ergebnis war Perfekt:

Ich bin jetzt etwas ratlos, Erkennung läuft aber die Rotation der Aufnahme funktioniert nicht. Wenn ich die Kamera so drehe, dass das Bild direkt richtig herum steht, gibt es ungünstige Reflektoren.
Jemand einen Tipp ??
@ehome Es könnte auch sein, dass die Kommazahlen bei der Drehung nicht passen. Es reicht völlig, wenn du auf 1° genau drehst. Den Rest macht dann das Referenzaligment.
Wenn durch die 88.71 um irgendeinen Winkel gedreht sind, dann findet er irgendwann die Referenzen auch nicht mehr. -
@Stev8176 Das neu trainierte Netzwerk ist verfügbar:
https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_CNN_Digital-Readout_Version_6.1.0.h5oder als tflite:
https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_CNN_Digital-Readout_Version_6.1.0.tfliteAktuell habe ich es noch nicht in die Rolling, ... eingebunden - daher bitte manuel in deiner Config ändern.
Gruß,
jomjol@jomjol
Danke für das Teachen, und auch den Tip mit dem weniger Rand. Läuft bis jetzt super. Ich bin mal gespannt ob jetzt alles stabile läuft.Und noch ein hinweise für alle: nach dem ich dem ESP32CAM Modul an den 5V einen 470µF Elko spendiert habe habe ich auch keine Timeout beim Capture
Ich war auch schon am überlegen eine neue Hardware für die Camera zu designen :) -
@ehome Es könnte auch sein, dass die Kommazahlen bei der Drehung nicht passen. Es reicht völlig, wenn du auf 1° genau drehst. Den Rest macht dann das Referenzaligment.
Wenn durch die 88.71 um irgendeinen Winkel gedreht sind, dann findet er irgendwann die Referenzen auch nicht mehr.@jomjol, @Knallochse
Danke klappt nun ABER:
mit der config-Datei, die durch die Webseite generiert wurde startete der Server nicht mehr, habe dann die std-Config genommen und die Koordinaten aus der generierten übertragen - dann lief es.
Leider konnte ich nicht feststellen wo genau das Problem mit der generierten lag, da ich kein passendes Log gefunden habe. -
@jomjol
Danke für das Teachen, und auch den Tip mit dem weniger Rand. Läuft bis jetzt super. Ich bin mal gespannt ob jetzt alles stabile läuft.Und noch ein hinweise für alle: nach dem ich dem ESP32CAM Modul an den 5V einen 470µF Elko spendiert habe habe ich auch keine Timeout beim Capture
Ich war auch schon am überlegen eine neue Hardware für die Camera zu designen :)@Stev8176 Könntest du von dem Umbau (Elko) mal ein Bild posten?
-
@jomjol, @Knallochse
Danke klappt nun ABER:
mit der config-Datei, die durch die Webseite generiert wurde startete der Server nicht mehr, habe dann die std-Config genommen und die Koordinaten aus der generierten übertragen - dann lief es.
Leider konnte ich nicht feststellen wo genau das Problem mit der generierten lag, da ich kein passendes Log gefunden habe.@ehome Ja, Ursache ist mir klar. Leider schaffe ich es nicht, alles zeitnah synchron zu halten. Ich tendiere, den Server deutlich abzuspecken. Z.B. nur die Koordinaten und keine Parameter mehr. Dann ist es robuster gegen Updates.
@all: eure Meinung? -
@jomjol Ich meine, dass eine "abgespeckte" Version um zu einen ersten Erfolg zu kommen ausreicht. Mit einem guten Tutorial, mit der Erklärung der einzelnen Parameter, läßt sich eigentlich dann auch schnell das System an die einzelnen Bedürfnisse anpassen.
-
@ehome Ja, Ursache ist mir klar. Leider schaffe ich es nicht, alles zeitnah synchron zu halten. Ich tendiere, den Server deutlich abzuspecken. Z.B. nur die Koordinaten und keine Parameter mehr. Dann ist es robuster gegen Updates.
@all: eure Meinung? -
@Stev8176 Könntest du von dem Umbau (Elko) mal ein Bild posten?
@Knallochse Ja klar kann ich den Beschreiben.
Ich habe eine Elko 470µF (oder auch 1000µF) mindestens 10V parallel zu dem Keramikkondensator C5 gelötet.
Polung siehe Foto bzw. Minus ist am Platinen Rand.

so sieht es bei mir aus

So läuft das ganze jetzt schon mehrere Trage ohne abstürze.
-
@Knallochse Ja klar kann ich den Beschreiben.
Ich habe eine Elko 470µF (oder auch 1000µF) mindestens 10V parallel zu dem Keramikkondensator C5 gelötet.
Polung siehe Foto bzw. Minus ist am Platinen Rand.

so sieht es bei mir aus

So läuft das ganze jetzt schon mehrere Trage ohne abstürze.
@Stev8176 Danke dir vielmals
-
@ehome Ja, Ursache ist mir klar. Leider schaffe ich es nicht, alles zeitnah synchron zu halten. Ich tendiere, den Server deutlich abzuspecken. Z.B. nur die Koordinaten und keine Parameter mehr. Dann ist es robuster gegen Updates.
@all: eure Meinung? -
@jomjol
Hallo Jomjol,
jetzt habe ich weil alles so gut funktioniert mir die Kunststoffteile für meinen Wasserzähler angepasst und gedruckt. Nun bekomme ich das alignment nicht mehr hin. kannst du da mal mir mal helfen?
von der Kamera kommt diese Bild

aber Roi sieht so aus

ich habe in der config.ini angegeben "initial_rotation_angle=347"
aber auch wenn ich hier andere Werte eingeben wird es ehr noch schlimmer :(
was mach ich falsch?
muss die Kamera weiter weg vom Zähler damit sie mehr aufnimmt?Danke
-
@jomjol
Hallo Jomjol,
jetzt habe ich weil alles so gut funktioniert mir die Kunststoffteile für meinen Wasserzähler angepasst und gedruckt. Nun bekomme ich das alignment nicht mehr hin. kannst du da mal mir mal helfen?
von der Kamera kommt diese Bild

aber Roi sieht so aus

ich habe in der config.ini angegeben "initial_rotation_angle=347"
aber auch wenn ich hier andere Werte eingeben wird es ehr noch schlimmer :(
was mach ich falsch?
muss die Kamera weiter weg vom Zähler damit sie mehr aufnimmt?Danke
@Stev8176 Ist ein bisschen schwierig zu sagen.
Zuerst mal zum initial_rotation_angle: der soll so gewählt werden, dass das Bild grob aufrecht steht. Das könnte mit 347° gut passen, so aus dem Auge geschätzt.
Der Abstand sollte eigentlich pasen, denn man sieht alle notwendige klar und groß genug.
Das schiefe ROI-Bild bedeutet in der Regel, dass die Alignmentpunkte nicht richtig gefunden werden. Wenn du durch den Druck deiner Teile sich auch der Abstand oder die Beleuchtung geändert hat, musst du die Referenzbilder neu aufnehmen. Denn insbesondere die Größe muss genau zur Aufnahme passen. Denn die Größe wird nicht skaliert.
Hoffe, das hilf schonmal. Ansonsten schick mit mal deine Config und auch das Verzeichni "/image_tmp". Das müsstest du aber erstmal per Volume von aussen zugängig machen (analog zu /log und /config).
Gruß,
jomjol -
@Stev8176 Ist ein bisschen schwierig zu sagen.
Zuerst mal zum initial_rotation_angle: der soll so gewählt werden, dass das Bild grob aufrecht steht. Das könnte mit 347° gut passen, so aus dem Auge geschätzt.
Der Abstand sollte eigentlich pasen, denn man sieht alle notwendige klar und groß genug.
Das schiefe ROI-Bild bedeutet in der Regel, dass die Alignmentpunkte nicht richtig gefunden werden. Wenn du durch den Druck deiner Teile sich auch der Abstand oder die Beleuchtung geändert hat, musst du die Referenzbilder neu aufnehmen. Denn insbesondere die Größe muss genau zur Aufnahme passen. Denn die Größe wird nicht skaliert.
Hoffe, das hilf schonmal. Ansonsten schick mit mal deine Config und auch das Verzeichni "/image_tmp". Das müsstest du aber erstmal per Volume von aussen zugängig machen (analog zu /log und /config).
Gruß,
jomjol@jomjol
danke für den Tip mit "/image_tmp". Ich habe gesehen das er das Bild falsch gedreht hat (rot.jpg).
Dreht man das Bild mit dem Tool zur erstellen der Config (http://wasserzaehler.ignorelist.com) mit negativen Winkel und schreibt diesen Wert ohne das Minuszeichen in die config.ini dann funktioniert es.
Zur Info, ich verwende die LITE Version. Vielleicht ist es mit der "Vollversion" anderes?Ich habe mir einen neuen Adapter für meine Wasseruhr mit Deckel erstellt. Falls ihn noch jemand brauchen kann...Wasseruhr_Adapter.stl
-
@jomjol
danke für den Tip mit "/image_tmp". Ich habe gesehen das er das Bild falsch gedreht hat (rot.jpg).
Dreht man das Bild mit dem Tool zur erstellen der Config (http://wasserzaehler.ignorelist.com) mit negativen Winkel und schreibt diesen Wert ohne das Minuszeichen in die config.ini dann funktioniert es.
Zur Info, ich verwende die LITE Version. Vielleicht ist es mit der "Vollversion" anderes?Ich habe mir einen neuen Adapter für meine Wasseruhr mit Deckel erstellt. Falls ihn noch jemand brauchen kann...Wasseruhr_Adapter.stl
-
@Stev8176 Danke für den Adapter - soll ich ihn auch auf Thingiverse mit dazuladen?
Ich habe mir gerade nochmal die Winkel angeschaut. Finde den Vorzeichenfehler aktuell noch nicht - muss ich noch etwas testen.
Ich habe jetzt mal mein GitHub und das Docker upgedated. Nachdem die rolling-lite gut läuft und ich eigentlich schon ab jetzt nur noch TfLite verwende. Habe ich die rolling-tflite in die rolling gemerged.
ACHTUNG: ihr müsst jetzt eure config-Dateien updaten, da die CNN-Files mit ".h5" nicht mehr funktionieren (Fehlermeldung wird aber angezeigt).
Gleichzeitig ist die neue Struktur so angelegt, dass ich keinen extra Branch für die Raspberry-Versionen mehr brauche. Daher habe ich das in Github jetzt auch gelöscht. Es gibt jetzt nur noch den Master - den habe ich noch nicht upgedated und die rolling Version. Das macht mir zukünftige Wartungen einfacher und weniger fehleranfällig.
Bitte gerne Feedback, falls etwas noch nicht / nicht mehr funktioniert.


