Vai al contenuto

Ultralytics YOLO11 su NVIDIA Jetson utilizzando DeepStream SDK e TensorRT



Guarda: Come eseguire flussi multipli con DeepStream SDK su Jetson Nano utilizzando Ultralytics YOLO11

Questa guida completa fornisce una guida dettagliata per l'implementazione di Ultralytics YOLO11 su NVIDIA dispositivi Jetson utilizzando DeepStream SDK e TensorRT. Qui utilizziamo TensorRT per massimizzare le prestazioni di inferenza sulla piattaforma Jetson.

DeepStream su NVIDIA Jetson

Nota

Questa guida è stata testata con NVIDIA Jetson Orin Nano Super Developer Kit che esegue l'ultima versione stabile di JetPack JP6.1, Seeed Studio reComputer J4012 che è basato su NVIDIA Jetson Orin NX 16GB con la release JetPack JP5.1.3 e Seeed Studio reComputer J1020 v2 che è basato su NVIDIA Jetson Nano 4GB con la release JetPack JP4.6.4. Si prevede che funzionerà su tutta la gamma di hardware NVIDIA Jetson, compresi gli ultimi e i precedenti.

Che cos'è NVIDIA DeepStream?

NVIDIADeepStream SDK è un toolkit completo per l'analisi dello streaming basato su GStreamer per l'elaborazione multisensore basata sull'intelligenza artificiale, la comprensione di video, audio e immagini. È ideale per gli sviluppatori di AI vision, i partner software, le startup e gli OEM che realizzano applicazioni e servizi IVA (Intelligent Video Analytics). È ora possibile creare pipeline di elaborazione dei flussi che incorporano reti neurali e altre attività di elaborazione complesse come il tracking, la codifica/decodifica video e il rendering video. Queste pipeline consentono l'analisi in tempo reale di dati video, immagini e sensori. Il supporto multipiattaforma di DeepStream offre un modo più rapido e semplice per sviluppare applicazioni e servizi di IA di visione in sede, sul bordo e nel cloud.

Prerequisiti

Prima di iniziare a seguire questa guida:

Suggerimento

In questa guida abbiamo utilizzato il metodo del pacchetto Debian per installare DeepStream SDK sul dispositivo Jetson. È inoltre possibile visitare la pagina DeepStream SDK su Jetson (archiviata) per accedere alle versioni precedenti di DeepStream.

Configurazione di DeepStream per YOLO11

Qui stiamo usando il repository GitHub marcoslucianops/DeepStream-Yolo che include il supporto dell'SDK DeepStream NVIDIA per i modelli YOLO . Apprezziamo gli sforzi di marcoslucianops per i suoi contributi!

  1. Installare Ultralytics con le dipendenze necessarie

    cd ~
    pip install -U pip
    git clone https://github.com/ultralytics/ultralytics
    cd ultralytics
    pip install -e ".[export]" onnxslim
    
  2. Clonare il repository DeepStream-Yolo

    cd ~
    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    
  3. Copiare il export_yoloV8.py da DeepStream-Yolo/utils alla cartella ultralytics cartella

    cp ~/DeepStream-Yolo/utils/export_yoloV8.py ~/ultralytics
    cd ultralytics
    

    Nota

    export_yoloV8.py funziona per entrambi i modelli YOLOv8 e YOLO11 .

  4. Scaricare il modello di rilevamento Ultralytics YOLO11 (.pt) a scelta tra le release diYOLO11 . Qui usiamo yolo11s.pt.

    wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11s.pt
    

    Nota

    È anche possibile utilizzare un modello YOLO11 addestrato in modo personalizzato.

  5. Convertire il modello in ONNX

    python3 export_yoloV8.py -w yolo11s.pt
    

    Passate i seguenti argomenti al comando sopra indicato

    Per DeepStream 6.0.1, utilizzare l'opset 12 o inferiore. L'opset predefinito è 16.

    --opset 12
    

    Per modificare la dimensione dell'inferenza (default: 640)

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

    Esempio per 1280:

    -s 1280
    or
    -s 1280 1280
    

    Per semplificare il modello ONNX (DeepStream >= 6.0)

    --simplify
    

    Per utilizzare la dimensione dinamica del batch (DeepStream >= 6.1)

    --dynamic
    

    Per utilizzare una dimensione di batch statica (esempio per batch-size = 4)

    --batch 4
    
  6. Copiare il file generato .onnx e il file del modello labels.txt al file DeepStream-Yolo cartella

    cp yolo11s.pt.onnx labels.txt ~/DeepStream-Yolo
    cd ~/DeepStream-Yolo
    
  7. Impostare la versione di CUDA in base alla versione di JetPack installata

    Per JetPack 4.6.4:

    export CUDA_VER=10.2
    

    Per JetPack 5.1.3:

    export CUDA_VER=11.4
    

    Per Jetpack 6.1:

    export CUDA_VER=12.6
    
  8. Compilare la libreria

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  9. Modificare il config_infer_primary_yoloV8.txt secondo il proprio modello (per YOLO11 con 80 classi)

    [property]
    ...
    onnx-file=yolo11s.pt.onnx
    ...
    num-detected-classes=80
    ...
    
  10. Modificare il deepstream_app_config file

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yoloV8.txt
    
  11. È inoltre possibile cambiare la sorgente video in deepstream_app_config file. Qui viene caricato un file video predefinito

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

