NEWS
Personenerkennung: Aufruf Linux Script mit Parameter
-
@SBorg es funktioniert nun alles. Habe es so hingekriegt, dass es grundsätzlich funktioniert.
Gebe den Consolenoutput noch in eine Datei aus.
Diese Datei kann ich in iobroker wieder einlesen um an das Ergebnis (der Bildanalyse) zu kommen.
Muss mal schauen, was ich noch optimieren kann. Beispielsweise ohne den Umweg über die Datei zu gehen.
Danke auf alle Fälle!!
@uwe72 sagte in Personenerkennung: Aufruf Linux Script mit Parameter:
Beispielsweise ohne den Umweg über die Datei zu gehen.
Würde ich eigentlich als Parameter "-Q" verstehen, habe ich aber bis dato nicht hinbekommen.
-
Ich schreibe erst einmal was in der Linux console bereits funktioniert.
Ich rufe ein Script auf:

Dieses Script "startet ein Programm":

Nach dem "das Programm" gestartet ist, kann man in der Console ein relativen Pfad zu einem Bild eingeben, z.B. "data/dog.jpg"

Im Anschluss bekomme ich auf der Konsole das Ergebnis, dass auf dem Bild sich ein Fahrrad, ein Hund, usw. befindet.

Rein theoretisch könnte man sich auch noch das Ergebnis auf dem Output anschauen:

Danach kann ich beliebig oft eine andere Bilddatei angeben, z.b. ein Bild einer Schulklasse:

Das starten des Scriptes dauert >5 Sekunden. Die anschließende Bildanalyse jeweils pro Bild <1 Sekunde.
So warum schreibe ich dies im ioBroker-Forum?
Ich möchte diese Personenerkennung in ioBroker einbinden.
Das Linux-Script kann ich aufrufen über ioBroker-JavaScript. Aber ich habe gerade keine Idee/Ahnung wie ich es irgendwie schaffe, dass ich das Linux-Script nur einmal aufrufe und im Anschluss immer eine neue Bilddatei übergeben kann zur Analyse?
Hintergrund: Ich möchte alle paar wenige Sekunden ein Bild von der Kamera abgreifen, dieses dem laufenden "Linux Programm/Script" übergeben und somit auslesen, ob eine Person erkannt wird oder nicht. So spare ich mir einen Bewegungsmelder an der Kamera und habe eine nahezu 100% Personenerkennung, dies auch noch lokal. Habe das selbe schon am Laufen über einen Microsoft Webservice. Das hat für mich aber keine Zukunft. Ich möchte dies lokal machen. Es funktioniert auch wie gesagt in Linux, aber es fehlt noch die Brücke zum ioBroker.
Kann mir hier jemand - bei dem zugegeben speziellen Thema - weiterhelfen?
Ich find das Thema äußerst spannend.
Das Linux-Script bekomme ich schon über mein ioBroker-JavaScript aufgerufen:
// Xiaomi Schalter (Smart Switch) hat ausgelöst im Büro: on({id: sensor_taster_buero.sensorTasterStateButtonPressed, change: 'any'}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (value == 0 && oldValue == 1002) { log("test"); execabc(); } }); function execabc() { var conn = new Client(); conn.on('ready', function() { conn.exec('/home/uwe72/darknet/start.sh', function(err, stream) { //conn.exec('/root/darknet/darknet detect yolov3.cfg yolov3.weights data/uwe.jpg', function(err, stream) { if (err) throw err; stream.on('close', function(code, signal) { conn.end(); }).on('data', function(data) { log('Ausgabe: ' + data); }).stderr.on('data', function(data) { log('Fehler: ' + data); }); }); }).connect({ host: '192.168.178.135', // IP des RPi port: 22, username: 'uwe72', password: 'SmartHxxx' }); }
Aber wie gesagt, weiß ich nicht wie ich nun laufend die Bilder übergeben kann.@uwe72 sagte in Personenerkennung: Aufruf Linux Script mit Parameter:
Aber wie gesagt, weiß ich nicht wie ich nun laufend die Bilder übergeben kann.
Wenn es lokal läuft, kannst du mit dem
child_process-Module undexeceinen Prozess starten und instdinschreiben:
https://nodejs.org/api/child_process.html#child_process_subprocess_stdin
Das entspricht einer manuellen Eingabe auf der Konsole.Gebe den Consolenoutput noch in eine Datei aus.
Diese Datei kann ich in iobroker wieder einlesen um an das Ergebnis (der Bildanalyse) zu kommen.Und da kommst du über
stdoutdran. -
@uwe72 sagte in Personenerkennung: Aufruf Linux Script mit Parameter:
Aber wie gesagt, weiß ich nicht wie ich nun laufend die Bilder übergeben kann.
Wenn es lokal läuft, kannst du mit dem
child_process-Module undexeceinen Prozess starten und instdinschreiben:
https://nodejs.org/api/child_process.html#child_process_subprocess_stdin
Das entspricht einer manuellen Eingabe auf der Konsole.Gebe den Consolenoutput noch in eine Datei aus.
Diese Datei kann ich in iobroker wieder einlesen um an das Ergebnis (der Bildanalyse) zu kommen.Und da kommst du über
stdoutdran.@AlCalzone mit "lokal" meinst Du, die "Bilderkennungssoftware" und "iobroker" laufen auf dem selben "Rechner"?
-
@AlCalzone mit "lokal" meinst Du, die "Bilderkennungssoftware" und "iobroker" laufen auf dem selben "Rechner"?
-
Danke Euch beiden mal @SBorg @AlCalzone !!
Hab schon ein mal dank Euch dazu gelernt. Bin noch nicht ganz am Ziel, aber Bauchgefühl, sollte vollends möglich sein.
@AlCalzone: Hab die Sachen auf unterschiedlichen Rechnern. Da kann und möchte ich auch nichts ändern. iobroker läuft auf einem leistungsstarkem NUC und die Bilderkennung auf einem Jetson Nano.
@SBorg Läuft grundsätzlich, nur komme ich noch nicht an den Konsolenoutput ran von #2. Versuche gerade, dass #2 die Konsole in eine Datei schreibt. Über NFS-Server-/Client lese ich im iobroker den Inhalt ein. Das ist noch ein wenig umständlich und #1 liest schneller ein als #2 schreibt. Kann zwar ein timeout vor dem einlesen einbauen, aber da verliere ich auch Zeit. Ist alles noch ein wenig "umständlich" :-) Aber ich gebe noch nicht auf :-)
-
Danke Euch beiden mal @SBorg @AlCalzone !!
Hab schon ein mal dank Euch dazu gelernt. Bin noch nicht ganz am Ziel, aber Bauchgefühl, sollte vollends möglich sein.
@AlCalzone: Hab die Sachen auf unterschiedlichen Rechnern. Da kann und möchte ich auch nichts ändern. iobroker läuft auf einem leistungsstarkem NUC und die Bilderkennung auf einem Jetson Nano.
@SBorg Läuft grundsätzlich, nur komme ich noch nicht an den Konsolenoutput ran von #2. Versuche gerade, dass #2 die Konsole in eine Datei schreibt. Über NFS-Server-/Client lese ich im iobroker den Inhalt ein. Das ist noch ein wenig umständlich und #1 liest schneller ein als #2 schreibt. Kann zwar ein timeout vor dem einlesen einbauen, aber da verliere ich auch Zeit. Ist alles noch ein wenig "umständlich" :-) Aber ich gebe noch nicht auf :-)
-
@uwe72 Ich habe das hier gefunden, was ähnlich aussieht wie der Code in deinem ursprünglichen Code:
https://stackoverflow.com/a/51886884/10179833Du kannst also auch per SSH in stdin schreiben und aus stdout lesen.
@AlCalzone Sehr gut! Danke schon einmal. Werde ich mir heute Abend anschauen!
-
@AlCalzone Sehr gut! Danke schon einmal. Werde ich mir heute Abend anschauen!
-
Kam etwas heraus?
Schafft der Jetson Nano auch mehrere Kameras(-Bilder) nach Objekten/Personen überwachen?@Solear Nein das schafft er nicht.
habe nun 2 jetson nano. auf einem läuft die personenerkennung der Haustüre-Kamera.
Beim 2. Jetson Nano laufen nacheinander die Erkennung von 3 weiteren Kameras aus dem Gartenbereich. aber eben sequentiell. Das reicht mir trotzdem noch.
Eine Detection dauert ca. 475ms.
Habe noch ein Restproblem. Ab und zu schafft mein iobroker nicht das Bild von der Kamera zu holen, sieht man an den Stellen wo der Bereich unter der roten Linie liegt. Das muss ich noch irgendwie lösen. Aber insgesamt läuft es gut.

