[TUTO] Installer & ...
 
Share:
Notifications
Clear all

[TUTO] Installer & utiliser ZoneMinder et zmeventnotification (reconnaissance faciale / plaque d’immatriculation / objets) avec Nextdom

Page 1 / 2
vinceg77
(@vinceg77)
Membre Moderator

PRESENTATION GENERALE

Le but de ce tuto en 5 (voire 6) parties est de se créer son équivalent Netatmo Welcome avec un Nextdom (en mqtt), ZoneMinder une simple caméra chinoise (ou pas !).

ZoneMinder est un logiciel de cctv très complet qui permet de gérer un ensemble de caméra. Plus précisément il est possible avec ZM de monitorer ses caméras, de définir des zones d’images déclenchant des alertes, de stocker ces alertes et plus généralement de manager tout cela. Ce logiciel peut sembler complexe tant il est complet, et j’avoue d’ailleurs que je suis loin d‘en avoir fait le tour (le ferais-je vraiment un jour ??) Certains le trouve un peu rebutant, mais en réalité il suffit d’y consacrer un peu de temps et de mettre un minimum les mains dans le cambouis pour se rendre compte que ce n’est pas si complexe, que c’est plutôt bien foutu, très bien documenté (en anglais certes) et surtout qu’il n’est pas nécessaire de tout y comprendre, tout du moins pour une utilisation classique et domestique, ce qui sera certainement le cas de ceux qui me lisent ici.

Zmeventnotification est une sorte d’addon à ZM qui s’installe sur la machine zm comme un greffon, et qui va permettre d’une part de superviser zm depuis une applications mobile (zmNinja) disponible sur Android et IOS (je ne traiterai pas de la partie zmNinja dans ce tuto). Surtout, zmeventnotification va ajouter à ZM la possibilité de faire de la reconnaissance d’objets (81 objets ont été ainsi définis) au serveur en machine learning par PliablePixels, (le développeur de zmeventnotification), de la reconnaissance faciale (via des photos que l’on fournit soi-même au serveur) ou encore de la reconnaissance de plaque d’immatriculation. En cas de succès de cette reconnaissance, zmeventnotification va envoyer une notification soit à zmNinja, soit à tout broker mqtt en écoute sur le réseau (ce qui vous l’aviez compris va nous permettre de communiquer avec NextDom !).

  1. Dans la première partie nous verrons comment installer zoneminder
  2. La seconde partie abordera (rapidement) la configuration générale, l’ajout de caméra et les premières notions d’utilisation de Zoneminder
  3. La troisième partie sera consacrée à installer et configurer l’addon zmeventnotification
  4. La quatrième partie portera sur la reconnaissance d’objet/faciale/plaque d’immatriculation
  5. La cinquième partie sera plus succincte et abordera l’intégration dans Nextdom
  6. La sixième partie (a venir plus tard) sera réservée pour quelques éventuelles modifications ultérieures, les mise à jour de zm eventnotification, deporter les enregistrements sur un NAS, ou autre …

Cette présentation sera basée sur un déploiement d’un LXC Debian 10 sous proxmox 6.0-7 (cette partie n’est pas abordée ici). Libre à chacun de l’adapter pour un autre environnement (machine virtuelle / NUC / baremetal / voire Raspberry 4) sachant qu’il faut quand même un minimum de ressources pour faire tourner zoneminder et zmeventnotification.

info spéciale pour @Therealcorwin : oui oui t’inquiète, ca doit même marcher sous Esxi (enfin encore que …) 😉 😀 

Pour ma part je me contente de 2 cœurs de CPU, 3096 Mo de RAM et 1524 Mo de swap) en production, mais je double ces ressources pour l’installation afin de gagner un peu de temps, puisque nous allons voir que certaines dépendances demandant pas mal de ressources pour s’installer (rapidement). Je n’ai pas passé beaucoup de temps à benchmarker ces ressources systèmes et n’ayant que peu de recul sur zoneminder, ces informations seront éventuellement à revoir ou à adapter, notamment en fonction du nombre et du type de caméras, et de la quantité et qualité attendue de la reconnaissance.

EDIT : En fait l’installation de la reconnaissance faciale ne passe pas avec 4 cœurs 6 Gib de Ram et 3 Gib de swap, j’ai du passer à 6 cœurs 12 Gib de RAM et 6 Gib de swap pour que ca fonctionne (cf. partie 3 du tuto) juste le temps de l'installation