Eseguire l'inferenza

deepstream-app -c deepstream_app_config.txt

Nota

Ci vorrà molto tempo per generare il file del motore TensorRT prima di avviare l'inferenza. Si prega quindi di avere pazienza.

YOLO11 con deepstream

Suggerimento

Se si vuole convertire il modello in precisione FP16, è sufficiente impostare model-engine-file=model_b1_gpu0_fp16.engine e network-mode=2 all'interno config_infer_primary_yoloV8.txt

Calibrazione INT8

Se si desidera utilizzare la precisione INT8 per l'inferenza, è necessario seguire i seguenti passaggi

Nota

Attualmente INT8 non funziona con TensorRT 10.x. Questa sezione della guida è stata testata con TensorRT 8.x, che dovrebbe funzionare.

  1. Set OPENCV variabile d'ambiente

    export OPENCV=1
    
  2. Compilare la libreria

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  3. Per il set di dati COCO, scaricare il file val2017, estrarre e spostare in DeepStream-Yolo cartella

  4. Creare una nuova directory per le immagini di calibrazione

    mkdir calibration
    
  5. Eseguire quanto segue per selezionare 1000 immagini casuali dal set di dati COCO per eseguire la calibrazione.

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

    Nota

    NVIDIA raccomanda almeno 500 immagini per ottenere una buona precisione. In questo esempio, sono state scelte 1000 immagini per ottenere una maggiore precisione (più immagini = maggiore precisione). Si può impostare da testa -1000. Ad esempio, per 2000 immagini, testa -2000. Questo processo può richiedere molto tempo.

  6. Creare il calibration.txt file con tutte le immagini selezionate

    realpath calibration/*jpg > calibration.txt
    
  7. Impostare le variabili d'ambiente

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    Nota

    Valori più alti di INT8_CALIB_BATCH_SIZE garantiscono una maggiore precisione e una maggiore velocità di calibrazione. Impostarlo in base alla memoria di GPU .

  8. Aggiornare il config_infer_primary_yoloV8.txt file

    Da

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

    A

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

Eseguire l'inferenza

deepstream-app -c deepstream_app_config.txt

Configurazione MultiStream

Per impostare più flussi sotto un'unica applicazione deepstream, si possono apportare le seguenti modifiche al file deepstream_app_config.txt file

  1. Modificare le righe e le colonne per creare una griglia di visualizzazione in base al numero di flussi che si desidera avere. Ad esempio, per 4 flussi, si possono aggiungere 2 righe e 2 colonne.

    [tiled-display]
    rows=2
    columns=2
    
  2. Set num-sources=4 e aggiungere uri di tutti e 4 i flussi

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

Eseguire l'inferenza

deepstream-app -c deepstream_app_config.txt
Configurazione multistream

Risultati del benchmark

I seguenti benchmark riassumono le prestazioni dei modelli YOLO11 a diversi livelli di precisione TensorRT con una dimensione di input di 640x640 su NVIDIA Jetson Orin NX 16GB.

Tabella di confronto

Grafico dei benchmark di Jetson DeepStream

Tabella di confronto dettagliata

Prestazioni

Formato Stato Tempo di inferenza (ms/im)
TensorRT (FP32) 8.64
TensorRT (FP16) 5.27
TensorRT (INT8) 4.54
Formato Stato Tempo di inferenza (ms/im)
TensorRT (FP32) 14.53
TensorRT (FP16) 7.91
TensorRT (INT8) 6.05
Formato Stato Tempo di inferenza (ms/im)
TensorRT (FP32) 32.05
TensorRT (FP16) 15.55
TensorRT (INT8) 10.43
Formato Stato Tempo di inferenza (ms/im)
TensorRT (FP32) 39.68
TensorRT (FP16) 19.88
TensorRT (INT8) 13.64
Formato Stato Tempo di inferenza (ms/im)
TensorRT (FP32) 80.65
TensorRT (FP16) 39.06
TensorRT (INT8) 22.83

Ringraziamenti

Questa guida è stata inizialmente creata dai nostri amici di Seeed Studio, Lakshantha ed Elaine.

FAQ

Come si configura Ultralytics YOLO11 su un dispositivo NVIDIA Jetson?

Per configurare Ultralytics YOLO11 su un dispositivo NVIDIA Jetson, occorre innanzitutto installare l' SDK DeepStream compatibile con la propria versione di JetPack. Per configurare il dispositivo NVIDIA Jetson per la distribuzione di YOLO11 , seguire la guida passo passo contenuta nella nostra Guida rapida.

Qual è il vantaggio di utilizzare TensorRT con YOLO11 su NVIDIA Jetson?

L'uso di TensorRT con YOLO11 ottimizza il modello per l'inferenza, riducendo significativamente la latenza e migliorando il throughput sui dispositivi NVIDIA Jetson. TensorRT offre un'inferenza di deep learning ad alte prestazioni e bassa latenza grazie alla fusione dei livelli, alla calibrazione di precisione e all'autotuning del kernel. Ciò consente un'esecuzione più rapida ed efficiente, particolarmente utile per applicazioni in tempo reale come l'analisi video e le macchine autonome.

È possibile eseguire Ultralytics YOLO11 con DeepStream SDK su diversi hardware NVIDIA Jetson?

Sì, la guida per la distribuzione di Ultralytics YOLO11 con l'SDK DeepStream e TensorRT è compatibile con l'intera gamma di Jetson NVIDIA . Questo include dispositivi come Jetson Orin NX 16GB con JetPack 5.1.3 e Jetson Nano 4GB con JetPack 4.6.4. Per informazioni dettagliate, consultare la sezione Configurazione di DeepStream per YOLO11.

Come posso convertire un modello YOLO11 in ONNX per DeepStream?

Per convertire un modello YOLO11 in formato ONNX per la distribuzione con DeepStream, usare il metodo utils/export_yoloV8.py dallo script DeepStream-Yolo deposito.

Ecco un esempio di comando:

python3 utils/export_yoloV8.py -w yolo11s.pt --opset 12 --simplify

Per maggiori dettagli sulla conversione dei modelli, consultate la nostra sezione sull'esportazione dei modelli.

Quali sono i benchmark delle prestazioni di YOLO su NVIDIA Jetson Orin NX?

Le prestazioni dei modelli YOLO11 su NVIDIA Jetson Orin NX 16GB variano in base ai livelli di precisione di TensorRT . Ad esempio, i modelli YOLO11s raggiungono:

  • Precisione FP32: 14,6 ms/im, 68,5 FPS
  • Precisione FP16: 7,94 ms/im, 126 FPS
  • Precisione INT8: 5,95 ms/im, 168 FPS

Questi benchmark sottolineano l'efficienza e la capacità di utilizzare i modelli TensorRT ottimizzati YOLO11 sull'hardware NVIDIA Jetson. Per ulteriori dettagli, consultare la sezione Risultati dei benchmark.

📅C reato 7 mesi fa ✏️ Aggiornato 1 mese fa

Commenti