-
@Solear Nein das schafft er nicht.
habe nun 2 jetson nano. auf einem läuft die personenerkennung der Haustüre-Kamera.
Beim 2. Jetson Nano laufen nacheinander die Erkennung von 3 weiteren Kameras aus dem Gartenbereich. aber eben sequentiell. Das reicht mir trotzdem noch.
Eine Detection dauert ca. 475ms.
Habe noch ein Restproblem. Ab und zu schafft mein iobroker nicht das Bild von der Kamera zu holen, sieht man an den Stellen wo der Bereich unter der roten Linie liegt. Das muss ich noch irgendwie lösen. Aber insgesamt läuft es gut.

@uwe72 kannst du das Ganze etwas mehr erläutern? Momentan nutze ich Zoneminder für die Personenerkennung in einem LXC Container. Die Erkennung Zoneminder -> iobroker ZM Adapter -> Telegram Nachricht ist aber "relativ" langsam. Die Personenerkennung an sich ist recht schnell, nur bis der ZM Adapter es mitbekommen hat und ich eine Nachricht bekomme, dauert recht lange.
Du nutzt also ein Script/Programm für die Erkennung, die auf einem Jetson Nano läuft richtig? Würdest du das Programm bereitstellen? -
@uwe72 kannst du das Ganze etwas mehr erläutern? Momentan nutze ich Zoneminder für die Personenerkennung in einem LXC Container. Die Erkennung Zoneminder -> iobroker ZM Adapter -> Telegram Nachricht ist aber "relativ" langsam. Die Personenerkennung an sich ist recht schnell, nur bis der ZM Adapter es mitbekommen hat und ich eine Nachricht bekomme, dauert recht lange.
Du nutzt also ein Script/Programm für die Erkennung, die auf einem Jetson Nano läuft richtig? Würdest du das Programm bereitstellen?@coyote helfe gerne weiter (soweit ich das kann), habe nur gerade wenig Zeit.
Basis für alles ist die reine PErsonenerkennung auf dem Jetson Nano unter Linux. Habe mich da an dem orientiert.
https://pjreddie.com/darknet/install/In Iobroker rufe ich dann per Script "jede Sekunde" die Personenerkennung auf dem jetson auf. Verbinde mich dazu per Script auf den Jetson auf die Konsole und "schreibe da" programmatisch den "Befehl" zur Personenerkennung und übergebe dabei das kurz zuvor neue geladene Bild von der Kamera. Dann lese ich programmatisch die Konsole aus und schaue ob eine Person dabei war. Falls ja, starte ich nachfolgende Aktionen (Ausgabe Alexa, Senden Bild nach Telegram, Ablage Bild Server,...)
Das mal grobe Vorgehensweise.
VT der Lösung: Man bekommt Alarme ohne Bewegungsmelder
NT der Lösung: Bauchschmerzen habe ich, da jede Sekunde was auf die Festplatte (SSD) geschrieben wird, dass diese bald defekt wird?!Kannst Du noch 2-3 Sätze zu Zoneminder schreiben? Vielleicht ist dies ja sogar die bessere Alternative, die ich nicht kannte. Auf welcher Basis erfolgt eine Personenerkennung bzw. Alarmerkennung? Reiner Bildvergleich?
-
@coyote helfe gerne weiter (soweit ich das kann), habe nur gerade wenig Zeit.
Basis für alles ist die reine PErsonenerkennung auf dem Jetson Nano unter Linux. Habe mich da an dem orientiert.
https://pjreddie.com/darknet/install/In Iobroker rufe ich dann per Script "jede Sekunde" die Personenerkennung auf dem jetson auf. Verbinde mich dazu per Script auf den Jetson auf die Konsole und "schreibe da" programmatisch den "Befehl" zur Personenerkennung und übergebe dabei das kurz zuvor neue geladene Bild von der Kamera. Dann lese ich programmatisch die Konsole aus und schaue ob eine Person dabei war. Falls ja, starte ich nachfolgende Aktionen (Ausgabe Alexa, Senden Bild nach Telegram, Ablage Bild Server,...)
Das mal grobe Vorgehensweise.
VT der Lösung: Man bekommt Alarme ohne Bewegungsmelder
NT der Lösung: Bauchschmerzen habe ich, da jede Sekunde was auf die Festplatte (SSD) geschrieben wird, dass diese bald defekt wird?!Kannst Du noch 2-3 Sätze zu Zoneminder schreiben? Vielleicht ist dies ja sogar die bessere Alternative, die ich nicht kannte. Auf welcher Basis erfolgt eine Personenerkennung bzw. Alarmerkennung? Reiner Bildvergleich?
@uwe72 ok, schaue ich mir mal an.
Zu Zoneminder und ZMEventnotification schau mal hier: https://zmeventnotification.readthedocs.io/en/latest/guides/hooks.html
Dort ist alles gut erklärt. War meiner Meinung nach ein langer Installationsprozess, aber funktioniert. Hätte es nur gerne etwas schneller, aber ich denke das liegt eher an Zoneminder -> iobroker ZMAdapter.
Erkennung läuft bei Zoneminder auch mit OpenCV, aber wie genau die Erkennung funktioniert bzw ob es reiner Bildvergleich ist, kann ich dir gerade nicht sagen -
@uwe72 ok, schaue ich mir mal an.
Zu Zoneminder und ZMEventnotification schau mal hier: https://zmeventnotification.readthedocs.io/en/latest/guides/hooks.html
Dort ist alles gut erklärt. War meiner Meinung nach ein langer Installationsprozess, aber funktioniert. Hätte es nur gerne etwas schneller, aber ich denke das liegt eher an Zoneminder -> iobroker ZMAdapter.
Erkennung läuft bei Zoneminder auch mit OpenCV, aber wie genau die Erkennung funktioniert bzw ob es reiner Bildvergleich ist, kann ich dir gerade nicht sagen -
@coyote Danke dir. Habe nur mal ganz schnell drüber gescrollt. Vielleicht ist dein Weg sogar der bessere. Ich schaue mir dies definitv mal an! Kannte ich nicht bis jetzt.
-
@uwe72 kannst du das Ganze etwas mehr erläutern? Momentan nutze ich Zoneminder für die Personenerkennung in einem LXC Container. Die Erkennung Zoneminder -> iobroker ZM Adapter -> Telegram Nachricht ist aber "relativ" langsam. Die Personenerkennung an sich ist recht schnell, nur bis der ZM Adapter es mitbekommen hat und ich eine Nachricht bekomme, dauert recht lange.
Du nutzt also ein Script/Programm für die Erkennung, die auf einem Jetson Nano läuft richtig? Würdest du das Programm bereitstellen? -
@coyote Wie lange dauert die reine Personenerkennung wenn Du diese auf der Linux Konsole aufrufst? Ist dies ein LXC-Container?
Hat dies Anleitung zu zoneminder bei dir out-of-the-box funktioniert?
@uwe72 ja, habe alles in einem lxc Container.
Müsste ich mal genau prüfen, wie lange es dauert. Habe heute morgen nochmal kurz die Uhrzeit verglichen, wann das Bild mit der Person gemacht wurde und wann es bei telegram an kam, Zeitunterschied war ne gute Minute, dass ist einfach viel zu viel.
Ja, funktionierte eigentlich alles recht schnell, dauerte halt ein wenig bis alles installiert war, aber ging dann nachdem die objectconfig.ini eingerichtet war.
Ich schaue mir die Woche noch den iSpy Agent DVR an, dass sieht interessant aus -
@uwe72 ja, habe alles in einem lxc Container.
Müsste ich mal genau prüfen, wie lange es dauert. Habe heute morgen nochmal kurz die Uhrzeit verglichen, wann das Bild mit der Person gemacht wurde und wann es bei telegram an kam, Zeitunterschied war ne gute Minute, dass ist einfach viel zu viel.
Ja, funktionierte eigentlich alles recht schnell, dauerte halt ein wenig bis alles installiert war, aber ging dann nachdem die objectconfig.ini eingerichtet war.
Ich schaue mir die Woche noch den iSpy Agent DVR an, dass sieht interessant aus