mais d'une part ca peut peut-être passer chez vous avec moins de ressources, et d'autre part je n'ai aucune certitude sur le fait que la commande qui bloquait chez moi (sudo -H pip3 install face_recognition en l’occurrence) ne fonctionnait pas à cause de ressources trop faibles de ma machine. J'ai juste augmenter temporairement les ressources de mon lxc et j'ai constaté que ca fonctionnait alors et j'en ai déduis (peut être un peu hâtivement) que c'était un problème de ressources machines. Vos retours sur ce point apporteront je l'espère des précisions sur ce sujet. Une fois installé ca tourne parfaitement avec 2 cœurs de CPU, 3096 Mo de RAM et 1524 Mo de swap (et peut être moins encore, je n'ai pas testé !)

EDIT2 : Un utilisateur, @dcjona a installé sans souci zmeventnotification sur son Hystou P04 core i5 525OU avec 8 Gb de ram et un SSD de 256Go. Mes doutes sur la réelle nécessité d'avoir une grosse config semblent finalement se confirmer ... !

Assez parlé, on y va pour la 1ere partie : installation de ZoneMinder !

This topic was modified Il y a 2 années 12 times by vinceg77
Quote
Topic starter Posté : 07/10/2019 3:21
vinceg77
(@vinceg77)
Membre Moderator

PARTIE 1 : INSTALLATION DE ZONEMINDER

N.B. Cette partie du tuto est largement inspirée du wiki officiel de zoneminder

 

Si vous êtes sur une debian toute fraîche, selon les cas, il manque peut être des outils de base.

Pour les installer (en root) :

apt update && apt upgrade -y

apt install -y software-properties-common gnupg wget ca-certificates sudo

apt update

 

C’est parti pour installer :

  • Apache2
  • PHP
  • MariaDb

On commence par mettre à jour les repos :

sudo nano /etc/apt/sources.list

Puis on ajoute à la fin du fichier sources.list le repo zoneminder :

deb  https://zmrepo.zoneminder.com/debian/master  buster/

On sauve Ctrl+O et on quitte nano Ctrl+X

On met a jour la liste des paquets disponibles :

sudo apt update && apt upgrade -y

On installe les paquets suivants :

sudo apt install apt-transport-https gnupg

 puis on récupère la clé depuis le repo :

wget -O -  https://zmrepo.zoneminder.com/debian/archive-keyring.gpg  | sudo apt-key add -

 On peut installer Zoneminder :

sudo apt update -y

puis :

sudo apt install zoneminder

(après les premières lignes, accepter l’installation avec Y ou O selon le langage de voter Debian)

C’est parti pour quelques secondes ou minutes ou heures d’installation selon votre connexion internet !

Si vous avez rencontré des erreurs MySQL ou MariaDB durant l'installation, on fait :

sudo dpkg-reconfigure zoneminder

Puis on active zoneminder comme service :

sudo systemctl enable zoneminder.service

 Ensuite il faut activer le virtualhost zoneminder sous Apache, et ajouter les modules apaches qui vont bien :

sudo a2enconf zoneminder

sudo a2enmod rewrite

sudo a2enmod cgi

 On ajoute sa timezone au module PHP :

On ouvre le fichier php.ini avec nano :

sudo nano /etc/php/7.3/apache2/php.ini

puis on lance une recherche sur la chaine  [Date]  dans nano : CTRL+W, on saisit le texte ou copie colle Date puis Entrée pour lancer la recherche

On doit tomber sur quelque chose qui ressemble à ça dans le fichier :

[Date]; Defines the default timezone used by the date functions

; http://php.net/date.timezone

; date.timezone =

 On se positionne sur cette dernière ligne (;date.timezone =) on supprime le point-virgule et on saisit sa timezone (Europe/Paris) pour la France.

Alors oui je sais, vous habitez pas forcément Paris, et puis Paris c’est pourri, parisiens têtes de chiens etc.. 😀 🤣 Mais c’est pas de ma faute si y a pas Bordeaux, Le Mans , ni Triffoulli-Les-Oies !!!. Si vous n’êtes pas en France, ou que cela vous est vraiment insupportable de mettre Paris 😉, vous trouverez ici la liste des fuseaux horaires acceptés par PHP

Bref, je me retrouve donc avec ces lignes :

[Date]; Defines the default timezone used by the date functions

; http://php.net/date.timezone

date.timezone = Europe/Paris

Comme toujours, on sauve avec Ctrl+O et on quitte nano avec Ctrl+X

On relance le service Apache2 pour qu’il prenne en compte nos modifications :

sudo service apache2 reload

puis on démarre ZoneMinder :

sudo systemctl start zoneminder

 Si tout s’est bien passé, en ouvrant un navigateur à l’adresse http://votreip/zm , vous devriez tomber sur cette page qui vous propose d’accepter le contrat proposé imposé (en cliquant sur APPLY en bas à droite de la page) :

1st-connexion

On arrive alors sur l’interface principale de ZoneMinder – un peu vide à ce stade.

Si zoneminder vous demande de vous authentifier :

login : admin

password : admin

On se retrouve dans la seconde partie pour la configuration et les premières notions d’utilisation de notre superbe CCTV fraîchement installé !

This post was modified Il y a 2 années 12 times by vinceg77
This post was modified Il y a 1 année 2 times by vinceg77
RépondreQuote
Topic starter Posté : 07/10/2019 3:22
vinceg77
(@vinceg77)
Membre Moderator

PARTIE 2 : CONFIGURATION & INSTALLATION DE ZONEMINDER

Maintenant que Zoneminder est installé, la première chose à faire est de mettre en place un authentification, surtout si vous avez l’intention de rendre Zoneminder accessible depuis l’extérieur de votre réseau local.

Screenshot 1

Pour cela cliquer dans le bandeau du haut sur Options (1) puis sur System (2)

Il faut que

OPT_USE_AUTH soit activé (3)

AUTH-TYPE sur builtin (4)

AUTH-RELAY sur hashed (5)

On saisit un code de hashage dans AUTH_HASH_SECRET (n’importe quelle combinaison de lettres minuscules/majuscules et chiffre) (6)

Enfin il faut que AUTH_HASH_IPS soit activé (7)

 N’oubliez pas de sauver (petit bouton en bas à droite de la page)

Il va vous être demandé de vous identifier

Login : admin

Password : admin

 Il est possible d’ajouter des utilisateurs (8) en leur attribuant des droits d’utilisation spécifiques.

Depuis la page d’options on peut aussi changer la langue utilisée (LANG_DEFAULT) et l’onglet Affichage permet de changer de thème et de CSS , même si le classic semble etre celui qui permet la meilleure visualisation avec un navigateur sur PC/

Pas d’autres options sont configurables, dont la possibilité de configurer un mail pour recevoir des notifications.

 

Il est temps d’ajouter une caméra :

C’est très simple !

Screenshot 2

Depuis l’interface principale on clique sur « AJOUTER CAMERA » (1). Une popup s’ouvre et permet de saisir manuellement les caractéristiques de sa caméra dans les différents onglets proposés.

En cliquant sur le lien préréglages en haut à droite de cette popup on peut choisir des préréglages pour une liste de caméras de marques (Axis / Panasonic / Dlink / Vivotec/ Foscam / etc)

Mais encore encore plus simple, zm comprend une sonde Onvif (lien ONVIF en haut à droite de la popup (2) ) qui va scanner le réseau local à la recherche des caméras ONVIF disponibles (3).

Une fois trouvées, il suffit de saisir les éventuels identifiants/mot de passe (4) puis de sélectionner le profil de flux désiré pour la caméra (la création du profile de flux se fait normalement au niveau de la caméra, ou plutôt de son logiciel de control d’origine).

Screenshot 3

Les champs sont normalement préremplis, mais outre donner un nom à notre nouvelle caméra il est préférable de valider les différents paramétres en fonction de sa caméra

A noter que pour que mon interphone vidéo Doorbird D101 soit acceptée, il faut que je choisisse ‘HTTP Tunel’ dans le champs méthode de l’onglet Source (7)

Le champs ‘% fusion image référence’ (5) peut etre à adapter en fonction que votre caméra soit à l’intérieur (indoor) ou à l’extérieurs (outdoor)

Enfin le champs ‘% fusion image référence en alarme’ définit le pourcentage de pixel qui doivent être modifiés par rapport à l’image de référence pour que zm déclenche une alarme. Mais cette valeur pourra être outrepassée au niveau des réglages des zones de détection que nous verrons après.

Ainsi pour reconnaître une voiture sur un portier vidéo 6,25% seront normalement suffisant. Pour reconnaître un chat sur le même portier vidéo il vaudrait mieux choisir une valeur de 3,125%

 On sauvegarde et la caméra apparaît désormais dans l’interface principale de zm

Screenshot 4

Lorsque la caméra apparaît avec un point vert c’est qu’elle capture, sinon c’est en rouge (1).

  • Pour modifier la configuration de la caméra on clique sur son IP (2).
  • Pour voir le flux de notre caméra on clique sur son nom (3)
  • La caméra peut être dans 6 modes différents (4) :
    • Aucun : la caméra est désactivée
    • Monitor : la camera affiche juste son flux temps-réel
    • Modect : Enregistre que si un mouvement est détecté
    • Record : enregistre juste son flux 24h/24 / pas de détection
    • Mocord : enregistre son flux 24h/24 ET détecte les mouvements
    • Nodect : n’enregistre pas tant qu’un élément externe à zm ne lui dit pas de le faire via la fonction zmtrigger

Si un mode avec détection de mouvement est sélectionné, les alarmes de mouvements vont générer des « événements » (events) qui seront affichés et visualisables sous la colonne ‘événements’ (5)

Il suffit de cliquer sur le chiffre indiquant le nombre d’événements pour accéder à la liste des événements enregistrés par zm.

 

Le dernier point de cette présentation rapide consistera à définir une zone de détection dans un flux :

Screenshot 5

Pour cela on clique sur le nombre de zone de la caméra (par défaut 1) renseigné dans la colonne ‘zone’ -6)

Cela ouvre une fenêtre popup qui nous donne une récapitulatif des zones définies (une seule  par défaut qui couvre toute l’image).

En cliquant en haut à gauche sur le nom de cette zone (elle s’appelle ‘All’ par défaut) ou en cliquant sur la partie rouge de l’image (la zone définie est en surcouche rouge sur l’image du flux) une nouvelle popup va apparaître.

