Zum Inhalt springen

Ultralytics YOLOv8 auf NVIDIA Jetson mit DeepStream SDK und TensorRT

Dieser umfassende Leitfaden enthält eine detaillierte exemplarische Vorgehensweise für die Bereitstellung Ultralytics YOLOv8 auf NVIDIA Jetson-Geräten mit DeepStream SDK und TensorRT. Hier verwenden wir TensorRT , um die Inferenzleistung auf der Jetson-Plattform zu maximieren.

DeepStream auf NVIDIA Jetson

Hinweis

Diese Anleitung wurde sowohl mit Seeed Studio reComputer J4012 getestet, das auf NVIDIA Jetson Orin NX 16 GB mit JetPack-Version von JP5.1.3 basiert, als auch mit Seeed Studio reComputer J1020 v2 , die auf NVIDIA Jetson Nano 4 GB basiert, mit JetPack-Version von JP4.6.4. Es wird erwartet, dass es in der gesamten NVIDIA Jetson-Hardware-Reihe funktioniert, einschließlich der neuesten und älteren.

Was ist NVIDIA DeepStream?

Das DeepStream SDK von NVIDIA ist ein komplettes Streaming-Analyse-Toolkit auf Basis von GStreamer für KI-basierte Multisensor-Verarbeitung, Video-, Audio- und Bildverständnis. Es ist ideal für Vision-AI-Entwickler, Softwarepartner, Startups und OEMs, die IVA-Apps und -Dienste (Intelligent Video Analytics) entwickeln. Sie können jetzt Streamverarbeitungspipelines erstellen, die neuronale Netze und andere komplexe Verarbeitungsaufgaben wie Nachverfolgung, Videocodierung/-decodierung und Videorendering enthalten. Diese Pipelines ermöglichen Echtzeitanalysen von Video-, Bild- und Sensordaten. Die Multi-Plattform-Unterstützung von DeepStream bietet Ihnen eine schnellere und einfachere Möglichkeit, Vision-KI-Anwendungen und -Dienste vor Ort, am Edge und in der Cloud zu entwickeln.

Voraussetzungen

Bevor Sie dieser Anleitung folgen:

Tipp

In dieser Anleitung haben wir die Debian-Paketmethode verwendet, um das DeepStream SDK auf dem Jetson-Gerät zu installieren. Sie können auch das DeepStream SDK auf Jetson (archiviert) besuchen, um auf ältere Versionen von DeepStream zuzugreifen.

DeepStream-Konfiguration für YOLOv8

Hier verwenden wir marcoslucianops/DeepStream-Yolo GitHub-Repository, das NVIDIA DeepStream SDK-Unterstützung für YOLO Modelle. Wir schätzen die Bemühungen von marcoslucianops für seine Beiträge!

  1. Installieren von Abhängigkeiten

    pip install cmake
    pip install onnxsim
    
  2. Klonen Sie das folgende Repository

    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    cd DeepStream-Yolo
    
  3. Herunterladen Ultralytics YOLOv8 Detektionsmodell (.pt) Ihrer Wahl aus YOLOv8 Veröffentlichungen. Hier verwenden wir yolov8s.pt.

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

    Hinweis

    Sie können auch eine Individuell geschult YOLOv8 Modell.

  4. Modell konvertieren in ONNX

    python3 utils/export_yoloV8.py -w yolov8s.pt
    

    Übergeben Sie die folgenden Argumente an den obigen Befehl

    Verwenden Sie für DeepStream 6.0.1 opset 12 oder niedriger. Die Standardeinstellung ist 16.

    --opset 12
    

    So ändern Sie die Inferenzgröße (Standard: 640)

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

    Beispiel für 1280:

    -s 1280
    or
    -s 1280 1280
    

    Zur Vereinfachung der ONNX Modell (DeepStream >= 6.0)

    --simplify
    

    So verwenden Sie die dynamische Batch-Größe (DeepStream >= 6.1)

    --dynamic
    

    So verwenden Sie die statische Batchgröße (Beispiel für Batchgröße = 4)

    --batch 4
    
  5. Stellen Sie die CUDA-Version entsprechend der installierten JetPack-Version ein

    Für JetPack 4.6.4:

    export CUDA_VER=10.2
    

    Für JetPack 5.1.3:

    export CUDA_VER=11.4
    
  6. Kompilieren Sie die Bibliothek

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  7. Bearbeiten Sie die config_infer_primary_yoloV8.txt Datei entsprechend Ihrem Modell (für YOLOv8s mit 80 Klassen)

    [property]
    ...
    onnx-file=yolov8s.onnx
    ...
    num-detected-classes=80
    ...
    
  8. Bearbeiten Sie die deepstream_app_config Datei

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yoloV8.txt
    
  9. Sie können die Videoquelle auch in deepstream_app_config Datei. Hier wird eine Standard-Videodatei geladen

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

