Skip to content

Ultralytics YOLOv8 sur NVIDIA Jetson à l’aide du SDK DeepStream et TensorRT

Ce guide complet fournit une marche à suivre détaillée pour déployer Ultralytics YOLOv8 sur les appareils NVIDIA Jetson à l'aide de DeepStream SDK et TensorRT. Ici, nous utilisons TensorRT pour maximiser les performances d'inférence sur la plateforme Jetson.

DeepStream sur NVIDIA Jetson

Note

Ce guide a été testé avec le Seeed Studio reComputer J4012 qui est basé sur la NVIDIA Jetson Orin NX 16GB et la version JP5.1.3 de JetPack et le Seeed Studio reComputer J1020 v2 qui est basé sur la NVIDIA Jetson Nano 4GB et la version JP4.6.4 de JetPack. Il devrait fonctionner sur toute la gamme de matériel NVIDIA Jetson, y compris les plus récents et les plus anciens.

Qu’est-ce que NVIDIA DeepStream ?

Le SDK DeepStream de NVIDIA est une boîte à outils complète d'analyse en continu basée sur GStreamer pour le traitement multi-capteurs basé sur l'IA, la vidéo, l'audio et la compréhension des images. Il est idéal pour les développeurs d'IA de vision, les partenaires logiciels, les startups et les équipementiers qui créent des apps et des services IVA (Intelligent Video Analytics). Tu peux désormais créer des pipelines de traitement de flux qui intègrent des réseaux neuronaux et d'autres tâches de traitement complexes comme le suivi, le codage/décodage vidéo et le rendu vidéo. Ces pipelines permettent de réaliser des analyses en temps réel sur des données vidéo, d'images et de capteurs. La prise en charge multiplateforme de DeepStream te permet de développer plus rapidement et plus facilement des applications et des services d'IA de vision sur site, à la périphérie et dans le cloud.

Conditions préalables

Avant de commencer Ă  suivre ce guide :

Astuce

Dans ce guide, nous avons utilisé la méthode du paquet Debian pour installer le SDK DeepStream sur l'appareil Jetson. Tu peux aussi visiter le site DeepStream SDK on Jetson (Archivé) pour accéder aux anciennes versions de DeepStream.

Configuration de DeepStream pour YOLOv8

Ici, nous utilisons le dépôt GitHub marcoslucianops/DeepStream-Yolo qui inclut la prise en charge du SDK NVIDIA DeepStream pour les modèles YOLO . Nous apprécions les efforts de marcoslucianops pour ses contributions !

  1. Installer les dépendances

    pip install cmake
    pip install onnxsim
    
  2. Clonez le référentiel suivant

    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    cd DeepStream-Yolo
    
  3. Télécharge Ultralytics YOLOv8 modèle de détection (.pt) de ton choix parmi les versionsYOLOv8 . Nous utilisons ici yolov8s.pt.

    wget https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8s.pt
    

    Note

    Tu peux aussi utiliser un modèle YOLOv8 formé sur mesure.

  4. Convertir le modèle en ONNX

    python3 utils/export_yoloV8.py -w yolov8s.pt
    

    Transmettez les arguments ci-dessous Ă  la commande ci-dessus

    Pour DeepStream 6.0.1, utilisez opset 12 ou version antérieure. L’ensemble d’opérations par défaut est 16.

    --opset 12
    

    Pour modifier la taille de l’inférence (par défaut : 640)

    -s SIZE
    --size SIZE
    -s HEIGHT WIDTH
    --size HEIGHT WIDTH
    

    Exemple pour 1280 :

    -s 1280
    or
    -s 1280 1280
    

    Pour simplifier le ONNX modèle (DeepStream >= 6.0)

    --simplify
    

    Pour utiliser la taille de lot dynamique (DeepStream >= 6.1)

    --dynamic
    

    Pour utiliser la taille de lot statique (exemple pour la taille de lot = 4)

    --batch 4
    
  5. Définissez la version CUDA en fonction de la version de JetPack installée

    Pour JetPack 4.6.4 :

    export CUDA_VER=10.2
    

    Pour JetPack 5.1.3 :

    export CUDA_VER=11.4
    
  6. Compiler la bibliothèque

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  7. Modifier le config_infer_primary_yoloV8.txt selon votre modèle (pour YOLOv8s avec 80 classes)

    [property]
    ...
    onnx-file=yolov8s.onnx
    ...
    num-detected-classes=80
    ...
    
  8. Modifier le deepstream_app_config fichier

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yoloV8.txt
    
  9. Vous pouvez également modifier la source vidéo dans deepstream_app_config lime. Ici, un fichier vidéo par défaut est chargé

    ...
    [source0]
    ...
    uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
    

