17 janvier 2022

Démarrer avec des pipelines NVIDIA Deepstream 6.0 personnalisés en Python

Les contributeurs
Jules Talloen
Ingénieur en machine learning
Aucun élément trouvé.
S'abonner à la newsletter
Partager cet article

NVIDIA a récemment publié la version 6.0 de Deepstream, sa boîte à outils d'analyse en continu pour le traitement multi-capteurs basé sur l'IA, la vidéo, l'audio et la compréhension des images. Parmi les nouvelles fonctionnalités, citons l'amélioration des liaisons Python (vous pouvez consulter les notes de version ici). Pourquoi cela est-il important, me direz-vous ?

Si vous souhaitez créer un pipeline standard de détection et de suivi d'objets, l'application de référence Deepstream peut vous aider à démarrer. Mon collègue Victor a rédigé un Quickstart NVIDIA Deepstream expliquant comment l'installer. Comme il le mentionne à la fin de son billet, vous vous heurterez à un mur dès que vous voudrez faire quelque chose de personnalisé. Vous vous direz peut-être "Pas de problème ! Je vais me plonger dans le code et utiliser mes compétences en codage pour ajouter une logique personnalisée". Malheureusement, les applications Deepstream sont écrites à l'origine en C++. Python est toujours le langage de programmation numéro un dans le domaine du ML et c'est également le langage de mon choix. Heureusement, NVIDIA propose des interfaces Python. Avec la sortie de Deepstream 6.0, NVIDIA a mis les bindings Python à disposition dans son dépôt d'applications Python. Ce dépôt contient quelques exemples d'applications Python.

Si vous êtes comme moi, vous avez probablement été un peu déstabilisé en regardant les exemples de Deepstream Python. Il est difficile de suivre et de comprendre les composants logiques de l'application. Chaque application est en fait un script monolithique avec différents morceaux de code mélangés. En outre, tous ces exemples d'applications partagent de nombreuses fonctionnalités et contiennent donc beaucoup de code redondant.

En tant que grand fan de la POO (programmation orientée objet) et du DRY (Don't Repeat Yourself), j'ai décidé de réécrire, d'améliorer et de combiner certains des exemples d'applications de Deepstream. Le résultat est un boilerplate Python Deepstream 6.0.

Le modèle Python

Le référentiel boilerplate est structuré comme suit :

Le répertoire app/ contient les implémentations du pipeline Deepstream. Les fichiers de configuration de Deepstream sont stockés dans le répertoire configs/. Les poids des modèles, les librairies et les exemples de vidéos se trouvent dans le répertoire data/.

Dans le répertoire app/, vous trouverez un script pipeline.py et un répertoire pipelines. Le premier contient une classe Pipeline de base, le pipeline commun de détection et de suivi d'objets (par exemple YOLOv4 avec DeepSORT). En entrée, il accepte n'importe quel format supporté par Gstreamer (par exemple un flux RTSP, un fichier mp4...) en utilisant un bin de décodage d'URI. Les boîtes de délimitation et les identifiants des trackers qui en résultent sont dessinés sur la vidéo et renvoyés sous la forme d'un fichier mp4 ou d'un nouveau flux RTSP. Bien que cela permette une grande variété d'applications, vous souhaitez généralement ajouter une logique personnalisée. La section suivante explique une façon de le faire.

Insérer du code personnalisé avec les sondes Gstreamer

Outre le pipeline de base, il existe quelques exemples de pipelines personnalisés :

  • Anonymisation : suppression de certains objets détectés
  • Ré-identification : suivi de personnes et extraction de caractéristiques de ré-identification avec OSNet
  • Segmentation : segmentation sémantique

Les pipelines écrasent une partie de la logique du pipeline de base et insèrent une logique personnalisée à l'aide des sondes Gstreamer. Vous pouvez sonder à la fois les métadonnées (par exemple, les boîtes de délimitation) et les données (par exemple, les images vidéo).

L'AnonymizationPipeline est un exemple de pipeline personnalisé utilisant à la fois les métadonnées sous-jacentes et les données d'image. L'extrait de code ci-dessous est tout ce que vous devez écrire pour créer votre pipeline. La magie de Deepstream se produit dans la fonction _add_probes. Vous commencez par sélectionner un composant de votre pipeline, dans ce cas le tiler. Vous récupérez ensuite le pad statique et ajoutez une sonde. La fonction _wrap_probe agit comme un intermédiaire pour abstraire la gestion de la mémoire C sous-jacente. Par conséquent, vous pouvez simplement écrire une fonction (par exemple _anonymize ) qui prend en entrée des cadres numpy et des listes de dictionnaires de métadonnées.

Mise en œuvre d'un pipeline d'anonymisation personnalisé. Voir https://github.com/ml6team/deepstream-python/blob/master/deepstream/app/pipelines/anonymization.py pour l'implémentation complète.

Pour commencer

Comme la configuration de Deepstream et des bindings Python peut être très lourde, j'ai regroupé la plupart des exigences dans un fichier Docker. Vous n'avez qu'à installer Docker, le kit de conteneurs NVIDIA et le pilote NVIDIA. Les bindings Python compilés et toutes les dépendances restantes font partie de l'image Docker.

Conditions préalables

Sur une machine compatible NVIDIA, installez la version 470.63.01 du pilote NVIDIA :

Vérifier l'installation avec :

nvidia-smi

Installez Docker et le NVIDIA Container Toolkit en suivant le guide d'installation du NVIDIA Container Toolkit.

Construire et exécuter le pipeline

Cloner le dépôt dans un répertoire local, par exemple ~/deepstream-python :

git clone https://github.com/ml6team/deepstream-python.git

Veillez à exécuter git lfs pull par la suite pour télécharger les fichiers depuis le stockage LFS :

Construisez l'image du conteneur en exécutant la commande suivante dans le répertoire deepstream/ (où se trouve le fichier Docker) :

docker build -t deepstream .

Ensuite, lancez le conteneur avec :

docker run -it --gpus all -v ~/deepstream-python/output:/app/output

deepstream python3 run.py <URI>

Où URI est un chemin d'accès à un fichier (file://...) ou une URL RTSP (rtsp://...) vers un flux vidéo.

Par exemple :

L'option -v monte le répertoire de sortie dans le conteneur. Après l'exécution du pipeline, deepstream-python/output contiendra les résultats. Pour le pipeline de base, il s'agit d'une vidéo (out.mp4) avec les boîtes de délimitation dessinées.

Toutes ces instructions, et d'autres encore, se trouvent dans le fichier README du dépôt. Bon codage !

Ce billet de blog a été rendu possible grâce au soutien de Flandre Innovation & Entrepreneuriat - VLAIO

Postes connexes

Voir tout le contenu
Aucun résultat n'a été trouvé.
Il n'y a pas de résultats correspondant à ces critères. Essayez de modifier votre recherche.
Grand modèle linguistique
Modèles de fondation
Entreprise
Personnes
Données Structurées
Chat GPT
Durabilité
Voix et son
Développement frontal
Protection des données et sécurité
IA responsable/éthique
Infrastructure
Hardware et capteurs
MLOps
IA générative
Natural Language Processing
Vision par ordinateur