Ausführen von Rückschlüssen

deepstream-app -c deepstream_app_config.txt

Hinweis

Es wird lange dauern, die TensorRT Engine-Datei, bevor Sie die Inferenz starten. Habt also bitte etwas Geduld.

YOLOv8 mit Deepstream

Tipp

Wenn Sie das Modell auf FP16-Genauigkeit umstellen möchten, stellen Sie einfach model-engine-file=model_b1_gpu0_fp16.engine und network-mode=2 innerhalb config_infer_primary_yoloV8.txt

INT8 Kalibrierung

Wenn du die INT8-Präzision für die Inferenz verwenden möchtest, musst du die folgenden Schritte ausführen

  1. Garnitur OPENCV Umgebungsvariable

    export OPENCV=1
    
  2. Kompilieren Sie die Bibliothek

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  3. Laden Sie für das COCO-Dataset die val2017, extrahieren und nach DeepStream-Yolo Ordner

  4. Erstellen eines neuen Verzeichnisses für Kalibrierungsbilder

    mkdir calibration
    
  5. Führen Sie Folgendes aus, um 1000 zufällige Bilder aus dem COCO-Datensatz auszuwählen, um die Kalibrierung durchzuführen

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

    Hinweis

    NVIDIA empfiehlt mindestens 500 Bilder, um eine gute Genauigkeit zu erreichen. In diesem Beispiel werden 1000 Bilder ausgewählt, um eine bessere Genauigkeit zu erhalten (mehr Bilder = mehr Genauigkeit). Sie können es von Kopf -1000 einstellen. Beispiel: Für 2000 Bilder Kopf -2000. Dieser Vorgang kann lange dauern.

  6. Erstellen Sie die calibration.txt Datei mit allen ausgewählten Bildern

    realpath calibration/*jpg > calibration.txt
    
  7. Festlegen von Umgebungsvariablen

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    Hinweis

    Höhere INT8_CALIB_BATCH_SIZE Werte führen zu mehr Genauigkeit und schnellerer Kalibrierungsgeschwindigkeit. Stellen Sie es entsprechend Ihrem GPU-Speicher ein.

  8. Aktualisieren Sie die config_infer_primary_yoloV8.txt Datei

    Von

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

    An

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

Ausführen von Rückschlüssen

deepstream-app -c deepstream_app_config.txt

MultiStream-Einrichtung

Um mehrere Streams unter einer einzigen Deepstream-Anwendung einzurichten, können Sie die folgenden Änderungen an der deepstream_app_config.txt Datei

  1. Ändern Sie die Zeilen und Spalten, um eine Rasteranzeige entsprechend der Anzahl der gewünschten Streams zu erstellen. Zum Beispiel können wir für 4 Streams 2 Zeilen und 2 Spalten hinzufügen.

    [tiled-display]
    rows=2
    columns=2
    
  2. Garnitur num-sources=4 und fügen Sie uri aller 4 Streams

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

Ausführen von Rückschlüssen

deepstream-app -c deepstream_app_config.txt
Multistream-Einrichtung

Benchmark-Ergebnisse

Die folgende Tabelle fasst zusammen, wie YOLOv8s Modelle funktionieren bei unterschiedlichen TensorRT Präzisionspegel mit einer Eingabegröße von 640x640 auf NVIDIA Jetson Orin NX 16GB.

Modellname Präzision Inferenzzeit (ms/im) FPS
YOLOv8s FP32 15.63 64
FP16 7.94 126
INT8 5.53 181

Bestätigungen

Dieser Leitfaden wurde ursprünglich von unseren Freunden von Seeed Studio, Lakshantha und Elaine, erstellt.



Erstellt am 01.07.2024, aktualisiert am 01.07.2024
Autoren: lakshanthad (1)

Kommentare