Exécuter l’inférence

deepstream-app -c deepstream_app_config.txt

Note

Il faudra beaucoup de temps pour générer le TensorRT avant de commencer l’inférence. Alors s’il vous plaît, soyez patient.

YOLOv8 avec deepstream

Astuce

Si vous souhaitez convertir le modèle en précision FP16, il suffit de définir model-engine-file=model_b1_gpu0_fp16.engine et network-mode=2 dedans config_infer_primary_yoloV8.txt

Calibrage INT8

Si tu veux utiliser la précision INT8 pour l'inférence, tu dois suivre les étapes suivantes

  1. Poser OPENCV variable d’environnement

    export OPENCV=1
    
  2. Compiler la bibliothèque

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  3. Pour le jeu de données COCO, télécharge le val2017extrais, et déplace-toi vers DeepStream-Yolo dossier

  4. Créer un nouveau répertoire pour les images d’étalonnage

    mkdir calibration
    
  5. Exécutez ce qui suit pour sélectionner 1000 images aléatoires dans l’ensemble de données COCO pour exécuter l’étalonnage

    for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
        cp ${jpg} calibration/; \
    done
    

    Note

    NVIDIA recommande au moins 500 images pour obtenir une bonne précision. Sur cet exemple, 1000 images sont choisies pour obtenir une meilleure précision (plus d'images = plus de précision). Tu peux régler le nombre d'images de tête à 1000. Par exemple, pour 2000 images, la tête -2000. Ce processus peut prendre beaucoup de temps.

  6. Créez le calibration.txt avec toutes les images sélectionnées

    realpath calibration/*jpg > calibration.txt
    
  7. Définir des variables d’environnement

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    Note

    Des valeurs INT8_CALIB_BATCH_SIZE plus élevées se traduiront par une plus grande précision et une vitesse d’étalonnage plus rapide. Réglez-le en fonction de votre mémoire GPU.

  8. Mettez Ă  jour le config_infer_primary_yoloV8.txt fichier

    De

    ...
    model-engine-file=model_b1_gpu0_fp32.engine
    #int8-calib-file=calib.table
    ...
    network-mode=0
    ...
    

    Pour

    ...
    model-engine-file=model_b1_gpu0_int8.engine
    int8-calib-file=calib.table
    ...
    network-mode=1
    ...
    

Exécuter l’inférence

deepstream-app -c deepstream_app_config.txt

Configuration de MultiStream

Pour configurer plusieurs flux sous une seule application deepstream, vous pouvez apporter les modifications suivantes Ă  la commande deepstream_app_config.txt fichier

  1. Modifiez les lignes et les colonnes pour créer un affichage en grille en fonction du nombre de flux que vous souhaitez avoir. Par exemple, pour 4 flux, nous pouvons ajouter 2 lignes et 2 colonnes.

    [tiled-display]
    rows=2
    columns=2
    
  2. Poser num-sources=4 et ajoutez uri des 4 volets

    [source0]
    enable=1
    type=3
    uri=<path_to_video>
    uri=<path_to_video>
    uri=<path_to_video>
    uri=<path_to_video>
    num-sources=4
    

Exécuter l’inférence

deepstream-app -c deepstream_app_config.txt
Configuration multi-flux

Résultats de l’analyse comparative

Le tableau suivant résume comment YOLOv8s les modèles fonctionnent à différents niveaux TensorRT niveaux de précision avec une taille d’entrée de 640x640 sur NVIDIA Jetson Orin NX 16 Go.

Nom du modèle Précision Temps d'inférence (ms/im) FPS
YOLOv8s FP32 15.63 64
FP16 7.94 126
INT8 5.53 181

Remerciements

Ce guide a été initialement créé par nos amis de Seeed Studio, Lakshantha et Elaine.



Créé le 2024-07-01, Mis à jour le 2024-07-01
Auteurs : lakshanthad (1)

Commentaires