Vai al contenuto

Ultralytics YOLOv8 su NVIDIA Jetson utilizzando DeepStream SDK e TensorRT

Questa guida completa fornisce una guida dettagliata per l'implementazione di Ultralytics YOLOv8 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 sia con Seeed Studio reComputer J4012, che si basa su NVIDIA Jetson Orin NX 16GB con la release JetPack JP5.1.3, sia con Seeed Studio reComputer J1020 v2, che si basa 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 quelli più recenti e quelli legacy.

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 puoi 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 di effettuare analisi in tempo reale su dati video, immagini e sensori. Il supporto multipiattaforma di DeepStream ti offre un modo più rapido e semplice per sviluppare applicazioni e servizi di AI vision on-premise, edge e 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. Puoi anche visitare la pagina DeepStream SDK su Jetson (Archiviato) per accedere alle versioni precedenti di DeepStream.

Configurazione DeepStream per YOLOv8

Qui utilizziamo il repository GitHub marcoslucianops/DeepStream-Yolo che include il supporto dell'SDK DeepStream NVIDIA per i modelli YOLO . Apprezziamo gli sforzi di marcoslucianops per il suo contributo!

  1. Installare le dipendenze

    pip install cmake
    pip install onnxsim
    
  2. Clonare il seguente repository

    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    cd DeepStream-Yolo
    
  3. Scarica il modello di rilevamento Ultralytics YOLOv8 (.pt) di tua scelta tra le release diYOLOv8 . Qui utilizziamo yolov8s.pt.

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

    Nota

    Puoi anche utilizzare un modello YOLOv8 addestrato in modo personalizzato.

  4. Converti il modello in ONNX

    python3 utils/export_yoloV8.py -w yolov8s.pt
    

    Passare gli argomenti seguenti al comando precedente

    Per DeepStream 6.0.1, utilizzare 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 ONNX modello (DeepStream >= 6.0)

    --simplify
    

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

    --dynamic
    

    Per utilizzare batch size statico (esempio per batch-size = 4)

    --batch 4
    
  5. Imposta 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
    
  6. Compilare la libreria

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  7. Modificare il file config_infer_primary_yoloV8.txt file in base al tuo modello (per YOLOv8s con 80 classi)

    [property]
    ...
    onnx-file=yolov8s.onnx
    ...
    num-detected-classes=80
    ...
    
  8. Modificare il file deepstream_app_config file

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yoloV8.txt
    
  9. È inoltre possibile modificare 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 TensorRT motore prima di avviare l'inferenza. Quindi, per favore, sii paziente.

YOLOv8 con deepstream

Suggerimento

Se si desidera 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 vuoi utilizzare la precisione INT8 per l'inferenza, devi seguire i seguenti passaggi

  1. Mettere 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, scarica 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). Puoi impostarlo a partire da testa -1000. Ad esempio, per 2000 immagini, scegli -2000. Questo processo può richiedere molto tempo.

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

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

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    Nota

    Valori più alti di INT8_CALIB_BATCH_SIZE si tradurranno in una maggiore precisione e velocità di calibrazione. Impostalo in base alla memoria di GPU .

  8. Aggiorna il file 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 configurare più flussi in un'unica applicazione deepstream, è possibile apportare le seguenti modifiche al file deepstream_app_config.txt file

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

    [tiled-display]
    rows=2
    columns=2
    
  2. Mettere num-sources=4 e aggiungi uri di tutti e 4 i corsi d'acqua

    [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

La seguente tabella riassume le prestazioni dei modelli YOLOv8s a diversi livelli di precisione TensorRT con una dimensione di input di 640x640 su NVIDIA Jetson Orin NX 16GB.

Nome del modello Precisione Tempo di inferenza (ms/im) FPS
YOLOv8s FP32 15.63 64
FP16 7.94 126
INT8 5.53 181

Riconoscimenti

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

DOMANDE FREQUENTI

Come faccio a configurare Ultralytics YOLOv8 su un dispositivo NVIDIA Jetson?

Per configurare Ultralytics YOLOv8 su un dispositivo NVIDIA Jetson, devi prima installare l' SDK DeepStream compatibile con la tua versione di JetPack. Segui la guida passo-passo della nostra Guida rapida per configurare il tuo NVIDIA Jetson per la distribuzione di YOLOv8 .

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

L'utilizzo di TensorRT con YOLOv8 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. Questo porta a un'esecuzione più rapida ed efficiente, particolarmente utile per applicazioni in tempo reale come l'analisi video e le macchine autonome.

Posso eseguire Ultralytics YOLOv8 con DeepStream SDK su diversi hardware NVIDIA Jetson?

Sì, la guida per la distribuzione di Ultralytics YOLOv8 con l'SDK DeepStream e TensorRT è compatibile con l'intera gamma di dispositivi NVIDIA Jetson. 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, consulta la sezione Configurazione di DeepStream per YOLOv8.

Come posso convertire un modello YOLOv8 in ONNX per DeepStream?

Per convertire un modello di YOLOv8 in formato ONNX per la distribuzione con DeepStream, usa il file utils/export_yoloV8.py dallo script DeepStream-Yolo deposito.

Ecco un esempio di comando:

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

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

Quali sono le prestazioni di YOLOv8 su NVIDIA Jetson Orin NX?

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

  • Precisione FP32: 15,63 ms/im, 64 FPS
  • Precisione FP16: 7,94 ms/im, 126 FPS
  • Precisione INT8: 5,53 ms/im, 181 FPS

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



Creato 2024-07-01, Aggiornato 2024-07-05
Autori: glenn-jocher (1), lakshanthad (1)

Commenti