Annexe : AI NVR sur reComputer

Pourquoi cette annexe existe

Le cours principal en 10 sections suit une colonne d'apprentissage : fondations, méthodes, tâches, entraînement, déploiement, concepts système Jetson et perspectives sur les technologies de pointe. Cette annexe est le projet de synthèse qui vient après tout cela : une application complète de vision en edge que vous pouvez construire de bout en bout.

Le projet est un AI NVR (AI Network Video Recorder). Un NVR classique se contente d'enregistrer la vidéo. Un AI NVR y ajoute une analyse en temps réel : il détecte et suit des objets dans les flux en direct, déclenche des événements et conserve des enregistrements que les opérateurs peuvent rechercher et consulter.

Vue d'ensemble de l'AI NVR

Ce guide pas à pas s'appuie sur le tutoriel du wiki de Seeed AI NVR with reServer Jetson. Le wiki a été rédigé et vérifié sous JetPack 6.0 avec un reServer Industrial J4012. Si vous utilisez la base plus récente JetPack 6.2.x de ce cours, le déroulement est identique, même si les versions des services et des images de conteneurs peuvent différer.

Ce que vous allez construire

À la fin de cette annexe, vous disposerez d'un AI NVR local fonctionnel qui :

  • intègre une ou plusieurs caméras IP via une interface web
  • exécute la détection et le suivi DeepStream sur chaque flux
  • superpose les résultats de détection sur la vidéo en direct
  • enregistre les séquences avec un stockage configurable
  • affiche le tout sur un mur vidéo dans le navigateur

Mur vidéo avec résultats de détection

Prérequis

Flash de JetPack sur le reServer

  • Au moins une caméra IP sur le même réseau (accessible en RTSP). Si vous n'avez pas encore de caméra, vous pouvez d'abord simuler des flux avec sim_rtsp_stream.py de la section 4.9.
  • Un accès réseau depuis votre PC vers l'appareil Jetson, ainsi qu'un navigateur.

Vue d'ensemble de l'architecture

Le projet est assemblé à partir des microservices de Jetson Platform Services (JPS) plutôt qu'écrit de zéro :

  • VST (Video Storage Toolkit) — intégration des caméras, enregistrement, gestion du stockage et interface web
  • DeepStream perception — détection d'objets (PeopleNet) et suivi multi-objets
  • Redis — stockage des métadonnées des événements
  • Ingress (nginx) — route le trafic du navigateur vers le bon service

Chaque élément renvoie à une section antérieure de ce cours :

ComposantSection du cours associée
Flux des caméras comme entrée vidéo4.2 Comment les Ordinateurs Représentent les Images
Détection et suivi comme tâches de vision4.5 Tâches de Vision par Ordinateur en Deep Learning
Modèle de détection pré-entraîné4.6 Entraîner et déployer votre propre modèle de vision
Moteur TensorRT pour le module cible4.7 Exportation de modèles et déploiement sur l'edge
Graphe de pipeline GStreamer/DeepStream4.8 Frameworks de pipeline de vision en temps réel
DeepStream et services Jetson4.9 DeepStream et Jetson

Étape 1. Installer Jetson Platform Services

Connectez l'appareil Jetson au réseau, à une souris, un clavier et un moniteur (ou accédez-y en SSH), puis installez le paquet JPS :

bash
sudo apt update
sudo apt install nvidia-jetson-services

Après l'installation, les microservices se trouvent sous /opt/nvidia/jetson/services/ :

Répertoire des services JPS

Étape 2. Ajouter le routage Ingress pour l'interface de l'AI NVR

Créez le fichier /opt/nvidia/jetson/services/ingress/config/ai-nvr-nginx.conf avec le contenu suivant, afin que l'ingress route le frontend web de l'AI NVR :

nginx
location /emdx/ {
  rewrite ^/emdx/?(.*)$ /$1 break;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  access_log /var/log/nginx/access.log timed_combined;
  proxy_pass http://emdx_api;
}

