NEWS
Wasserzähler - Selfmade
-
@pfried Problier mal folgendes tlite-File: https://github.com/jomjol/neural-network-digital-counter-readout/blob/master/Train_CNN_Digital-Readout_Version_6.1.2.tflite
Dachte, ich hätte sie schon beim letzten Mal geteached. Gerade aber erst gemerkt, dass dein Bild in Thread 931 ein png-Format hat. Ich hatte es einfach reinkopiert, aber der Algo verarbeitet nur jpg-Dateinen und hat es daher beim Anlernen einfach ausgelassen :-).
-
@pfried, @michaeljoos, @ehome, @Knallochse und natürlich ALLE anderen
Ich fasse mal eure Rückmeldungen zusammen:
- jetzige Lösung mit ESP + Docker passt für fast alle ( ihr habe es ja auch am laufen)
- Vereinzelt auch Wunsch nach einer "einfachen" Single-Tool Lösung
- Hauptthema ist die lange Response-Zeit für eine ESP32-only Lösung
- Debugging und Testen ist bei den langen Response-Zeiten auch aufwendig
Für die Responsezeiten hätte ich die Lösung: das Auslesen kann ich per Timer auch offline periodisch stattfinden lassen und dann eine sofortige Rückmeldung mit dem zuletzt umgewandelten Wert kommt. Ich denke auch, dass eine Hybridlösung einfach möglich sein sollte. Denn wenn das System mal läuft, wäre es ein leichtes, auch als Bildserver für den Docker-Container zu funktionieren. Letzterer könnte dann sogar als Generator für das Config-File für des ESP32 dienen.
Technischer Stand ist der Folgende:
- einige Komponenten laufen schon im Einzelmodus (Bildererkennung, Bildalignment und ROI-Exktraktion, Vereinfache Config.ini Prozessierung
- noch fehlende Komponenten: Ansteuerung Kamera, http-Server Implementierung
- bisher ist die Rechenpower und der Speicher (4 MB PSRAM) ausreichend
- Hauptproblem: bei Kombination von mehr als drei Modulen kommt es zu einem unbekannten Stack-Overflow, dessen Ursache ich noch nicht finden konnte. Leider geht JTAG-Debuging nicht, da die Debugports durch Kamera und SD-Karte belegt sind. Das macht die Fehlersuche sehr aufwendig.
Ich halte euch auf dem Laufenden.
Beste Grüße,
jomjol -
@jomjol
wenn du die SD-Karte nicht brauchst dann kann ich dir gerne ein JTAG Interface "anlöteten" -
@Stev8176 Danke für das Angebot - leider ist die SD-Karte notwendig. Ich muss die Bilder zwischenspeichern, denn ich kann nicht mehrere Bitmaps und das Neuronale Netz im Speicher belassen. Dafür reicht schlicht der Speicher nicht.
Aber bei nächster Gelegenheit werde ich auf dein Angebot für Hardware kommen. Denn da fehlt mir noch etwas Erfahrung.
Beste Grüße,
jomjol -
@jomjol Die vielen zugriffe auf die SD-Karte reduziert die Lebensdauer.
Wie viel RAM würdest du den benötigen um alles zu speichern? Würden dir 8MB reichen? 8MB ist das was der ESP32 ohne weiteres kann aber halt nur 4MB Memory Mapped zur gleichen zeit.Grüße
-
@watcherkb Danke für den Hinweis!
-
@jomjol Sorry, mein Fehler in Zukunft nur mehr jpg Dateien
-
@jomjol Habe unterdessen die >200 Bilder für die Zeiger bereit. Aber so wie es ausschaut, kann ich noch keine PN verschicken. Ich häng die Zip-Datei einfach hier rein und hoffe es klappt --> Zeiger.zip
-
@michaeljoos Bilder sind angekommen - ich werde es bei nächster Gelegenheit (Wochenende?) trainieren.
-
Moin.
Hab mich nun auch an das Projekt gewagt, da es ziemlich genau das ist, was ich vor hatte selber zu erstellen. Vielen Dank schonmal für die viele Arbeit, die hier reingesteckt wurde!!
Und sorry vorab, wenn einige Fragen bereits irgendwo beantwortet wurden. Das Nachladen der Artikel ist ein wenig ein Krampf.ESP32-CAM liegt in einer gedruckten Halterung und schaut auf den Zähler, ca. 6 cm Abstand. Bild sieht soweit ok aus, nicht ganz weiß, sondern etwas grau.
Erstes Problem: Der interne Blitz ist grell und spiegelt sich im Glas, was die Zahlen teilweise unlesbar macht. Ich habe dafür den Arduino-Code angepasst, so dass ich die Intensität des flashes einstellen kann - hat aber nur bedingt geholfen, da er auch bei niedriger Intensität schnell einen ziemlich grellen Punkt in die Mitte und in die Rundung der Zahlenräder haut. Ich habe mir daher beholfen, in dem ich einen aus Alufolie gebastelten Diffuser in die Halterung gefriemelt hab (leider konnte ich nur in schwarz drucken - weiß wäre hier wohl besser gewesen). Jetzt hab ich keine Reflexionen mehr in den wesentlichen Bereichen des Bildes.Jetzt steh ich vor der Einrichtung der Config für das Docker Image (welches auf meiner Syno läuft).
- config: Rotation.
Habe gemerkt, dass trotz aller Berechnungen, ich das Bild in Photoshop um 1° gegen den Uhrzeigersinn drehen muss, um es gerade zu bekommen. Trage ich jetzt unter
[alignment] initial_rotation_angle=1
ein, oder
-1
oder359
?- config manuell: [Digital_Digit]
Wenn ich jetzt für die Digitalen Ziffern x, y, w, h angebe: beziehe ich das auf mein Originalbild, oder auf das um 1° gedrehte? Dadurch, dass zumindest PS beim Drehen ja einiges an Rahmen einfügt, stimmen die Zahlen ja eventuell gar nicht mehr.
Oder wie bekomme ich ein Bild, wie es nach dem Rotieren vom Programm verwendet wird?- Meine erstellte config wollte ich im tool http://wasserzaehler.ignorelist.com/preparation/ hochladen, bekomme aber Fehler, die nicht ganz schlüssig sind.
Exception Type: KeyError Exception Value: Analog_Counter
Ich habe in
AnalogReadOut
stehen:Enabled=False
Und den o.g. Key auskommentiert. Das schein ihm nicht zu gefallen.
Wenn ich ihn wieder einbaue, bekomm ich entspr. Fehler mitModelfile
und anschließendnames
. Schreibe ichnames=
, da ich keine habe, gibt's einen anderen Fehler:Exception Value: Analog_Counter.
-- dieses Mal mit Punkt.
Wie bekomme ich es hin, dass ich das Tool nutzen kann, um meine Config zu prüfen oder zu erstellen ohne Analog Counter?- Frage wäre: Da ich beim Sensus weiße Zahlen auf schwarzen Grund vorne und weiß auf rot hinten habe: gibt's da schon ein Modelfile für, oder wie kann ich Ziffern beitragen zum Lernen?
Viele Fragen, aber ich hoffe, hier Antworten zu finden.
Danke schonmal vorab
-
@el_kassi
freut mich, dass du meinen Zaehler verwendet - eine Menge fragen - ich versuche es erstmal kurz - bitte gerne gerne bei weiteren Details nachfragen.zu 1) & 2):
Schau dir mal die manuelle Erstellung der Alignment Parameter an, dort findest du die Koordinaten und deren Bedeutung:
https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdfzu 3)
Ich schaffe es nicht, das Tool zum Erstellen der Config.ini immer auf dem neuesten Stand zu halten. D.h. er kommt nicht immer mit den neuesten ini-Parameter zu recht. Am besten verwendest du dort die Default-Config und erstellst damit das Alignment und die ROIs und kopiertst dann aus dem Config.ini File die entsprechenden Zeilen in dein eigenes aus dem Download von Github.
Ich werde bei Gelegenheit das Tool entsprechend anpassen - habe aber gerade keine Kapa dafürzu 4)
Bis jetzt sind nur Ziffern mit schwarzer Schrift auf weißem Grund geteached. Ich nehme neue Varianten sehr gerne mit auf.
Schalt bei deinem Zähler das Logging ein und schicke mit dann so ca. 3-4 Bilder pro Ziffer und Stelle. Ich integriere sie dann.Viel Erfolg und bei Fragen gerne melden,
jomjol
-
@michaeljoos sagte in Wasserzähler - Selfmade:
@jomjol Habe unterdessen die >200 Bilder für die Zeiger bereit. Aber so wie es ausschaut, kann ich noch keine PN verschicken. Ich häng die Zip-Datei einfach hier rein und hoffe es klappt --> Zeiger.zip
Hi Michael,
ich habe deine Zeiger geteached: https://github.com/jomjol/neural-network-analog-needle-readout/blob/master/CNN_Analog-Readout_Version-6.2.0.tfliteGruß,
jomjol -
@jomjol Super, vielen Dank! Habe gerade noch gesehen, dass ich noch h5-Files habe. Habe ich da noch etwas altes installiert und es müssten tflite-Files sein? Ich nehme an, ich muss diese Datei einfach in das Verzeichnis kopieren, oder?
Gruss
Michael -
@michaeljoos sagte in Wasserzähler - Selfmade:
@jomjol Super, vielen Dank! Habe gerade noch gesehen, dass ich noch h5-Files habe. Habe ich da noch etwas altes installiert und es müssten tflite-Files sein? Ich nehme an, ich muss diese Datei einfach in das Verzeichnis kopieren, oder?
Gruss
MichaelFür die Erkennung mit den tflite-Files brauchst du auch den lite-Docker. Ist nicht kompatibel
docker pull jomjol/wasserzaehler:rolling-lite
-
@Knallochse sagte in Wasserzähler - Selfmade:
@michaeljoos sagte in Wasserzähler - Selfmade:
@jomjol Super, vielen Dank! Habe gerade noch gesehen, dass ich noch h5-Files habe. Habe ich da noch etwas altes installiert und es müssten tflite-Files sein? Ich nehme an, ich muss diese Datei einfach in das Verzeichnis kopieren, oder?
Gruss
MichaelFür die Erkennung mit den tflite-Files brauchst du auch den lite-Docker. Ist nicht kompatibel
docker pull jomjol/wasserzaehler:rolling-lite
Update: ab der Version 7 gibt es die lite nicht mehr explizit, sondern die normalen rolling unterstützen die lite (nur noch die lite).
rolling-lite wird nicht mehr upgedated!
Bitte folgenden pull verwenden:
docker pull jomjol/wasserzaehler:rolling
-
Tiptop, alles klar. Ich war noch auf raspi-latest.
Jetzt scheint es bei mir nun doch, dass wir auch die Ziffern anlernen dürfen/sollten/müssen
Mit dem h5-File wurde komischerweise die Ziffer 3 immer richtig erkannt, obwohl die definitiv anders ausschaut als bei euch. Jetzt mit dem tflite-File wird diese als 1 erkannt:Aber kein Stress...bin momentan 2 Wochen in Kärnten im Urlaub
@jomjol Reicht es dir, wenn ich die Ziffern so wie oben die 3 aus dem Log sende?
Gruss
Michael -
@jomjol kann ich absolut verstehen, dass man nicht immer Zeit hat. Kenne ich selber. Trotzdem schonmal großen Dank für die schnelle Rückmeldung. Ein paar neue Fragen ergeben sich:
zu 1) Danke für das PDF. Das hilft (hoffentlich). hier ist von einem prealignment parameter die Rede. Ist das das selbe wie
[alignment] initial_rotation_angle=-1.0
Nach einigem hin und her hat er dann auch dir Bilder akzeptiert. Man muss allerdings einen AnalogCounter definieren, auch wenn es Disabled ist, da sonst auch das script im Dockerimage meckert.
-
Ich speichere jetzt Ziffern in den digital_digit-Unterordnern, d.h. meist NaN, manchmal halt auch falsch (oder in 10?!)
Zum Lernen muss ich sie dir dann wahrscheinlich zusenden, richtig?
Es reicht nicht, d.h. er lernt nicht, wenn ich die Bilder nur in den richtigen Ordner (0-9) verschiebe.
Oder kann ich das irgendwie anders selber? -
Habe mich gefragt, ob es ausreicht, das Bild zu negieren und in s/w zu konvertieren - dann hätte ich ja schwarz auf weiß bzw. schwarz auf grau beim rotem Hintergrund.
-
Was ich noch ändern werde ist, dass du momentan davon ausgehst, dass digital = vorkomma und analog = nachkomma. Da ich nur digital habe, muss ich ihm eine Wertigkeit der Ziffern mitgeben. Evtl. als Parameter in der config. Ich schau mal.
In diesem Zuge habe ich mich gefragt, ob es klappen könnte, wenn ich meine drei letzten Ziffern als AnalogCounter erstelle, aber als Modelfile das digitale nehme. Könnte das klappen? Ich kann ja in der config dx und dy beliebig wählen und muss es dort nicht quadratisch eingeben. Da ich noch keine Ziffern habe, die funktionieren, kann ich das nicht richtig ausprobieren.
-
-
@michaeljoos
Bitte die Bilder im jpg-Format idealerweise als ZIP mit Ordner von 0 - 10 (10=NaN) mit jeweils 3-4 Ziffern je Typ schicken.
Besonders die Rot auf Schwarz wären ein echter Mehrgewinn für dass neuronale Netz, von dem dann auch andere Nutzer profitieren.Bitte Bilder nicht im png-Format - das kann mein Algo momentan nicht und ich müsste dann jedes Bild umwandeln.
Danke,
jomjol -
@el_kassi sagte in Wasserzähler - Selfmade:
@jomjol kann ich absolut verstehen, dass man nicht immer Zeit hat. Kenne ich selber. Trotzdem schonmal großen Dank für die schnelle Rückmeldung. Ein paar neue Fragen ergeben sich:
zu 1) Danke für das PDF. Das hilft (hoffentlich). hier ist von einem prealignment parameter die Rede. Ist das das selbe wie
[alignment] initial_rotation_angle=-1.0
Ja - bin mir nur nicht sicher, ob negative Winkel funktionieren oder ob du doch 359 statt -1 schreiben musst. Bitte probieren.
Nach einigem hin und her hat er dann auch dir Bilder akzeptiert. Man muss allerdings einen AnalogCounter definieren, auch wenn es Disabled ist, da sonst auch das script im Dockerimage meckert.
- Ich speichere jetzt Ziffern in den digital_digit-Unterordnern, d.h. meist NaN, manchmal halt auch falsch (oder in 10?!)
Zum Lernen muss ich sie dir dann wahrscheinlich zusenden, richtig?
Es reicht nicht, d.h. er lernt nicht, wenn ich die Bilder nur in den richtigen Ordner (0-9) verschiebe.
Oder kann ich das irgendwie anders selber?
Ja, du solltest die Bilder mir schicken und ich mache regelmäßig ein Update der tflite-Files. Du kannst auch selber lernen. Das habe ich auch veröffentlich (analog: https://github.com/jomjol/neural-network-analog-needle-readout, digital: https://github.com/jomjol/neural-network-digital-counter-readout). Aber ich update das regelmäßig mit euren Inputs, dann profitieren alle davon.
Das Selbstlernen funktioniert so nicht. Du braucht auch eine etwas umfangreichere Python-Bibliothek zum Lernen, wie zum reinen Anwenden.Zum Benennung: in älternen Versionen gab es noch die Kategorie "NaN", inzwischen habe ich sie in "10" umbenannt, da das neuranale Netz die Klassen einfach durchnummeriert und ich mir die Übersetzung "10"="NaN" so spare.
- Habe mich gefragt, ob es ausreicht, das Bild zu negieren und in s/w zu konvertieren - dann hätte ich ja schwarz auf weiß bzw. schwarz auf grau beim rotem Hintergrund.
Könnte man vielleicht so machen, will ich aber bewußt nicht. Das neuronale Netz ist so allgemein gehalten, dass es ziemlich viele Inputs verarbeiteten kann (Convolutional mit vielen Filtern). Dadurch brauche ich bis auf eine Skalierung keine weitere Bilderverarbeitung. Dass müsste auch noch mit anderen Ziffern- und Hintergrundfarben gut funktionieren - was aber noch zu beweisen wäre. Daher großes Interesse an deinen Ziffern auf schwarzem Grund.
- Was ich noch ändern werde ist, dass du momentan davon ausgehst, dass digital = vorkomma und analog = nachkomma. Da ich nur digital habe, muss ich ihm eine Wertigkeit der Ziffern mitgeben. Evtl. als Parameter in der config. Ich schau mal.
In diesem Zuge habe ich mich gefragt, ob es klappen könnte, wenn ich meine drei letzten Ziffern als AnalogCounter erstelle, aber als Modelfile das digitale nehme. Könnte das klappen? Ich kann ja in der config dx und dy beliebig wählen und muss es dort nicht quadratisch eingeben. Da ich noch keine Ziffern habe, die funktionieren, kann ich das nicht richtig ausprobieren.
Nein das funktioniert nicht, da das analoge Netz als Output eine einziges Neuron mit analoger Zahl (= Zeigerstellung) hat und das digitaler Netz zur Klassifizierung 10 Neuronen (0-9 + NaN) hat. Das muss dann in der Weiterverarbeitung berücksichtigt werden und ist nicht parametrisiert.
Eine Wertigkeit für die Ziffern als Parameter wäre vermutlich die einfachere Lösung (z.B: x0.1) - mometan arbeite ich aber an einem anderen Projekt, daher Prio B. - Ich speichere jetzt Ziffern in den digital_digit-Unterordnern, d.h. meist NaN, manchmal halt auch falsch (oder in 10?!)
-
@jomjol alles klar.
Schwarzer Hintergrund kann leider etwas dauern, da das die Vorkommastellen sind.
Du erwähntest irgendwo 3-4 Bilder pro Ziffer. Sollten die dann von verschiedenen Stellen sein, da sie sich ja ggf (Winkel, Licht) leicht unterscheiden? Und brauchst du die auch mit verschiedenem Drehwinkel, also Bilder, wo die 2 zwar komplett zu sehen ist, aber mal mittig, mal am oberen Rand, mal am unteren? Das könnte dann noch länger dauern.Roter Hintergrund dürfte bald durch sein, zumindest wenn du sie nicht von jeder Stelle brauchst, sondern die letzte und ggf. vorletzte ausreicht.
Zwecks Wertigkeit: kein Thema, dafür nehm ich mir mal die Zeit. Will es ja zum Laufen bekommen