Dans cette fenêtre il est possible

  • de redéfinir la zone en cours d’édition (en tirant les poignées vertes au quatre coins) ou de lui donner la forme que l’on souhaite en ajoutant/retirant des points (1)
  • de la renommer (2)
  • de définir son type (active / inactive)(3)
    • Active : déclenche des alarmes en cas de détection de mouvement
    • Inactive : pas de surveillance sur ces zones
    • Les autres types peuvent servir de pré-alarme ou de condition pour que le zone active déclenche une alarme. C’est plus complexe à mettre en œuvre mais permet une grande précision afin d’éviter les faux positifs (cf aide de zoneminder pour aller plus loin dans ces réglages)

      

    A ce stade normalement vos caméras sont configurées, les zones de détections sont définies et vous connaissez les rudiments de l’utilisation de zoneminder. On se retrouve très bientôt pour installer zmeventnotification et mettre en place la reconnaissance d'objets/faciale/plaques sur les événements générés par nos alarmes ainsi définies !

    This post was modified Il y a 2 années 9 times by vinceg77
    RépondreQuote
    Topic starter Posté : 07/10/2019 3:22
    vinceg77
    (@vinceg77)
    Membre Moderator

    PARTIE 3 : INSTALLATION DE zmeventnotification

    N.B Cette partie du tuto est très largement inspirée de la doc officielle qui se trouve ici

     Avant d’installer zmeventnotification, on va configurer notre zoneminder installé en partie 2 de ce tuto pour qu’il soit en https . Si vous souhaitez plus tard utiliser l’application mobile zmNinja pour recevoir vos des notifications ou superviser zoneminder il faut absolument que les certificats soient émis par une autorité de certification (comme let’s encrypt par exemple), les certificats auto-signés ne fonctionneront pas. De plus zmeventnotification utilise par défaut le mode sécurisé, cela nous fait une deuxième bonne raison pour générer des certificats SSL, sinon le script ne fonctionnera pas, alors c’est parti :

    N.B. : je maîtrise assez mal cette partie configuration réseau, si quelqu’un veut me corriger ou apporter des précisions sur ce point, qu’il n’hésite pas à se manifester !

    On crée le répertoire qui hébergera nos fichiers :

    mkdir -p /etc/zm/apache2/ssl/

    (on peut remplacer /etc/zm/apache2/ssl/ par le répertoire existant de son choix, mais retenez le car on va en avoir besoin plus tard)

    Puis on génère le certificat :

    sudo openssl req -x509 -nodes -days 4096 -newkey rsa:2048 -keyout /etc/zm/apache2/ssl/zoneminder.key -out /etc/zm/apache2/ssl/zoneminder.crt

    On saisit son password root

    Generating a RSA private key

    ..................+++++

    .......+++++

    writing new private key to '/etc/zm/apache2/ssl/zoneminder.key'

    -----

    You are about to be asked to enter information that will be incorporated

    into your certificate request.

    What you are about to enter is what is called a Distinguished Name or a DN.

    There are quite a few fields but you can leave some blank

    For some fields there will be a default value,

    If you enter '.', the field will be left blank.

    -----

    puis on répond poliment aux questions qui nous sont posées :

    Country Name (2 letter code) [AU]:FR

    State or Province Name (full name) [Some-State]:Syldavie

    Locality Name (eg, city) []:Triffoully-Les-Deux-Oiseaux

    Organization Name (eg, company) [Internet Widgits Pty Ltd]:KGB

    Organizational Unit Name (eg, section) []:Anti_Terrorisme

    Common Name (e.g. server FQDN or YOUR name) []:mondomaine.com

    Email Address []:mon_adresse@email.com

    (pour ceux qui ne suivent que de loin : répondez sérieusement aux questions, ne faites pas comme moi, c’était juste à titre d’exemple ! 😊 )

    Le plus important est de bien mettre votre IP ou votre nom de domaine à partir duquel vous souhaitez accéder à zoneminder lorsque l’on vous demande le Common Name. Par exemple, si vous souhaitez accéder au serveur zoneminder depuis l’adresse myserver.ddns.net il faut bien mettre myserver.ddns.net comme Common Name.

    On peut vérifier que le certificat et sa clé ont bien été créés dans le répertoire que nous avions spécifié (ici /etc/zm/apache2/ssl/) :

    ls -l /etc/zm/apache2/ssl/

    On doit y trouver les fichiers zoneminder.crt and zoneminder.key.

    On donne le droit à notre Event Server de lire cette clé :

    chmod o+r /etc/zm/apache2/ssl/zoneminder.key

    On installe le mod ssl pour apache :

    sudo a2enmod ssl

    et on active la configuration ssl :

    sudo a2ensite default-ssl

    puis on redémarre apache :

    systemctl reload apache2

    Si tout s’est bien passé, vous devez désormais pourvoir accéder à ZoneMinder depuis l’adresse suivante après avoir passé la mise en garde de sécurité de votre navigateur :

    https://votreIP/zm

    Optionnel : si vous souhaitez désactiver l’accès non sécurisé à zm :

    sudo a2dissite 000-default

      

    On attaque maintenant l’installation zmeventnotification et de son « moteur » Event Server (ES)

    Event Server nécessite pour fonctionner tout un tas de dépendance, on va donc commencer par les installer. Selon votre OS certaines seront d’ailleurs peut être déjà présentes sur votre système.

    On va avoir besoin de la commande git, si elle n’est pas déjà installée sur votre système il va falloir l’ajouter :

    sudo apt install git

    On peut désormais cloner le projet depuis le github de son excellent développeur, PliablePixels :

    git clone  https://github.com/pliablepixels/zmeventnotification.git 

    Cela va nous créer un sous répertoire zmeventnotification dans le répertoire courant.

    On peut tout de suite rentrer dans la configuration du fichier zmeventnotification.ini :

    cd zmeventnotification

    sudo nano zmeventnotification.ini

    Les différentes rubriques de configuration étant bien commentées, je ne vais pas rentrer dans le détail de chaque ligne, je vous laisse regarder. Cependant quelques lignes sont importantes :

    • Le port pour les connexions de la websocket (9000 par défaut, penser à vérifier que le port n’est pas déjà utilisé sur votre réseau et ouvrir les éventuels firewalls pour qu’il soit accessible depuis l’externe en TCP bi directionnel) :

    [network]# Port for Websockets connection (default: 9000)

    port = 9000

    • L’adresse et les identifiants de votre serveur mqtt (si vous en avez définit pour votre serveur mqtt). En général c’est l’adresse de votre machine Nextdom qui héberge aussi votre plugin / serveur mqtt. Ceux qui l’ont externalisé sauront mettre ici l’adresse de leur serveur. C’est très important car c’est ce qui va permettre de faire communiquer zmeventnotification avec Nextdom comme nous le verrons en partie 5 de ce tuto.
    • On modifie donc ici pour que cela ressemble à quelque chose comme ça :

    # Use MQTT for messaging (default: no)[mqtt]

    enable = yes

    # MQTT server (default: 127.0.0.1)

    server = 192.168.0.29

    # Authenticate to MQTT server as user

    username = votrelogin_mqtt

    password = votre_motdepasse_mqtt

    • On lui indique les répertoires des certificats SSL. Les premiers -Let’s encrypt par exemple – qui seront partagés avec votre serveur front end si vous en avez un, et ceux que nous avions précédemment générés propres à zoneminder (bien vérifier que le chemin vers zoneminder.key et zoneminder.cert est correct) :

    N.B. : je maîtrise assez mal cette partie configuration réseau, si quelqu’un veut me corriger ou apporter des précisions sur ce point, qu’il n’hésite pas à se manifester !

    [ssl]

    # Enable SSL (default: yes)

    enable = yes

    #cert =  /etc/letsencrypt/live/domain/fullchain.pem

    #key =  /etc/letsencrypt/live/domain/privkey.pem

    # Location to SSL cert (no default)

    cert = /etc/zm/apache2/ssl/zoneminder.crt

    # Location to SSL key (no default)

    key = /etc/zm/apache2/ssl/zoneminder.key

    • On peut lui demander d’afficher les messages sur la console lorsque l’on lance le script manuellement ce qui sert beaucoup pour debugger :

    [customize]

    # Display messages to console (default: no).

    # this is only needed when you are running it manually on command line

    # you don't need this if you already have ZM DEBUG logs on for ES

    console_logs = yes

    • Et comme on utilise une version de zoneminder ultérieure à 1.31.2 on lui demande d’afficher ce qui a provoquer l’alarme :

    # Read monitor alarm cause (Requires ZoneMinder >= 1.31.2, default: no)

    # Enabling this to 1 for lower versions of ZM will result in a crash

    read_alarm_cause = yes

    • Très important, on customise l’URL d’accès aux images des événements en décommentant les lignes et en remplaçant https://yourportal.ddns.net/ par sa propre URL ou IP :

    # URL to access the event image

    # This URL can be anything you want

    # What I've put here is a way to extract an image with the highest score given an eventID (even one that is recording)

    # This requires the latest version of index.php which was merged on Oct 9, 2018 and may only work in ZM 1.32+

    # https://github.com/ZoneMinder/zoneminder/blob/master/web/index.php

    # If you use this URL as I've specified below, keep the EVENTID phrase intact.

    # The notification server will replace it with the correct eid of the alarm # BESTMATCH should be used only if you are using bestmatch for FID in detect_wrapper.sh

    # objdetect is ONLY available in ZM 1.33+ # ** DO NOT PUT PASSWORD AND USERNAME IN URL, see below **

    picture_url = https://192.168.0.56/zm/index.php?view=image&eid=EVENTID&fid=BESTMATCH&width=600

    picture_url = https:// 192.168.0.56/zm/index.php?view=image&eid=EVENTID&fid=objdetect&width=600

    picture_url = https:// 192.168.0.56/zm/index.php?view=image&eid=EVENTID&fid=snapshot&width=600

    picture_url = https:// 192.168.0.56/zm/index.php?view=image&eid=EVENTID&fid=alarm&width=600

    • puis on renseigne son login/password d’accès à la console zoneminder tels que définis dans la partie 2 de ce tuto :

    # You need ot specify your ZM portal username and password here. They will be appended to the picture_url

    # to be able to load the image. DO NOT put the password in the URL because it may have special characters# like "&@# etc that will be considered as URL params/segments/invalid characters

    picture_portal_username=votre_login

    picture_portal_password=votre_motdepasse

    • On décommente l’appel au script de détection, et on lui demande de fournir le texte de détection qui recouvrira l’en-tête de l’alarme ce qui permettra par exemple d’afficher le nom sur un visage détecté :

    [hook]

    # Shell script name here to be called every time an alarm is detected

    # the script will get passed $1=alarmEventID and $2=alarmMonitorId

    # script needs to return 0 to send alarm (default: none)

    hook_script = '/usr/bin/detect_wrapper.sh'

    # If 1, the text returned by the script# overwrites the alarm header

    # useful if your script is detecting people, for example

    # and you want that to be shown in your notification

    use_hook_description = yes

    • On peut éventuellement désactiver la reconnaissance pour une ou plusieurs caméras en décommentant la ligne skip_monitors = et en indiquant le numéro de caméra

    # list of monitors for which hooks will not run

    # skip_monitors = 2

    • Enfin, last but not least, on lui indique de passer le chemin des images afin qu’il les affiche les reconnaissances dans la web UI de zoneminder en décommentant la dernière ligne du fichier :

    # if enabled, will pass the right folder for the hook script

    # to store the detected image, so it shows up in ZM console view too# Requires ZM >=1.33. Don't enable this if you are running an older version

    # Note: you also need to set write_image_to_zm=yes in objectconfig.ini

    # default: no

    hook_pass_image_path = yes

    Comme toujours, on sauve avec Ctrl+O et Entrée et on quitte nano avec Ctrl+X

    Maintenant que notre premier fichier ini est configuré on est parti pour l’installation d’un bon paquet de dépendances. Le plus simple à ce stade est de se loguer en root, ca évitera les sudo… :

    su

    on entre mot de passe root

    on installe les packages de base (ils y sont peut être déjà, mais je les mets ici si ce n’était pas le cas) :

    apt-get install gcc make cmake perl libcrypt-mysql-perl libcrypt-eksblowfish-perl libmodule-build-perl python python3-pip libyaml-perl libjson-perl

    on met à jour CPAN :

    sudo perl -MCPAN -e "install CPAN"

    on continue avec l’installation des packages perl :

    • Crypt::MySQL (pas nécessaire pour zoneminder 1.34 et ultérieur mais si vous avez suivi la partie 2 de ce tuto, au jour de publication de ce tuto, notre zm est en stable v1.33.14 )
    • Net::WebSocket::Server
    • Config::IniFiles (peut être déjà installé sur votre système)
    • Crypt::Eksblowfish::Bcrypt (déjà présent avec zoneminder 1.34 et ultérieur, mais meme remarque que précédemment, on installe quand même)
    sudo perl -MCPAN -e "install Crypt::MySQL"

    (on tape yes + entrée pour accepter l’automatisation de l’installation

    sudo perl -MCPAN -e "install Config::IniFiles"sudo perl -MCPAN -e "install Crypt::Eksblowfish::Bcrypt"

    On installe Websockets :

    sudo perl -MCPAN -e "install Net::WebSocket::Server"

    les librairies HTTPS pour LWP :

    perl -MCPAN -e "install LWP::Protocol::https"

    MQTT :

    perl -MCPAN -e "install Net::MQTT::Simple"

    La fonction getopt :

    perl -MCPAN -e "install Getopt::Long"

    Normalement tout est désormais installé. On va donc commencer par tester l’Event Server en mode manuel. Pour cela on  rend le script executable :

    chmod a+x ./zmeventnotification.pl

    On démarre le script en mode manuel :

    sudo -u www-data ./zmeventnotification.pl --config ./zmeventnotification.ini

    Si tout va bien, il devrait y avoir des lignes qui défilent puis la ligne Web Socket Event Server listening on port 9000 puis des Tick START et des Tick END indéfiniment

    Ctrl + C pour l’arrêter

    Si tout fonctionne, il est temps d’installer l’ES. Pour cela :

    sudo ./install.sh

    Puis Entrée pour valider l’installation puis Y (yes) à chaque question

    On retourne dans l’interface web de zoneminder et dans Options-> Système on active l’option OPT_USE_EVENTNOTIFICATION puis SAUVEGARDER tout en bas à droite

    Maintenant que l’Event Server est installé il faut s’occuper de la partie reconnaissance

    On commence par installer ces quelques paquets optionnels mais qui vont donner un boost de vitesse à notre serveur :

    sudo apt-get install libopenblas-dev liblapack-dev libblas-dev

    et puis on installe les packages python suivants (la plupart le sont probablement déjà :

    sudo -H pip3 install opencv_contrib_python
    sudo -H pip3 install future
    sudo -H pip3 install numpy
    sudo -H pip3 install requests
    sudo -H pip3 install Shapely
    sudo -H pip3 install imutils

    et enfin surtout :

    sudo -H pip3 install face_recognition
    Cela va installer pas mal de dépendances. Il y en a pour un bon moment, vous pouvez aller vous préparer un café, voire un whisky, voire aller au ciné, voire partir en week-end, selon votre config…!

    C’est pour cette commande là que je vous avais conseillé de booster votre config pour l’installation dans la présentation de ce tuto. D’ailleurs il faut que je corrige dans la présentation parce que chez moi en fait ça ne passe pas avec 4 cœurs de CPU, 6192 Mo de RAM et 3048 Mo de swap j’ai dû upgrader le container en 6 cœurs 12 Gib de RAM et 6 Gib de swap pour ne pas avoir d’erreur (et c’est du coup beaucoup plus rapide, environ 3 minutes)

    On crée ensuite les répertoires nécessaires au fonctionnement de la reconnaissance :

    sudo mkdir -p /var/lib/zmeventnotification/images
    sudo mkdir -p /var/lib/zmeventnotification/models
    sudo mkdir -p /var/lib/zmeventnotification/known_faces

    C’est dans ce dernier répertoire (known_faces) que l’on va plus tard placer les photos des visages que l’on souhaite reconnaître.

    On installe les modèles de reconnaissance :

    Si vous souhaitez utiliser YoloV3 (lent, précis)

    sudo mkdir -p /var/lib/zmeventnotification/models/
    sudo wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg -O /var/lib/zmeventnotification/models/yolov3/yolov3.cfg
    sudo wget https://raw.githubusercontent.com/pjreddie/darknet/master/data/coco.names -O /var/lib/zmeventnotification/models/yolov3/yolov3_classes.txt
    sudo wget https://pjreddie.com/media/files/yolov3.weights -O /var/lib/zmeventnotification/models/yolov3/yolov3.weights

    Si vous souhaitez utiliser TinyYoloV3 (plus rapide, moins précis)

    sudo mkdir -p /var/lib/zmeventnotification/models/tinyyolosudo wget  https://pjreddie.com/media/files/yolov3-tiny.weights  -O /var/lib/zmeventnotification/models/tinyyolo/yolov3-tiny.weights
    sudo wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3-tiny.cfg -O /var/lib/zmeventnotification/models/tinyyolo/yolov3-tiny.cfg
    sudo wget https://raw.githubusercontent.com/pjreddie/darknet/master/data/coco.names -O /var/lib/zmeventnotification/models/tinyyolo/yolov3-tiny.txt

    Moi je mets les deux, on pourra définir plus tard lequel utiliser au cas par cas

    On recopie le fichier de configuration :

    sudo cp hook/objectconfig.ini /etc/zm

    On vérifie que les droits en lecture/écriture sont donnés à l’utilisateur Apache (www-data) :

    sudo chown -R www-data:www-data /var/lib/zmeventnotification/

    On copie le fichier de détection vers /usr/bin :

    sudo cp hook/detect.py /usr/bin

    Bon, on a presque fini. Il reste a corriger le fichier de configuration objectconfig.ini que l’on a placé dans /etc/zm/ :

    nano /etc/zm/objectconfig.ini

    C’est dans ce fichier que l’on configure tout ce qui est relatif à la détection : Que veut on détecter ? Avec quel modèle de détection, etc… On abordera les détails de ce fichier dans la quatrième partie du tuto. Pour le moment on va juste modifier la partie [general] :

    • En rajoutant un slash / juste après portal=https:/ (ce typo m’a fait perdre des heures à m’arracher les cheveux 😊 )
    • en y mettant l’url de zm et les paramètres d’accès :

    [general]

    portal= https://192.168.0.56/zm

    user=admin

    password=admin

    allow_self_signed=yes

    On sauve avec Ctrl+O et Entrée et on quitte nano avec Ctrl+X

    Voila, on peut enfin tester manuellement si notre script de détection fonctionne. Pour cela on va avoir besoin d’un événement généré par ZoneMinder (vous vous souvenez de la partie 2 du tuto ?)

    Si vous aviez bien effectuer l’installation d’une caméra, que vous avez définit les zones de détection de cette caméra, que celle-ci est en mode MODECT et qu’il y a un mouvement devant votre caméra, vous devriez avoir une (ou plusieurs) alarme qui ont créées des événements. Dans l’interface web de ZoneMinder on clique sur le petit chiffre dans la colonne ‘Evénements’ et on arrive sur la liste de ces events. On en choisit un et on note son numéro (colonne N°). C’est son EID (Event ID). Il va nous falloir également le MID (Monitor ID) c’est-à-dire le numéro que zm a attribué à la caméra correspondant à cet event. Pour le trouver, rien de plus simple on retourne sur la page principale de zm et en passant la souris n’importe où sur la ligne d’une caméra on aperçoit un petit cadre jaune contenant un chiffre. Ce chiffre est le MID de votre caméra.

    On va donc tester avec la commande suivante :

    sudo -u www-data /usr/bin/detect_wrapper.sh <eid> <mid>

    en remplaçant <eid> <mid> par les chiffres précédemment trouvés. Par exemple ma caméra n°3 (enfin pour parler zm je devrais dire monitor n°3) a généré un event N°1 que je vais donc utiliser pour tester avec :

    sudo -u www-data /usr/bin/detect_wrapper.sh 1 3

    Le mieux serait que votre event contienne soit une voiture, une moto, un bus, un camion ou une voiture !!! Ce sont les objets qui sont configurés par défaut pour la reconnaissance, mais nous verrons dans la prochaine partie comment reconfigurer tout ca. A noter que vous pouvez utiliser une photo devant votre caméra pour les test (oui certes c’est une limite de la reconnaissance d’objet et faciale, surtout pour nous qui utilisons cette techno dans le cadre de notre domotique !!!)

     

    Donc si tout va bien vous devriez avoir un retour de ce type :

    sudo -u www-data /usr/bin/detect_wrapper.sh 1 3

    [a] detected:car

     

    Si ce n’est pas le cas (message d’erreur), il va falloir trouver les causes, et commencer par relire cette partie du tuto !

    Si la réponse est vide c’est soit qu’il n’a rien détecté de précis, soit qu’il y a un problème avec votre fichier objectconfig.ini

     

    Voilà ! Si vous n’êtes pas encore à bout, que vous ne vous êtes pas pendu,  qu’il vous reste des cheveux, voire des yeux, rendez vous très bientôt pour une partie sympa du tuto dans laquelle on va appendre à configurer une détection sur mesure, et à la visualiser dans zoneminder !!!

    This post was modified Il y a 2 années 19 times by vinceg77
    RépondreQuote
    Topic starter Posté : 07/10/2019 3:22
    vinceg77
    (@vinceg77)
    Membre Moderator

    RESERVE

    This post was modified Il y a 2 années 4 times by vinceg77
    This post was modified Il y a 1 année by vinceg77
    RépondreQuote
    Topic starter Posté : 07/10/2019 3:22
    vinceg77
    (@vinceg77)
    Membre Moderator

    PARTIE 4 : CONFIGURATION DE LA RECONNAISSANCE

     

    Si vous avez bien suivi les 3eres parties de ce tuto vous devriez avoir ZoneMinder installé, zmeventnotification fonctionnel et prêt pour la reconnaissance de certains objets (pour mémoire une voiture, une moto, un bus, un camion ou un bateau). Nous allons voir dans cette partie comment configurer la reconnaissance de manière plus fine.

    Juste avant, je vous invite encore une fois à vous rendre dans votre console zoneminder, et à vérifier en accédant à la liste des événements (vous savez normalement comment faire désormais) qu’un de ses objets de base a bien était détecté (celui dont vous avez présenté pour test dans la partie précédente la photo à votre caméra). Une capture d’écran étant plus parlante, vous devriez normalement avoir ça :

    Screenshot 6

    Si vous cliquer sur le texte que j’ai ici encadré en rouge, ES vous apporte des précisions (basiques à ce stade) sur ce qu’il a reconnu :

    Screenshot 7

    Pour configurer notre reconnaissance, tout se passe dans le fichier objectconfig.ini que nous allons éditer :

     sudo nano /etc/zm/objectconfig.ini

     

    Le fichier est documenté à l’intérieur par le développeur mais attardons-nous cependant sur quelques sections importantes :

    Nous avions déjà évoqué la première section [general] qui normalement est déjà configurée, je ne reviens pas dessus ici

    match_past_detections=no

    Si match_past_detections=yes alors lors de de la détection suivante les objets ayant déjà été détectés par le moniteur et les cadres de sélection qui correspondent ne seront plus affichés dans les nouvelles détection. Cela peut servir pour ne détecter un objet qu’une fois ou surtout pour se débarrasser des objets statiques qui sont détectés en raison d'un mouvement.

     

    past_det_max_diff_area=5%

    Définit la différence maximale de surface entre les objets entre deux détections. La valeur peut aussi etre spécifiée en pixels de cette manière past_det_max_diff_area=300px. La valeur par défaut est 5%. Fondamentalement, les boîtes qui encadrent un même objet peuvent légèrement différer d'une détection à l'autre. D’après le retour utilisateur, 5% fonctionne bien. Changez-le si nécessaire.

     

    models=yolo

    Définit la séquence et les modèles de détection souhaitée. Les 4 différentes possibilité sont :

    • yolo: modèle pour reconnaitre les objets (pas trop lent, assez précis.  Nous verrons ci après plus en détail)
    • hog: autre modèle de reconnaissance d’objets (très rapide, peu précis)
    • inception: autre modèle de reconnaissance d’objets (très lent, très précis)
    • face:reconnaissance faciale

     

    L’ordre a une importance. models=yolo, face reconnaitra d’abord les objets et ensuite seulement les visages.

    Si vous sélectionnez yolo, vous pouvez ajouter :

    model_type=tiny ce qui sélectionnera le modèle tiny yolo (plus rapide mais moins précis que le modèle yolo complet)

     

    detection_mode=all

    Définit le mode de détection. Les 2 différentes possibilités sont

    • all: les 2 modèles (ci-dessus cf. models=) seront détectés
    • first: la première reconnaissance (d’un objet ou d’un visage selon ce qui a été définit avec models=) arrête la reconnaissance

     

    image_path=/var/lib/zmeventnotification/images

    Définit le répertoire où seront stockées les images téléchargées. Attention l’utilisateur apache2 (www-data) doit avoir les droits de lecteur et d’écriture sur ce répertoire ce qui est par défaut le cas.

     

    detect_pattern=(person|car|motorbike|bus|truck|boat)

    C’est ici que nous définissons ce qui doit etre reconnu, quel que soit le moniteur. Les 81 objets différents qui peuvent etre placés ici sont définis à cette adresse : https://github.com/pjreddie/darknet/blob/master/data/coco.names

    L’ordre n’a pas d’importance. Le nom correspondant a ce qui a été détecté apparaitra au-dessus du cadre de détection dans le moniteur d’événements

    A noter cependant que ‘person’ n’a pas de lien avec la détection de visage. Si ‘person’ se trouve dans cette liste, la détection sera faite pour un passant dans une rue ou le jardin par exemple et le cadre de détection affichera ‘person’ (soit personne en français). On peut détecter l’ensemble des 81 objets en mettant detect_pattern=.*

     

    frame_id=bestmatch

    On choisit ici sur quelle image la détection va se réaliser. Les événements dans zoneminder sont déclenchés sur la première image en alarme (tel que définit par la zone, cf. partie 2 du tuto). Ensuite les images en alarme suivantes sont également intégrées dans l’événement et un score « d’alarme » est attribué à chaque image du flux de l’événement (on peut d’ailleurs visualiser ce score depuis la console principale de zoneminder en cliquant sur le nombre d’évènements puis en cliquant sur le nombre dans la colonne ‘Images alarme’)

    Imaginer que l’on souhaite détecter une intrusion dans une maison. Dès que la porte de la maison va bouger, une première image d’alarme (au sens zoneminder !) va déclencher l’enregistrement de l’évènement, mais la personne qui entre n’apparaitra qu’au bout de la xième image… On peut donc ici affiner la détection en choisissant l’un des paramètres suivants :

    • bestmatch: La première image en alarme est analysée. Si aucun detect_pattern n’est trouvé l’analyse se porte sur l’image qui a le score d’alarme le plus élevé. Cette double analyse est faite simultanément, ce qui évite le double chargement du modèle et fait donc gagner du temps plutôt que d’appeler deux fois de suite le script python
    • alarm: La détection ne porte que sur la première image en alarme
    • snapshot: la détection ne porte que sur l’image qui a le plus gros score

    NB : vous pourrez trouver l’image retenue pour la reconnaissance dans : /var/detect/images/<EventId>.jpg

     

    resize=1200

    Permet de redimensionner l’image avant analyse

     

    delete_after_analyze=yes

    Définir delete_after_analyze=yes, si vous souhaitez supprimer des images après l'analyse. Il est recommandé de définir sur oui pour éviter de saturer l'espace disque

    On peut cependant mettre delete_after_analyze=yes pour le débogage / l'inspection des masques, mais les images ne seront pas effacées.

     

    write_debug_image=no

    Si write_debug_image=yes une image appelée <nomfichier> -bbox.jpg qui contient l’image analysée et qui affichera en plus les cadres de détection sera également sauvegardée dans le répertoire de sauvegarde définit précédemment. Cela n'a AUCUNE relation avec write_image_to_zm (cf ci après). En règle générale, si vous activez delete_after_analyze, vous mettrez probablement également write_debug_image sur no

     

    write_image_to_zm=yes

    Si write_image_to_zm=yes les cadres de détections seront affichés dans l’interface de zoneminder. Si write_image_to_zm=no les cadres n’apparaitront pas

     

    show_percent=yes

    Ajoute au cadre de détection le pourcentage de reconnaissance. A noter que le modèle hog pour la détection de visage affiche toujours 100%

     

    poly_color=(255,255,255)

    Couleur à utiliser pour dessiner les polygones que vous avez spécifiés

     

    import_zm_zones=no

    Ajoute dans l’image analysée un cadre correspondant aux zones définies dans zoneminder

     

     

    Il est possible dans ce fichier de définir des paramètres spécifiques par monitor (ou caméra)/ Le format est :

                    [monitor-<mid>]

    Dans chaque section de monitor on peut définir un polygone dans lequel la détection sera faite. On peut définir autant de polygone que l’on souhaite par monitor/caméra et leur donner le nom que l’on veut, mais il ne faut pas utiliser les mots clés utilisés par les autres champs de ce fichier.

    Ainsi on peut mettre pour un monitor qui ne doit détecter que sur la terrasse un polygone appelé terrasse encadrant cette terrasse sur l’image :

    terrasse=306,356 1003,341 1074,683 154,715

     

    A noter que le detect=pattern=( object1|object2|objectN) définit pour un monitor, annulera le detect=pattern global. On peut aussi définir une liste d’objets à NE PAS détecter en ajoutant les caractères suivants :

    detect_pattern = ^(?!object1|object2|objectN)

     

     

    [yolo]

    Dans cette section seront définit les paramètres et les fichiers du modèle yolo. On peut spécifier un pourcentage a partir duquel la détection sera considérée comme valide avec yolo_min_confidence=0.5 (pour 50%)

     

    [face]

    Dans cette section seront définit les paramètres de la détection de visage

    known_images_path=/var/lib/zmeventnotification/known_faces spécifie le chemin du répertoire dans lequel seront stockés les visages à reconnaitre. Pour cela il faut y placer (en SFTP par exemple en passant par votre /home car vous n’aurez pas les droits pour écrire dans ce répertoire directement) des photos des visages, idéalement en 400 par 400 pixels (on peut mettre plus grand mais la détection sera exponentiellement plus longue). Le nom du fichier sera affiché dans le cadre de détection correspondant.

    Donc si on veut que Kevin soit reconnu, il faudra (au moins) mettre models=face dans la partie globale du fichier ou dans la section spécifique à un moniteur, et il faudra qu’un fichier d’une photo du visage de Kevin en 400 par 400 pixels soit présente dans le répertoire spécifié dans la section de configuration [face] et ce fichier sera appelé Kevin.jpg

    face_num_jitters=1 : stipule combien de fois l’image sera déformée avant la reconnaissance

    face_model=hog : définit le modèle pour la détection de visage. Cela peut etre soit hog soit cnn. cnn est censé être plus précis

    face_upsample_times=1 : définit est le nombre de fois que vous souhaitez suréchantillonner les images d'entrée (pour les petits visages, par exemple)

    unknown_face_name=envahisseur : Si un visage est reconnu mais qu’il n’y a aucun fichier correspondant dans le répertoire spécifié, la valeur de unknown_face sera affiché à la place, on peut donc mettre ce que l’on souhaite

     

    [alpr]

    Cette section permet de paramétrer la reconnaissance de plaques d’immatriculation.

    Au préalable il faut se rendre sur le site de Plate Recognizer : platerecognizer.com (on peut également héberger leur sdk en local mais je n’ai pas testé) et se créer un compte afin de récupérer le jeton API qui vous sera délivré.

    alpr_use_after_detection_only=yes : si on utilise la detection de plaques d’immatriculation

    alpr_key= On saisit ici sa clé API platerecognizer.com

    alpr_pattern=.* : Meme logique que pour le detect_pattern mais appliqué au plaques ALPR

    platerec_stats=no : si oui, alors on enregistre les statistiques d'utilisation du service ALPR

    platerec_regions=['us','cn','fr'] : Spécifie le pays des plaques d’immatriculation qui doivent etre reconnues (voir http://docs.platerecognizer.com/#regions-supported )

    platerec_min_dscore=0.1 : Pourcentage de confiance minimale pour que la détection d’une plaque soit considéré valable

    platerec_min_score=0.2 : Pourcentage de confiance minimale pour que le texte d’une plaque reconnu soit considéré valable

    NB : Il est également possible d’utiliser le service de reconnaissance de plaque OpenALPR, mais n’ayant pas testé, ce point ne sera pas abordé. Cependant le principe est le même que pour ALPR

    Vous le savez déjà maintenant mais on n’oublie pas de sauver avec Ctrl+O et Entrée et on quitte nano avec Ctrl+X

     

    Pour tester manuellement utilisé la commande vue dans la partie précédente du tuto :

    sudo -u www-data /usr/bin/detect_wrapper.sh <eid> <mid>

     Si tout va bien, que tout est configuré votre zoneminder devrait être capable de vous afficher des images de ce type :

    Screenshot 8Screenshot 9

    C’est la fin de cette 4eme partie. Il ne vous reste plus qu’à jouer avec tous ses paramètres afin de paramètre au plus juste vos reconnaissances et d’en constater les effets dans zoneminder. Vous allez probablement etre amenés à faire pas mal d’aller-retour devant votre/vos caméras et peut etre meme avoir l’air un peu bizarre auprès de ceux qui ne comprendront pas votre manège !!!

    Dans la prochaine partie nous verrons comment utiliser cette reconnaissance avec Nextdom et votre broker mqtt.

     

    A bientôt

    This post was modified Il y a 2 années 8 times by vinceg77
    This post was modified Il y a 1 année by vinceg77
    RépondreQuote
    Topic starter Posté : 07/10/2019 3:22
    vinceg77
    (@vinceg77)
    Membre Moderator

    PARTIE 5 : INTEGRATION DE LA RECONNAISSANCE DANS NEXTDOM

     

    Nous voici enfin arrivés à l’étape ultime de notre exploration zoneminder, le graal, le but final : récupérer les informations de détection d’image dans notre outil de domotique préféré Nextdom ! Oui on n’a pas fait tout ca juste pour avoir des cadres colorés dans le flux de nos caméras !!!

     

    Pour cela on va utiliser mqtt. MQTT est un protocole de communication publish / subscribe. C’est-à-dire que des messages sont envoyés sur le réseau local et si un broker écoute et intercepte un message, il propose de « s‘abonner » afin de recevoir les messages suivants qui seront envoyés par notre émetteur zmeventnotification.

    Si vous ne l’avez pas déjà fait, va donc falloir installer un plugin mqtt sur Nextdom. Pour ma part j’utilise le plugin jMQTTet son serveur Mosquitto qui l’accompagne, et que l’on peut installer conjointement au plugin, sur la machine Nextdom ou sur une machine distante. Je n’entre pas ici dans les détails de cette installation, mais je vous invite à lire la documentation du plugin ici https://domotruc.github.io/jMQTT/fr_FR/

    Une fois le plugin installé on devrait obtenir quelque chose comme ça dans la page du plugin :

     jmqtt

    Dans la deuxième partie de ce tuto, lorsque nous avions installé et configuré zmeventnotification, vous vous souvenez peut être que nous avions déjà configuré le fichier zmeventnotification.ini , fichier dans lequel on renseigne l’adresse et les identifiants pour se connecter à notre broker mqtt. Si ce n’était pas fait, voici un petit rappel :

    sudo nano /etc/zm/zmeventnotification.ini

    On renseigne ici l’adresse et les identifiants de notre serveur mqtt (si vous en avez défini pour votre serveur mqtt).

    Cela doit ressembler à quelque chose comme ça, avec vos propres adresses et identifiants : 

    # Use MQTT for messaging (default: no)[mqtt]

    enable = yes

    # MQTT server (default: 127.0.0.1)

    server = 192.168.0.29

    # Authenticate to MQTT server as user

    username = votrelogin_mqtt

    password = votre_motdepasse_mqtt

     

    Une fois cette configuration sauvée (cette fois je ne vous dit plus comment, faut suivre !) lorsque une reconnaissance est effectuée par l’ES, un message mqtt est automatiquement envoyé sur le réseau. Voyons donc comment récupérer ce message dans Nextdom :

    jmqtt2

    Vous l’avez peut-être remarqué juste avant, il y a sur la page du plugin dans Nextdom un bouton « Mode inclusion » (1). Lorsque l’on presse ce bouton et que l’on entre en mode inclusion, le broker attend de recevoir un message mqtt pendant 2 à 3 minutes (2) et s’il en reçoit un va s’abonner à l’équipement qui diffuse ces messages.

    Vous l’avez probablement pressenti, il s’agit désormais d’être dans le bon timing ! Il va falloir se débrouiller pour que pendant ces 2 ou 3 minutes durant lesquelles le plugin est en mode inclusion, une reconnaissance soit effectuée par zmeventnotification, et que donc un message mqtt soit envoyé, puis reçu par le plugin ! Je vous laisse faire au mieux en fonction de la configuration que vous avez mise en place dans les chapitres précédents.

    Lorsque la reconnaissance a eu lieue et que le message est envoyé, Nextdom vous prévient qu’il vient de recevoir un message et crée automatiquement un nouvel équipement connecté à Nextdom. :

    jmqtt-fininclusion

    On clique sur ce nouvel équipement et on remplit les différents champs pour le configurer sous Nextdom :

    jmqtt-eqpt

    On sauvegarde et voilà à partir de là l’immense champs des possibilités qu’offre Nextdom s’offre à vous à partir d’une reconnaissance d’un objet, d’un visage ou d’une plaque d’immatriculation !

    Pour cela il suffit par exemple dans un scénario :

    scenario

    Dans mon scénario de test qui est a pour déclencheur (trigger) #[Jardin][zoneminder][3]# (c’est-à-dire toute reconnaissance provenant de mon vidéophone qui est la caméra n°3 et que j’ai configuré pour faire de la  reconnaissance faciale) s’il trouve le mot « Vincent » dans le message mqqt reçu (Vincent a été reconnu donc), il m’envoie un message d’accueil ouvre mon portail et déverrouille ma serrure d’entrée. Génial non ??

    La condition dans le bloc si est :

                    str_replace('"','',#[Jardin][zoneminder][3]#) matches "/detected:VotrePrenom/"

     

    !!! ATTENTION !!!!

    Si j’ai pris cet exemple c’est pour montrer ce qui est possible, mais aussi et surtout pour vous montrer ce qu’il ne faut SURTOUT PAS faire, en tous cas pas de cette manière.

    Comme nous l’avons vu dans les étapes précédentes, la reconnaissance fonctionne aussi sur la simple reconnaissance faciale à partir d’une photo. Donc si vous appliquez mon exemple, un individu qui aurait compris votre technologie pourrait facilement prendre discrètement une photo de vous, l’imprimer, la montrer à la caméra qui logiquement lui ouvrirait toutes les portes ! Vous ne seriez meme pas couvert par votre assurance puisqu’il n’y aurait pas eu d’effraction !

    Donc il faut être très prudent, et dans le cas du contrôle d’accès il faut coupler cette reconnaissance avec au moins deux autres conditions (votre portable connecté en wifi au réseau par exemple et l’appui sur un dash bouton caché quelque part, ou toute autre idée que vous pourriez avoir) !

    Ne soyez pas non plus trop confiant vis-à-vis de la technologie en basant des fonctions sensibles uniquement sur la reconnaissance faciale ou d'objets. Dans certaines conditions dégradées (manque de lumière par exemple, ou serveur qui plante, ou flux de la caméra en défaut), voire normales, il se peut que la reconnaissance ne fonctionne pas ! Vous êtes prévenus, et je décline toute responsabilité sur l'usage que vous ferez de cette technologie.

     

     

    CONCLUSION

    J’espère que ce (long) tutoriel vous aura servi et que vous aurez réussi à mettre en place un cctv avec détection relativement efficace. Couplé à Nextdom les possibilités qu’offre cette technologie sont multiples : vous pouvez…

    • Compter les passants ou les voitures qui passent devant chez vous
    • Vérifier que le train est bien à l’heure (enfin si vous habitez devant une voie de chemin de fer !) et envoyer un mail automatique à la SNCF lorsque ce n’est pas le cas.
    • Flasher une voiture qui passe au feu rouge (enfin si vous habitez devant un feu de circulation !)
    • Compter les oiseaux dans votre jardin
    • Surveiller les allées et venues de votre femme et vous assurer qu’elle est bien seule quand elle rentre à la maison (c’est une (encore) une blague 😊 je précise)

    Plus utiles encore :

    • Renforcer votre contrôle d’accès en fabriquant un équivalent au Netatmo Welcome ( https://www.netatmo.com/fr-fr/security/cam-indoor )
    • Fabriquer un effaroucheur domotique pour les oiseaux qui viennent se servir dans votre arbre fruitier
    • Surveiller la présence de votre voiture dans l’allée ou enregistrer vos heures de départ et de retour du travail
    • et beaucoup d’autres choses super cool !!!

     

    Malheureusement je ne pourrais pas assurer un véritable support sur ce sujet faute de temps, mais aussi de véritables connaissances profondes de cet outil. Je n’hésiterai pas cependant à intervenir si j’identifie rapidement le problème de 1er niveau que vous pourriez rencontrer. Il y a pas mal de ressources (déjà citées dans ce tuto), meme si c’est en anglais. PliablePixels peut aussi vous aider (en anglais) ici, mais il a clairement stipulé qu’il ne le faisait que pour les vrais problèmes de gens qui ont la connaissance technique nécessaire pour mettre en place son outil (pas la peine de lui dire que nano n’est pas installé sur votre distrib et que vous ne savez pas comment l’installer  !) et surtout qui ont effectué quelques recherches par eux-mêmes avant de le contacter. A bon entendeur …

    N’hésitez pas à me faire un retour dans ce forum et surtout à partager l’utilisation que vous en avez trouvé. Si vous avez des remarques, corrections, améliorations, questions, ou autre encore, c’est sur ce forum que nous pouvons en débattre. J’intégrerai au tuto les ajouts pertinents que vous pourriez me remonter.

     

    Pour finir un grand merci à PliablePixels pour ce super addon à zoneminder, merci aussi à toute la team Nextdom pour cette géniale solution domotique pour laquelle ils passent beaucoup de temps et mettent toutes leurs compétences et merci aussi à tous les copains autour de la team pour tous leurs messages sympas sur le chat et pour tout ce qu'ils apportent sur ce sujet passionnant de la domotique. Merci particulièrement @Slobberbone pour m’avoir aidé -rien qu’en 3 mots et en me confiant quelques droits- à la mise en ligne de ce tutoriel !

     

    Et enfin, venez partager avec nous sur la domotique et nous aider à l’avancement de Nextdom (en développant, en testant ou en proposant) sur le discord du projet si vous n’y êtes pas déjà !

     Bye !

    vinceg77

    This post was modified Il y a 2 années 5 times by vinceg77
    RépondreQuote
    Topic starter Posté : 07/10/2019 3:23
    vinceg77
    (@vinceg77)
    Membre Moderator

    PARTIE 6 : BONUS DIVERS

     Quelques liens :

    Read the Docs ZoneMinder

    Read the Docs Event Notification Server

    Github PliablePixels

    zmNinja

    oZoneDev

    Chat Zoneminder

     

    Précisions sur les zones dans zoneminder :

    Regarder cette caméra placée au-dessus de la porte d’un garage.

    garage

    Imaginez que vous souhaitiez faire de la reconnaissance sur la plaque d’immatriculation de la voiture qui entrerait/sortirait du garage à faible allure.

     Comme nous l’avons vu en partie 3 du tuto, vous pourriez utiliser frame_id=bestmatch : La première image en alarme est analysée. Si aucun detect_pattern n’est trouvé l’analyse se porte sur l’image qui a le score d’alarme le plus élevé. Cela fonctionnerait probablement pas trop mal. Mais ici, on pourrait encore maximiser le niveau de reconnaissance en définissant une zone preclusive (abordé en partie 2 du tuto) de la manière suivante :

    zones-garage

    Une zone preclusive est une zone qui ne déclenche pas d’alarme directement mais qui fait que la zone active ne déclenchera pas (même s’il y a du mouvement dedans) TANT qu’il y a encore un mouvement dans la zone preclusive. (pas facile à expliquer !). Cela peut etre très utile pour configurer au mieux les déclenchements et réduire les faux positifs.

    Dans cet exemple

    • pour les voitures qui sortent du garage tant que la voiture fait partie de la zone preclusive, la zone active ne déclenche pas. Une fois qu'une voiture est sortie de la zone preclusive et qu’elle est à l'intérieur de la zone active, l'alarme se déclenche. Cela signifie ici que l'avant de la voiture qui recule pour sortir est visible, et que donc la plaque d'immatriculation va etre détectée au meilleur moment.
    • Pour les voitures qui entrent depuis l’allée vers le garage (en marche avant), la zone active va déclencher l’alarme dès qu’elle détectera du mouvement puisque la zone preclusive n’aura elle pas de mouvement.

    … à relire plusieurs fois pour bien comprendre !!!

      

    Quelques commandes utiles :

    Démarrer/redemarre/arreter/obtenir l’état de zoneminder : 

    systemctl start/restart/stop/status zoneminder

     

    Editer le fichier de config de la reconnaissance :

    nano /etc/zm/objectconfig.ini

     

    Test manuel de reconnaissance (on remplace ici eid par le n° de l’événement et mid par le n° de la caméra :

    sudo -u www-data /usr/bin/detect_wrapper.sh eid mid

     

    Console temps réel de l’Event Server :

    sudo -u www-data /usr/bin/zmeventnotification.pl  --config /etc/zm/zmeventnotification.ini

     

    Log temps réel de la partie Event Server dans le syslog zoneminder :

    tail -f /var/log/syslog | grep zmeventnotification

     

    Démarrer l’Event Server :

    sudo zmdc.pl start zmeventnotification.pl

     

    Arrêter l’Event Server :

    sudo zmdc.pl stop zmeventnotification.pl

     

     

    Mise à jour d’Event Server :

    ETAPE 1 : obtenir la dernière version et se rendre dans son répertoire :

    git clone  https://github.com/pliablepixels/zmeventnotification.git 
    cd zmeventnotification/

     

    ETAPE 2 : Arreter l’ES en cours :

    sudo zmdc.pl stop zmeventnotification.pl

     

    ETAPE 3 : Faire des sauvegardes des fichiers de config

    Pensez a bien sauvegarder les fichiers zmeventnotification.ini et objectconfig.ini qui vont être écrasés pendant la mise à jour

    ETAPE 4 : Executer le script d’install

    sudo ./install.sh

     

    ETAPE 5 : redémarrer le serveur mis à jour :

    sudo zmdc.pl start zmeventnotification.pl

    Dernière information : Vous trouverez des fichiers d'aide intéressants fourni par le développeur (en anglais) dans le répertoire de téléchargement du fichier GIT puis dans /zoneminder/zmeventnotification/docs/guides.
    Le fichier breaking.rst indique notamment toutes les modifications de fonctionnement apportées ou imposées par la mise à jour. A consulter à chaque mise à jour donc !

     

    VOILOU C'est fini

    This post was modified Il y a 2 années 21 times by vinceg77
    This post was modified Il y a 1 année by vinceg77
    RépondreQuote
    Topic starter Posté : 09/10/2019 8:27
    dcjona
    (@dcjona)
    Membre Admin

    Hello,

    Je viens enfin d'arriver au bout (pas sans peine) je tenais a te remercier pour le tuto il est super détaillé et le temps de montre que tu as du prendre pour la rédaction !

    Super intéressant et merci pour l'aide en pv sur discord 🙂

    RépondreQuote
    Posté : 17/10/2019 4:56
    vinceg77
    (@vinceg77)
    Membre Moderator

    @dcjona

    Merci à toi @dcjona pour ce message sympa et pour tes retours d'utilisation, on progresse toujours en aidant les autres ! En plus on s'est bien marré en PV avec ton hibou, ton déhanché, et l'analyse des flux de ma caméra (entre autre) !!!

    This post was modified Il y a 2 années 2 times by vinceg77
    RépondreQuote
    Topic starter Posté : 17/10/2019 6:30
    dcjona
    (@dcjona)
    Membre Admin

    up

    This post was modified Il y a 1 année by dcjona
    RépondreQuote
    Posté : 12/11/2019 7:12
    dcjona
    (@dcjona)
    Membre Admin

    edit

    This post was modified Il y a 1 année by dcjona
    RépondreQuote
    Posté : 12/11/2019 7:34
    dcjona
    (@dcjona)
    Membre Admin

    edit

    This post was modified Il y a 1 année by dcjona
    RépondreQuote
    Posté : 12/11/2019 7:37
    dcjona
    (@dcjona)
    Membre Admin

    up

    This post was modified Il y a 1 année by dcjona
    RépondreQuote
    Posté : 12/11/2019 7:37
    dcjona
    (@dcjona)
    Membre Admin

    UP

    This post was modified Il y a 1 année 2 times by dcjona
    RépondreQuote
    Posté : 12/11/2019 7:39
    Page 1 / 2
    Share:
    fr_FRFrançais
    fr_FRFrançais