location /ws-emdx/ {
  rewrite ^/ws-emdx/?(.*)$ /$1 break;
  proxy_set_header Host $host;
  proxy_pass http://emdx_websocket;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}

Étape 3. Choisir l'emplacement de stockage des enregistrements (facultatif)

Par défaut, VST stocke les enregistrements dans son propre répertoire. Pour les stocker ailleurs, modifiez /opt/nvidia/jetson/services/vst/config/vst_storage.json :

json
{
    "data_path": "/home/seeed/VST/storage/data/",
    "video_path": "/home/seeed/VST/storage/video/",
    "total_video_storage_size_MB": 10000
}

Adaptez les chemins et le quota de stockage à l'organisation de votre disque.

Étape 4. Démarrer les services principaux

VST dépend des autres services, il faut donc les démarrer ensemble :

bash
sudo systemctl start jetson-redis
sudo systemctl start jetson-ingress
sudo systemctl start jetson-vst

Le démarrage de ces unités lance les conteneurs Docker correspondants :

Conteneurs JPS en cours d'exécution

Ouvrez http://<ip-of-jetson>:81/ dans un navigateur du réseau local pour vérifier que l'interface web de VST est en ligne :

Interface web de VST

Étape 5. Récupérer le workflow de référence de l'AI NVR

NVIDIA publie le workflow de référence de l'AI NVR sur NGC. Ouvrez la page de téléchargement du workflow de référence JPS, choisissez Download puis le téléchargement direct depuis le navigateur :

Page de téléchargement NGC

Décompressez-le ensuite sur l'appareil Jetson :

bash
cd <path-of-download>
unzip files.zip
cd files
tar -xvf ai_nvr-1.1.0.tar.gz
cd ai_nvr

Étape 6. Configurer la sortie de DeepStream

Pour voir les résultats d'inférence en temps réel, le pipeline DeepStream doit émettre un flux RTSP. Dans <path-of-ai_nvr>/config/deepstream/pn26/service-maker/, modifiez le fichier de configuration correspondant à votre module — pour un Orin NX 16GB, il s'agit de ds-config-0_nx16.yaml — et vérifiez que le pipeline se termine par un sink RTSP sur le port 8555. La configuration complète figure dans le tutoriel du wiki.

Modifiez également le fichier compose correspondant à votre module (pour l'Orin NX 16GB : compose_nx16.yaml) et ajoutez la ligne suivante sous le service SDR, afin que les conteneurs DeepStream ne soient pas pris pour des caméras :

yaml
WDM_WL_NAME_IGNORE_REGEX: ".*deepstream.*"

Étape 7. Lancer l'application AI NVR

Choisissez le fichier compose correspondant à votre module et démarrez la pile :

bash
cd <path-of-download>/files/ai_nvr

# Orin AGX:
# sudo docker compose -f compose_agx.yaml up -d --force-recreate

# Orin NX 16GB:
sudo docker compose -f compose_nx16.yaml up -d --force-recreate

# Orin NX 8GB:
# sudo docker compose -f compose_nx8.yaml up -d --force-recreate

# Orin Nano:
# sudo docker compose -f compose_nano.yaml up -d --force-recreate

L'application crée les conteneurs restants, y compris DeepStream :

Conteneurs de l'AI NVR

Étape 8. Ajouter les caméras et ouvrir le mur vidéo

Ouvrez http://<ip-of-jetson>:30080/vst/ dans votre navigateur et ajoutez votre caméra IP : Sensor ManagementAdd device manuallySubmit, en utilisant l'adresse RTSP de la caméra.

Gestion des capteurs

Ajoutez le flux de sortie de DeepStream comme seconde source, par exemple rtsp://<ip-of-jetson>:8555/ds-test. Deux précisions du wiki comptent ici :

  • L'adresse du flux dépend de votre configuration DeepStream.
  • Le nom de caméra de la source DeepStream doit contenir le mot deepstream, sinon la superposition ne sera pas appliquée.

Enfin, allez sur Video Wall, sélectionnez toutes les sources et appuyez sur Start. Vous devriez voir le flux original de la caméra à côté du flux analysé avec les superpositions de détection.

Arrêter le projet

Arrêtez d'abord l'application AI NVR, puis les services de la plateforme :

bash
cd <path-of-download>/files/ai_nvr
sudo docker compose -f compose_nx16.yaml down --remove-orphans

sudo systemctl stop jetson-redis
sudo systemctl stop jetson-ingress
sudo systemctl stop jetson-vst

Une alternative plus légère : construire le pipeline soi-même

Si vous préférez comprendre chaque composant plutôt qu'assembler des services prêts à l'emploi, la section 4.9 propose une version DIY plus modeste de la même idée : un pipeline DeepStream piloté par deepstream-app, alimenté par des flux RTSP simulés (sim_rtsp_stream.py), avec un chemin de métadonnées d'événements passant par un broker de messages. Les scripts se trouvent dans le dépôt du cours sous 4-Computer-Vision/4.9-DeepStream-and-Jetson/code/ai-nvr. C'est une bonne étape intermédiaire si le workflow de référence complet semble trop volumineux d'un coup.

Pour aller plus loin

  • Remplacez ou réentraînez le modèle de détection avec vos propres classes, puis comparez la précision et le débit avec le modèle PeopleNet d'origine.
  • Ajoutez une logique d'événements au-dessus des métadonnées : franchissement de ligne, intrusion de zone ou alertes de temps de présence.
  • Combinez le pipeline avec un VLM pour des alertes au niveau de la scène, comme dans la démo Industrial Vision Monitoring de Seeed.
  • Essayez une alternative open source telle que Frigate sur Jetson et comparez son architecture avec celle basée sur JPS.

Questions de réflexion

  1. Quelles parties de ce projet dépendent de la qualité du modèle, et lesquelles dépendent de la conception du système ?
  2. Dans un déploiement réel, qu'est-ce qui échouerait en premier : le modèle, le flux, le stockage ou le flux de travail de l'opérateur ?
  3. Que vous apporte l'architecture en microservices ici, et que vous coûte-t-elle ?
  4. Comment étendriez-vous cette installation en un pilote de production avec plusieurs appareils Jetson ?

Résumé

Cette annexe transforme la moitié déploiement du cours en un système concret : des caméras en entrée, l'analyse DeepStream au milieu, et en sortie des enregistrements, des événements et un mur vidéo. En la parcourant, on voit comment les concepts des sections 4.2 à 4.9 s'articulent dans une application edge réelle.

Références