Viseron : une vidéosurveillance intelligente sans envoyer une image dans le cloud
Détection de personnes, reconnaissance faciale et lecture de plaques sur vos propres caméras, en local : installer Viseron avec Docker, le configurer et l'intégrer à Home Assistant, sans oublier ce que la loi autorise à filmer.
Une caméra Wi-Fi grand public coûte quarante euros. L'abonnement cloud qui va avec pour garder plus de vingt-quatre heures d'historique en coûte cinq par mois. Et chaque image de votre jardin, de votre salon ou de votre entrée part sur les serveurs du fabricant, où un employé, un partenaire ou un pirate pourra un jour la regarder.
Viseron prend le problème à l'envers. C'est un enregistreur vidéo réseau (un NVR) open source sous licence MIT, qui tourne sur votre propre machine. Il récupère le flux de vos caméras IP, l'enregistre, et y applique de la vision par ordinateur : détection de mouvement, détection d'objets, reconnaissance faciale, lecture de plaques d'immatriculation. Tout se passe en local. Aucune image ne quitte le réseau.
Comment Viseron traite une image
Analyser chaque image de chaque caméra avec un réseau de neurones consommerait une machine entière. Viseron fonctionne donc en cascade, du moins coûteux au plus coûteux :
Flux RTSP de la caméra (ffmpeg)
│
▼
Détection de mouvement (mog2, background_subtractor) ← très léger, 1 image/s
│ quelque chose bouge
▼
Détection d'objets (darknet, yolo, edgetpu, hailo…) ← réseau de neurones
│ une personne avec 80 % de confiance
▼
Post-traitement : visage (dlib, compreface), plaque (fastalpr, codeprojectai)
│
▼
Enregistrement de l'événement + MQTT, webhook, Telegram…Chaque étape est un composant qu'on active dans un fichier YAML. Le détecteur de mouvement élimine l'essentiel du travail : quand rien ne bouge, le détecteur d'objets ne tourne pas. C'est ce qui permet de faire tourner plusieurs caméras sur un mini-PC.
Si le fonctionnement d'un détecteur d'objets comme YOLO reste flou, la reconnaissance d'images par deep learning explique ce qui se passe dans ces modèles, des convolutions jusqu'aux boîtes de détection.
Le matériel
Viseron tourne sur CPU, mais la détection d'objets profite énormément d'un accélérateur. Plusieurs images Docker existent selon le matériel :
| Matériel | Image Docker | Composant de détection |
|---|---|---|
| PC x86 générique | roflcoopter/viseron | darknet, yolo sur CPU |
| Intel avec iGPU (NUC, mini-PC N100) | roflcoopter/viseron + /dev/dri | décodage vidéo VAAPI, darknet ou yolo |
| Google Coral (USB ou PCIe) | roflcoopter/viseron | edgetpu |
| GPU NVIDIA | roflcoopter/amd64-cuda-viseron | darknet, yolo sur CUDA |
| Jetson Nano | roflcoopter/jetson-nano-viseron | darknet sur CUDA |
| Raspberry Pi 4 | roflcoopter/viseron (multi-arch) | edgetpu recommandé |
Pour un usage domestique avec deux à quatre caméras, mon conseil est simple : un mini-PC Intel récent et une clé Coral USB. Le Coral fait tourner un modèle de détection en quelques millisecondes pour quelques watts, et le CPU reste libre pour décoder la vidéo.
Faire tourner l'inférence au plus près de la source, plutôt que dans un datacenter, c'est exactement le principe de l'edge computing appliqué à la maison.
Installation avec Docker Compose
services:
viseron:
image: roflcoopter/viseron:latest
container_name: viseron
restart: unless-stopped
shm_size: "1024mb"
environment:
- PUID=1000
- PGID=1000
volumes:
- ./config:/config
- /mnt/nvr/segments:/segments
- /mnt/nvr/snapshots:/snapshots
- /mnt/nvr/thumbnails:/thumbnails
- /mnt/nvr/event_clips:/event_clips
- /mnt/nvr/timelapse:/timelapse
- /etc/localtime:/etc/localtime:ro
devices:
- /dev/dri # décodage matériel Intel
- /dev/bus/usb # clé Google Coral USB
ports:
- "8888:8888"docker compose up -d
docker compose logs -f viseronQuelques points qui comptent :
shm_size: Viseron fait passer les images entre ses processus par la mémoire partagée. La valeur par défaut de Docker (64 Mo) est bien trop faible et provoque des plantages obscurs.- Les volumes vidéo : mettez
/segmentssur un disque dédié, de préférence un disque dur prévu pour la surveillance. Une caméra en enregistrement continu écrit sans arrêt, ce qui use vite un SSD grand public. /configcontient la configuration et la base de données interne. C'est le dossier à sauvegarder.
L'interface répond sur http://ip-du-serveur:8888. Au premier démarrage, Viseron génère un config.yaml par défaut, commenté, qu'on peut modifier directement depuis l'éditeur intégré dans l'interface web.
Configurer une première caméra
On commence par sortir les identifiants des caméras du fichier principal. Viseron lit un fichier secrets.yaml dans le même dossier :
entree_host: 192.168.1.20
entree_user: viseron
entree_password: un-mot-de-passe-dediePuis la configuration, composant par composant :
ffmpeg:
camera:
entree:
name: Entrée
host: !secret entree_host
path: /Streaming/Channels/101/
username: !secret entree_user
password: !secret entree_password
recorder:
idle_timeout: 5
mog2:
motion_detector:
cameras:
entree:
fps: 1
edgetpu:
object_detector:
cameras:
entree:
fps: 1
scan_on_motion_only: true
labels:
- label: person
confidence: 0.75
trigger_event_recording: true
- label: car
confidence: 0.8
nvr:
entree:
webserver:
auth:Ce que fait cette configuration :
ffmpeglit le flux RTSP. Le chemin/Streaming/Channels/101/est celui des caméras Hikvision : il dépend de la marque, la documentation de votre caméra ou la base de données d'iSpy vous donnera le bon.mog2analyse une image par seconde pour détecter le mouvement.edgetpucherche des personnes et des voitures, uniquement quand quelque chose bouge (scan_on_motion_only).trigger_event_recordingdéclenche l'enregistrement d'un événement quand une personne est détectée. Une voiture est détectée et signalée, mais pas enregistrée.nvrrelie la caméra au pipeline d'enregistrement.webserver.authactive l'authentification. Elle est désactivée par défaut. Au premier accès, Viseron demande de créer un compte administrateur.
Sans Coral, remplacez edgetpu par darknet : la syntaxe est identique.
Créez un compte dédié sur la caméra pour Viseron, avec des droits de lecture seule. Le compte administrateur de la caméra n'a rien à faire dans un fichier de configuration.
Enregistrements et rétention
Viseron distingue trois types d'enregistrements :
| Type | Déclenchement | Où le voir |
|---|---|---|
| Événement | Mouvement ou objet détecté | Onglet Events |
| Continu | Toujours actif, si une rétention est définie | Onglet Timeline |
| Manuel | Bouton de l'interface, API REST, MQTT ou Telegram | Onglet Events |
Par défaut, les événements sont gardés sept jours. La rétention se règle globalement avec le composant storage :
storage:
recorder:
tiers:
- path: /
events:
max_age:
days: 14
continuous:
max_size:
gb: 50Attention : la limite max_size s'applique par caméra. Quatre caméras à 50 Go, ce sont 200 Go sur le disque.
Les tiers permettent aussi de déplacer les vieux enregistrements vers un autre disque, par exemple garder trois jours sur SSD puis basculer sur un disque dur ou un NAS. On peut également restreindre les enregistrements à certains horaires avec une expression cron : détection uniquement en semaine pendant les heures de bureau, par exemple.
Les vidéos sont stockées en petits segments .m4s lus en HLS dans le navigateur. Ils ne se lisent pas directement dans VLC : pour récupérer un extrait, on utilise le bouton Download, qui produit un fichier .mp4.
Reconnaissance faciale
Le composant dlib reconnaît des visages connus parmi les personnes détectées. On lui fournit des photos rangées par personne :
config/face_recognition/
└── faces/
├── lea/
│ ├── lea_1.jpg
│ ├── lea_2.jpg
│ └── lea_3.jpg
└── karim/
├── karim_1.jpg
└── karim_2.jpgdlib:
face_recognition:
model: hog
cameras:
entree:
labels:
- personLe modèle hog tourne correctement sur CPU. Le modèle cnn est plus précis mais demande un GPU. Comptez cinq à dix photos par personne, prises sous différents angles et éclairages, idéalement avec la même caméra.
La reconnaissance de plaques d'immatriculation fonctionne sur le même principe, avec le composant fastalpr ou un serveur CodeProject.AI.
Une précaution avant d'activer ces fonctions : un visage et une plaque sont des données personnelles, et la reconnaissance faciale traite des données biométriques. On y revient plus bas.
Intégration avec Home Assistant et alertes
Viseron publie ses états sur MQTT et annonce automatiquement ses entités à Home Assistant :
mqtt:
broker: 192.168.1.10
port: 1883
username: !secret mqtt_user
password: !secret mqtt_password
home_assistant:
discovery_prefix: homeassistantDans Home Assistant, chaque caméra apparaît avec une image de la dernière détection, des capteurs binaires par type d'objet (personne détectée oui ou non), un capteur de mouvement, l'état de la connexion à la caméra, et un interrupteur pour armer ou désarmer la caméra. On peut alors écrire des automatisations utiles : désarmer les caméras intérieures quand un téléphone de la famille est à la maison, allumer l'éclairage extérieur quand une personne est détectée la nuit. Si vous n'avez pas encore de hub domotique, Home Assistant, la domotique open source est le complément naturel de Viseron.
Pour une simple alerte sur le téléphone, le composant webhook envoie une requête HTTP à chaque événement. Avec ntfy ou Gotify :
webhook:
alerte_entree:
trigger:
event: entree/motion_detected
condition: "{{ event.motion_detected }}"
url: https://ntfy.mondomaine.fr/cameras
method: post
payload: "Mouvement détecté sur {{ event.camera_identifier }}"Viseron a aussi des composants natifs pour Telegram, Discord et Gotify. Le bot Telegram permet même de lancer et d'arrêter un enregistrement depuis le téléphone.
Accès depuis l'extérieur
La documentation de Viseron le dit clairement : son système d'authentification n'a pas été audité par des experts en sécurité. Exposer le port 8888 sur Internet, même derrière un reverse proxy, est une mauvaise idée pour un logiciel qui donne accès aux caméras de votre maison.
Passez par un VPN (WireGuard, Tailscale) ou par une couche d'authentification en amont, comme Cloudflare Access. Le téléphone se connecte au réseau domestique, puis à Viseron, comme s'il était dans le salon.
Côté réseau, une bonne pratique : placer les caméras sur un VLAN isolé sans accès à Internet. Beaucoup de caméras bon marché essaient de joindre les serveurs de leur fabricant. Coupées d'Internet, elles ne peuvent plus le faire, et Viseron continue de lire leur flux RTSP en local.
Ce que la loi permet de filmer
Viseron vous donne des outils puissants. La loi encadre leur usage, même chez vous. En France, les principes rappelés par la CNIL pour un particulier sont les suivants :
- Votre propriété, oui. Filmer l'intérieur de son logement, son jardin ou son allée est autorisé.
- La voie publique et les voisins, non. Une caméra ne doit pas filmer la rue, le trottoir, ni la propriété ou les fenêtres d'un voisin. Si le champ de vision déborde, il faut l'orienter autrement ou masquer la zone. Viseron gère les masques dans la configuration de chaque détecteur, mais un masque de détection n'empêche pas l'enregistrement de l'image : mieux vaut réorienter la caméra.
- Les personnes qui travaillent chez vous (assistante maternelle, aide à domicile, femme de ménage) doivent être informées de la présence des caméras, et ne doivent pas être filmées en permanence sur leur lieu de travail.
- La reconnaissance faciale de tiers est un traitement de données biométriques. Pour reconnaître les membres de son foyer qui y consentent, l'usage reste dans la sphère privée. Ficher les visages des passants ou des visiteurs sort de ce cadre.
Le fait que tout reste en local règle la question du transfert de données vers un tiers. Mais il ne règle pas celle de ce que vous filmez. Le RGPD face à l'intelligence artificielle détaille ce qui fait d'un traitement comme la reconnaissance faciale un cas sensible. Cette section est un résumé, pas un avis juridique : en cas de doute, la fiche de la CNIL sur la vidéosurveillance chez soi fait référence.
Viseron ou Frigate
Frigate est l'autre grand NVR open source avec détection d'objets, et le plus connu des deux.
| Viseron | Frigate | |
|---|---|---|
| Licence | MIT | MIT |
| Détection d'objets | Darknet, YOLO, Coral, Hailo, CodeProject.AI… | Coral, OpenVINO, TensorRT, Hailo… |
| Reconnaissance faciale | Intégrée (dlib, CompreFace) | Ajoutée récemment |
| Plaques d'immatriculation | Intégrée | Ajoutée récemment |
| Intégration Home Assistant | MQTT avec découverte automatique | Intégration officielle très poussée |
| Communauté | Plus petite | Beaucoup plus large |
| Configuration | YAML, éditeur dans l'interface | YAML et interface |
Frigate a l'avantage de la communauté et d'une intégration Home Assistant très aboutie. Viseron se démarque par son architecture en composants, plus facile à étendre, et une vision par ordinateur qui va plus loin depuis plus longtemps. Si votre installation tourne autour de Home Assistant et que vous voulez surtout détecter des personnes, Frigate est le choix le plus sûr. Si la reconnaissance faciale, les plaques ou le choix fin du détecteur comptent, Viseron mérite l'essai.
Une caméra de surveillance n'a pas besoin d'un abonnement ni d'un serveur à l'autre bout du monde pour reconnaître une personne dans une image. Un mini-PC, une clé Coral et Viseron font le même travail, souvent mieux, et la vidéo de votre maison reste chez vous. Il faut seulement accepter la contrepartie du self-hosted : c'est à vous de sécuriser l'accès, de surveiller l'espace disque et de vérifier que vous ne filmez que ce que vous avez le droit de filmer.