Vision temps réel en périphérie
un pipeline DeepStream qui floute les visages et compte les personnes, conçu pour tourner sur un Jetson
Deux détecteurs TensorRT en série, un tracker qui garde le flou stable, comptage par zone et heatmap, le tout dans un seul pipeline GPU avec une vue web en direct, développé sur un GPU de bureau, écrit pour être porté sur un Jetson Orin Nano.
- Pipeline, conversion de modèles, sondes Python, outillage
- DeepStream 7.1 · TensorRT · GStreamer · Python · ONNX
- Fonctionnel sur la machine de dev ; portage Jetson préparé, pas encore exécuté sur la carte
Le problème
Des caméras dans un lieu posent toujours les deux mêmes questions : peut-on compter les personnes sans les reconnaître, et peut-on le faire sur une petite boîte à côté de la caméra plutôt que sur un serveur ? Je voulais un pipeline qui réponde aux deux : visages rendus illisibles avant qu'une image ne quitte l'appareil, personnes et sacs comptés par zone, et qui tourne à la cadence vidéo sur une carte de la classe Jetson.
Ce que j'ai construit
Un seul pipeline DeepStream 7.1 : caméra USB, décodage matériel en mémoire NVMM, un détecteur YOLO pour les personnes et les sacs, puis un détecteur de visages SCRFD, tous deux en moteurs TensorRT FP16, puis un tracker NvSORT pour qu'un visage garde son identifiant d'une image à l'autre et que le flou ne clignote pas. Une sonde Python sur les images fait le reste : pixelisation des visages sur place, comptages instantané et cumulé, zone polygonale avec entrées et sorties, heatmap, et une première machine à états « bagage abandonné », avant l'encodage MJPEG servi par un petit serveur web en bibliothèque standard, réglages à chaud, export CSV et JSON.
Faire entrer le modèle de visages a demandé de la chirurgie ONNX (une dimension de batch ajoutée sur neuf sorties, une entrée figée) et un parseur C++ maison ; amener les images jusqu'à Python a demandé d'apprendre quels types de mémoire le CPU voit sous WSL et sur un Jetson, et de basculer à l'exécution. Tout est organisé par fonctionnalité, chacune ouverte par un spike bloquant avec un repli, la logique métier (zones, heatmap, bagages, classes) en modules purs testés sans GStreamer.
Ce que j'ai appris
Que la boucle de dev (Windows, WSL2, une caméra USB relayée par usbip, un GPU de bureau) est un projet en soi : usbip sature en 720p et ne transporte pas le YUYV brut, donc le chiffre honnête est 24,8 images/s en 1024×768 sur le bureau, et les chiffres Jetson restent un objectif tant que la carte n'est pas sur la table. Que deux détecteurs primaires en série battent un détecteur-plus-cascade pour ce travail. Et que le choix le moins spectaculaire, une sonde Python plutôt qu'un plugin C++, est ce qui a rendu chaque fonctionnalité itérable.
“Flouter d'abord, compter ensuite, et laisser le tracker décider qu'un visage est toujours le même visage.”Chat RAG multi-cloud