NEWS
Wasserzähler - Selfmade
-
@sissiwup Ich hatte früher auch immer diese Aussetzer bei dem Übergang der "Digitalzahlen"
Ich habe per Blockly dann die optische Erkennung rausgenommen, und lasse mir das ganze errechnen. Seit 4 Wochen keine Fehlwerte mehr.
https://forum.iobroker.net/post/340650
Die Weiterleitung der Werte an den Homematic CCU kann man rauslöschen, wenn nicht benötigt.
Würde mich freuen, wenn das jemand auf ein professionelles Niveau bringen könnte. -
@jomjol
mal eine kleine Rückmeldung von der aktuellen Version 5.3: Bei mir schafft es der Container nicht 24 Stunden durchzulaufen. Das war mit der vorherigen Version nicht so.Weitere Frage. Bei mir "meckert" der Docker Container beim Aufruf dass der Container nicht für Erweiterungen für Intel I3 oder I5 Prozessoren compiliert ist. (SSE, .... ) Vielleicht kann man das in einer der zukünftigen Versionen mal einbauen.
EDITH: Könnte auch am Parser Adapter liegen. Habe diesem mal auf Debug umgestellt und werde die Sache beobachten.
-
@ecki945 sagte in Wasserzähler - Selfmade:
@jomjol
Weitere Frage. Bei mir "meckert" der Docker Container beim Aufruf dass der Container nicht für Erweiterungen für Intel I3 oder I5 Prozessoren compiliert ist. (SSE, .... ) Vielleicht kann man das in einer der zukünftigen Versionen mal einbauen.Das mit der fehlenden Erweiterung für Intel I3 und I5 ist Absicht. Gemeint ist damit unter anderem die fehlende AVX2 Erweiterung. AVX2 ist z.B. auf Prozessoren, wie sie in vielen NAS-Systemen (z.B: DS718) nicht verfübar und der Container würde nicht mehr laufen. Daher habe ich extra eine Tensorflow/Kereas Version ohne AVX2 kompiliert, die auf allen Prozessoren ab "core2" läuft.
Da der Rechenaufwand nicht allzu aufwendig ist, merkt man es an der Performance nicht wirklich und so läuft es auch auf günstigeren Prozessoren.
-
@sissiwup du könntest dein Log mitlaufen lassen und mir die falsch erkannten Zahlen schicken. Dann baue ich sie in das Trainingsprogramm für das neuronale Netzwerk ein und der Fehler sollte für diese Ziffer beseitigt sein.
-
@jomjol sagte in Wasserzähler - Selfmade:
@sissiwup du könntest dein Log mitlaufen lassen und mir die falsch erkannten Zahlen schicken. Dann baue ich sie in das Trainingsprogramm für das neuronale Netzwerk ein und der Fehler sollte für diese Ziffer beseitigt sein.
Hallo,
das läuft schon mit, aber wenn du dir das Bild ansiehst, dann hat er unten die korrekten Werte angezeigt. Also 348.
Schreibt er unten die Werte nach Korrektur? Oder die Werte die er aus dem Bild ermittelt hat? Ich hatte vermutet das letztere.
-
@ecki945 sagte in Wasserzähler - Selfmade:
@jomjol
mal eine kleine Rückmeldung von der aktuellen Version 5.3: Bei mir schafft es der Container nicht 24 Stunden durchzulaufen. Das war mit der vorherigen Version nicht so.Weitere Frage. Bei mir "meckert" der Docker Container beim Aufruf dass der Container nicht für Erweiterungen für Intel I3 oder I5 Prozessoren compiliert ist. (SSE, .... ) Vielleicht kann man das in einer der zukünftigen Versionen mal einbauen.
EDITH: Könnte auch am Parser Adapter liegen. Habe diesem mal auf Debug umgestellt und werde die Sache beobachten.
Hallo, bei mir hat es an Nicht-Zahlen gelegen:
Habe das im Skript jetzt abgefangen:
createState('javascript.0.vWasserzaehler',""); schedule('*/10 * * * *', function () { if (isNaN(Number(getState('javascript.0.vWasserzaehler').val))) { log("Set NaN!!!!","warn"); } else { var url = "http://192.168.1.13:3000/setPreValue?value="+getState('javascript.0.vWasserzaehler').val; request(url, function(error, response, body) { if (body){ log("Set OK:"+ body,"info"); } else { log("Set fehlerhaft:" +url+"->"+ body,"warn"); } }) } var url = "http://192.168.1.13:3000/wasserzaehler.html?usePreValue"; request(url, function(error, response, body) { if (body){ var count=String(body.match(/^[0-9.N]+/)); if (isNaN(Number(count))) { log("Body OK/NaN:"+body+"->" + count,"warn"); } else { log("Body OK:"+body+"->" + count,"info"); setState("javascript.0.vWasserzaehler",count); } } else { log("Body fehlerhaft:" +url+"->"+ body,"warn"); } }) });
-
@sissiwup sagte in Wasserzähler - Selfmade:
@jomjol sagte in Wasserzähler - Selfmade:
@sissiwup du könntest dein Log mitlaufen lassen und mir die falsch erkannten Zahlen schicken. Dann baue ich sie in das Trainingsprogramm für das neuronale Netzwerk ein und der Fehler sollte für diese Ziffer beseitigt sein.
Hallo,
das läuft schon mit, aber wenn du dir das Bild ansiehst, dann hat er unten die korrekten Werte angezeigt. Also 348.
Schreibt er unten die Werte nach Korrektur? Oder die Werte die er aus dem Bild ermittelt hat? Ich hatte vermutet das letztere.
Hallo sissiwup,
du hast natürlich recht. Er hat die 8 in dem Fall erkannt. Jetzt gibt es zwei Möglichkeiten:- Fehler in der Programmlogik: muss ich mir anschauen - habe aber frühestens am Wochenende Zeit dafür.
- Grenzfall in der Erkennung: mal als 6 und mal als 8. Als du den DB-Eintrag machen wolltest, hat er die 6 erkannt und als du es manuell überprüft hast, war es die 8. Könnte das sein? Wenn ja, dann hilft nur weiteres Teachen der Bilderkennung.
Gib mir doch eine kurze RM, ob Fall 2 möglich ist oder ober beide Bilder aus genau demselben Bild kommen. Die Orginalbilder kann man auch mitloggen, dann wird halt der Speicherplatz irgendwann schnell voll.
Beste Grüß, jomjol
-
@Knallochse sagte in Wasserzähler - Selfmade:
@sissiwup Ich hatte früher auch immer diese Aussetzer bei dem Übergang der "Digitalzahlen"
Ich habe per Blockly dann die optische Erkennung rausgenommen, und lasse mir das ganze errechnen. Seit 4 Wochen keine Fehlwerte mehr.
https://forum.iobroker.net/post/340650
Die Weiterleitung der Werte an den Homematic CCU kann man rauslöschen, wenn nicht benötigt.
Würde mich freuen, wenn das jemand auf ein professionelles Niveau bringen könnte.Hallo,
ich habe das mal in das Skript eingebaut (etwas vereinfacht):
Zu große Distanzen werden ja schon über den Server verhindert.Wenn der Server einen Error ausgibt, dann versucht er den Wert zu berechnen. Es wird der letzte Wert genommen, davon nur die Stellen vorm Komma. Wenn der neue Wert kleiner ist als der alte, dann muss ein "Nulldurchgang" gewesen sein. Dann wird der ganzzahlige Anteil um 1 erhöht und dann der Wert weggeschrieben ->
Letzter Wert 348.9812
Server antwortet mit:
348.9812 348 9812 ErrorRateTooHigh (-2.0)ErrorNegativeRate 346.0423Dann wird der neue Wert: 348.0423, da dieser aber < 348.9812 wird 349.0432 der neue Wert.
createState('javascript.0.vWasserzaehler',""); createState('javascript.0.vWasserzaehlerLog',""); schedule('*/10 * * * *', function () { if (isNaN(Number(getState('javascript.0.vWasserzaehler').val))) { log("Set NaN!!!!","warn"); } else { var url = "http://192.168.1.13:3300/setPreValue?value="+getState('javascript.0.vWasserzaehler').val; request(url, function(error, response, body) { if (body){ log("Set OK:"+ body,"info"); } else { log("Set fehlerhaft:" +url+"->"+ body,"warn"); } }) } var url = "http://192.168.1.13:3300/wasserzaehler.html?usePreValue"; request(url, function(error, response, body) { if (body){ var count=String(body.match(/^[0-9.N]+/)); var err=body.search("Error"); var org=count; if (err>=0) { org= String(body.match(/[0-9.N]+$/)); var oar = org.split("."); var last = String(getState('javascript.0.vWasserzaehler').val); var lar= last.split("."); var calc = lar[0]+"."+oar[1]; if (Number(calc)<Number(last) && (Number("0."+oar[1])<0.1) && (Number("0."+lar[1])>0.9)){ calc=(String(Number(lar[0])+1))+"."+oar[1]; } log("Body Calc:"+calc,"info"); count=calc; } if (isNaN(Number(count))) { log("Body OK/NaN:"+body,"warn"); } else { log("Body OK:"+body+"->" + count,"info"); setState("javascript.0.vWasserzaehler",count); } setState("javascript.0.vWasserzaehlerLog",String(body)); } else { log("Body fehlerhaft:" +url+"->"+ body,"warn"); } }) });
Wichtig ist, dass vWasserzaehler nach einer längeren Pause mit einen korrekten Wert gefüllt wird.
-
Wenn der Server einen Error ausgibt, dann versucht er den Wert zu berechnen. Es wird der letzte Wert genommen, davon nur die Stellen vorm Komma. Wenn der neue Wert kleiner ist als der alte, dann muss ein "Nulldurchgang" gewesen sein. Dann wird der ganzzahlige Anteil um 1 erhöht und dann der Wert weggeschrieben ->
Letzter Wert 348.9812
Server antwortet mit:
348.9812 348 9812 ErrorRateTooHigh (-2.0)ErrorNegativeRate 346.0423Dann wird der neue Wert: 348.0423, da dieser aber < 348.9812 wird 349.0432 der neue Wert.
Vlt. sollte man das so auch beim usePrevalue einbauen?
Das würde wunderbar mit der Zeitgrenze die du eingebaut hast harmonieren -
@sissiwup Einen ähnlichen Algo verwende ich, wenn die Ziffernerkennung ein "N" zurück gibt und "usePreValue" eingeschaltet ist. Bei mir geben die Digitalen Ziffern immer einen korrekten Wert zurück - sind ja auch mit meinen Bilder trainert.
Ich bitte gerne nochmal an, auch eure Bilder nach zu trainieren. Schickt mir einfach die Bilder von den falsch erkannten Ziffern, dann gibt es ein Update, wo das trainiert wurde. -
@jomjol sagte in Wasserzähler - Selfmade:
@sissiwup Einen ähnlichen Algo verwende ich, wenn die Ziffernerkennung ein "N" zurück gibt und "usePreValue" eingeschaltet ist. Bei mir geben die Digitalen Ziffern immer einen korrekten Wert zurück - sind ja auch mit meinen Bilder trainert.
Ich bitte gerne nochmal an, auch eure Bilder nach zu trainieren. Schickt mir einfach die Bilder von den falsch erkannten Ziffern, dann gibt es ein Update, wo das trainiert wurde.Hallo,
er schreibt tüchtig mit... das dauert aber schon einige Tage, da selbst die letzte Stelle sich nicht so schnell wechselt.
-
@sissiwup
Hallo,hier mal ein Modell, mit etwas anderen Parametern trainiert. Funktioniert bei mir besser. Entpacken, ins Config-Verzeichnis kopieren und dann in der ini den Namen des Models anpassen. Restart und ausprobieren:
Train_CNN_Digital-Readout_Version_4.0.1.h5.zip
Bei mir hat er 5 und 6 vorher nicht auseinander gehalten. Jetzt klappt das.
-
Hallo gute zeit
Vielen Dank für Ihre Bemühungen, ein großartiges und nützliches Projekt
Ich habe dieses Projekt mit einem Raspberry ausgeführt, das Docker-Image auf dem Raspberry installiert und das Ergebnis ist wie folgt
Und das Ergebnis war
NN632.4016Ich zog die Kamera zurück und es funktionierte
Und das Ergebnis war
N999N.8239Der zweite Test scheint besser zu funktionieren, da die Bilder näher an Ihren Referenzbildern liegen
Ich muss selbst Referenzbilder machen,
Wo füge ich meine Referenzbilder ein und bearbeite sie?
Ich benutze Docker Image raspi V5.3.0Vielen Dank
-
Hallo Frage mein ESP verschwindet nach ca 3 tagen aus dem netzwerk ??
gibst ne lösung dafür??? bin leider auf Reha 200 km entfernt.......sch.....
mfg
mikewolf -
@Mikewolf ja schau mal irgendwo weiter oben, statt dem Parser-Adapter mit Javascript auswerten. Hat wohl geholfen. Persönlich konnte ich es noch nicht testen.
-
@vista Hallo Vista,
hast du bei deinem Docker das /config Verzeichnis bereits extern eingebunden (siehe https://github.com/jomjol/water-meter-system-complete#running-docker)?
Darin findest du die config.ini und die Referenzbilder. Hier ist einen Anleitung, wie man sie richtig einstellt: https://github.com/jomjol/water-meter-system-complete/blob/master/Config_Description.mdEin Step-By-Step Anleitung für das Erstellen der Referenzbilder findest du hier: https://github.com/jomjol/water-meter-system-complete/blob/master/images/Alignment_procedure_draft.pdf
Ich programmiere gerade eine Web-Server-Applikation, um eine WYSIWYG Oberfläche für das Erstellen der Config.ini zu erstellen. Das wird aber noch dauern (eher Wochen statt Tage), daher erstmal bitte die Handanleitung probieren.
Gruß,
jomjol -
@jomjol Hallo, vielen Dank für deine Antwort.
Meine Frage betraf analoges und digitales Handheld-Bild.
Ich habe die Referenzbilder für meinen Wasserzähler geändert, aber die digitalen und analogen Handheld-Bilder unterscheiden sich von Ihrem Zähler. Daher müssen alle Bilder für künstliche Intelligenz reproduziert werden. Meine Frage ist, wo kann ich meine digitalen und analogen Handheld-Bilder für künstliche Intelligenz definieren?
Vielen Dank -
@vista Hallo vista,
okay - hoffe ich verstehe die Frage jetzt richtig. Die Bilderkennung funktioniert über ein neuronales Netz, was separat trainiert werden muss. Das trainierte Netz wird dann als h5-Datei im Unterverzeichnis /config/neuralnets jeweils für die Zeiger und die Zahlen gespeichert.
Das Training ist etwas komplizierter und hier beschrieben: https://github.com/jomjol/neural-network-analog-needle-readout
Du musst dir dazu:- eine Python-Umgebung mit Keras/Tensorflow installieren.
- Beispielbilder von den Trainingsdaten erzeugen
- Netz trainieren
- Ergebnis als h5-Datei transferieren
Ich habe aktuell zwei unterschiedliche Arten von Ziffern und auch zwei Zeiger trainiert. Wenn du mir genügend Bilder erzeugst, dann kann ich auch deine Zeiger trainieren. Können wir gerne mal im Detail besprechen, am besten per direktem Chat.
Gruß, jomjol -
@jomjol Vielen Dank, ich rufe dich an ..
-
Hello gentleman, sorry for writing in english, I know only few words in german and it's from rammstein
I am trying to modify this amazing project to my needs, the main problem is that we have another design of water meters here. I already sketched up rough mount for the right diameter of water meter, I am gathering data ( images ) to retrain the model because we have different numbers on rolling pins.
The main question is, how could I modify the server in docker container so it would recognize data from 2 water meters, or possibly more, I am thinking about sensing the gas meter which use the same principle. I know I could run somehow 2 same containers but, I quite don't like this idea of "wasting resources".
thanks