Ir al contenido

Ultralytics YOLO11 en NVIDIA Jetson utilizando DeepStream SDK y TensorRT



Ver: Cómo usar modelos Ultralytics YOLO11 con NVIDIA Deepstream en Jetson Orin NX 🚀

Esta guía completa proporciona un tutorial detallado para implementar Ultralytics YOLO11 en dispositivos NVIDIA Jetson utilizando DeepStream SDK y TensorRT. Aquí utilizamos TensorRT para maximizar el rendimiento de la inferencia en la plataforma Jetson.

DeepStream en NVIDIA Jetson

Nota

Esta guía se ha probado con NVIDIA Jetson Orin Nano Super Developer Kit ejecutando la última versión estable de JetPack de JP6.1, Seeed Studio reComputer J4012 que se basa en NVIDIA Jetson Orin NX 16GB ejecutando la versión de JetPack JP5.1.3 y Seeed Studio reComputer J1020 v2 que se basa en NVIDIA Jetson Nano 4GB ejecutando la versión de JetPack JP4.6.4. Se espera que funcione en toda la línea de hardware NVIDIA Jetson, incluyendo las versiones más recientes y las heredadas.

¿Qué es NVIDIA DeepStream?

El SDK DeepStream de NVIDIA es un completo kit de herramientas de análisis de streaming basado en GStreamer para el procesamiento multisensor basado en IA, vídeo, audio y comprensión de imágenes. Es ideal para desarrolladores de visión artificial, socios de software, startups y OEM que crean aplicaciones y servicios IVA (Intelligent Video Analytics). Ahora puedes crear pipelines de procesamiento de flujos que incorporen redes neuronales y otras tareas de procesamiento complejas como el seguimiento, la codificación/descodificación de vídeo y el renderizado de vídeo. Estos pipelines permiten el análisis en tiempo real de datos de vídeo, imagen y sensores. La compatibilidad multiplataforma de DeepStream te ofrece una forma más rápida y sencilla de desarrollar aplicaciones y servicios de visión artificial on-premise, en el edge y en la nube.

Prerrequisitos

Antes de comenzar a seguir esta guía:

Consejo

En esta guía, hemos utilizado el método de paquete Debian para instalar DeepStream SDK en el dispositivo Jetson. También puede visitar DeepStream SDK en Jetson (Archivado) para acceder a versiones heredadas de DeepStream.

Configuración de DeepStream para YOLO11

Aquí estamos utilizando el repositorio de GitHub marcoslucianops/DeepStream-Yolo, que incluye soporte del SDK NVIDIA DeepStream para modelos YOLO. ¡Agradecemos los esfuerzos de marcoslucianops por sus contribuciones!

  1. Instale Ultralytics con las dependencias necesarias

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

    cd ~
    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    
  3. Copiar el export_yolo11.py archivo de DeepStream-Yolo/utils directorio al ultralytics carpeta

    cp ~/DeepStream-Yolo/utils/export_yolo11.py ~/ultralytics
    cd ultralytics
    
  4. Descargue el modelo de detección Ultralytics YOLO11 (.pt) de su elección desde lanzamientos de YOLO11. Aquí usamos yolo11s.pt.

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

    Nota

    También puede utilizar un modelo YOLO11 entrenado a medida.

  5. Convertir el modelo a ONNX

    python3 export_yolo11.py -w yolo11s.pt
    

    Pase los siguientes argumentos al comando anterior

    Para DeepStream 5.1, elimina el --dynamic arg y usar opset 12 o inferior. El valor por defecto opset es 17.

    --opset 12
    

    Para cambiar el tamaño de inferencia (por defecto: 640)

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

    Ejemplo para 1280:

    -s 1280
    or
    -s 1280 1280
    

    Para simplificar el modelo ONNX (DeepStream >= 6.0)

    --simplify
    

    Para utilizar el tamaño de lote dinámico (DeepStream >= 6.1)

    --dynamic
    

    Para usar un tamaño de lote estático (ejemplo para tamaño de lote = 4)

    --batch 4
    
  6. Copiar el generado .onnx archivo de modelo y labels.txt archivo al DeepStream-Yolo carpeta

    cp yolo11s.pt.onnx labels.txt ~/DeepStream-Yolo
    cd ~/DeepStream-Yolo
    
  7. Establezca la versión de CUDA según la versión de JetPack instalada

    Para JetPack 4.6.4:

    export CUDA_VER=10.2
    

    Para JetPack 5.1.3:

    export CUDA_VER=11.4
    

    Para Jetpack 6.1:

    export CUDA_VER=12.6
    
  8. Compilar la biblioteca

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  9. Editar el config_infer_primary_yolo11.txt archivo según su modelo (para YOLO11s con 80 clases)

    [property]
    ...
    onnx-file=yolo11s.pt.onnx
    ...
    num-detected-classes=80
    ...
    
  10. Editar el deepstream_app_config archivo

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yolo11.txt
    
  11. También puede cambiar la fuente de vídeo en deepstream_app_config archivo. Aquí se carga un archivo de video predeterminado

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

Ejecutar Inferencia

deepstream-app -c deepstream_app_config.txt

Nota

Tomará mucho tiempo generar el archivo del motor TensorRT antes de comenzar la inferencia. Por favor, sea paciente.

YOLO11 con deepstream

Consejo

Si quieres convertir el modelo a precisión FP16, simplemente establece model-engine-file=model_b1_gpu0_fp16.engine y network-mode=2 dentro de config_infer_primary_yolo11.txt

Calibración INT8

Si quieres utilizar la precisión INT8 para la inferencia, debes seguir los siguientes pasos

Nota

Actualmente, INT8 no funciona con TensorRT 10.x. Esta sección de la guía se ha probado con TensorRT 8.x, que se espera que funcione.

  1. Establecer OPENCV variable de entorno

    export OPENCV=1
    
  2. Compilar la biblioteca

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  3. Para el conjunto de datos COCO, descargue el val2017, extraiga y mueva a DeepStream-Yolo carpeta

  4. Crear un nuevo directorio para las imágenes de calibración

    mkdir calibration
    
  5. Ejecute lo siguiente para seleccionar 1000 imágenes aleatorias del conjunto de datos COCO para ejecutar la calibración

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

    Nota

    NVIDIA recomienda al menos 500 imágenes para obtener una buena precisión. En este ejemplo, se eligen 1000 imágenes para obtener una mejor precisión (más imágenes = más precisión). Puede configurarlo desde head -1000. Por ejemplo, para 2000 imágenes, head -2000. Este proceso puede llevar mucho tiempo.

  6. Crear el calibration.txt archivo con todas las imágenes seleccionadas

    realpath calibration/*jpg > calibration.txt
    
  7. Establecer variables de entorno

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    Nota

    Los valores más altos de INT8_CALIB_BATCH_SIZE resultarán en más precisión y una velocidad de calibración más rápida. Ajústelo de acuerdo con la memoria de su GPU.

  8. Actualizar el config_infer_primary_yolo11.txt archivo

    De

    ...
    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
    ...
    

Ejecutar Inferencia

deepstream-app -c deepstream_app_config.txt

Configuración MultiStream



Ver: Cómo ejecutar múltiples flujos con DeepStream SDK en Jetson Nano usando Ultralytics YOLO11 🎉

Para configurar múltiples flujos bajo una sola aplicación deepstream, puedes realizar los siguientes cambios en el deepstream_app_config.txt archivo

  1. Cambie las filas y columnas para construir una visualización de cuadrícula según el número de flujos que desee tener. Por ejemplo, para 4 flujos, podemos añadir 2 filas y 2 columnas.

    [tiled-display]
    rows=2
    columns=2
    
  2. Establecer num-sources=4 y añadir uri de los 4 flujos

    [source0]
    enable=1
    type=3
    uri=path/to/video1.jpg
    uri=path/to/video2.jpg
    uri=path/to/video3.jpg
    uri=path/to/video4.jpg
    num-sources=4
    

Ejecutar Inferencia

deepstream-app -c deepstream_app_config.txt
Configuración Multistream

Resultados de las pruebas de rendimiento

Los siguientes benchmarks resumen el rendimiento de los modelos YOLO11 en diferentes niveles de precisión de TensorRT con un tamaño de entrada de 640x640 en NVIDIA Jetson Orin NX de 16 GB.

Gráfico comparativo

Gráfico de puntos de referencia de Jetson DeepStream

Tabla de comparación detallada

Rendimiento

Formato Estado Tiempo de inferencia (ms/im)
TensorRT (FP32) 8.64
TensorRT (FP16) 5.27
TensorRT (INT8) 4.54
Formato Estado Tiempo de inferencia (ms/im)
TensorRT (FP32) 14.53
TensorRT (FP16) 7.91
TensorRT (INT8) 6.05
Formato Estado Tiempo de inferencia (ms/im)
TensorRT (FP32) 32.05
TensorRT (FP16) 15.55
TensorRT (INT8) 10.43
Formato Estado Tiempo de inferencia (ms/im)
TensorRT (FP32) 39.68
TensorRT (FP16) 19.88
TensorRT (INT8) 13.64
Formato Estado Tiempo de inferencia (ms/im)
TensorRT (FP32) 80.65
TensorRT (FP16) 39.06
TensorRT (INT8) 22.83

Agradecimientos

Esta guía fue creada inicialmente por nuestros amigos de Seeed Studio, Lakshantha y Elaine.

Preguntas frecuentes

¿Cómo configuro Ultralytics YOLO11 en un dispositivo NVIDIA Jetson?

Para configurar Ultralytics YOLO11 en un dispositivo NVIDIA Jetson, primero debes instalar el SDK de DeepStream compatible con tu versión de JetPack. Sigue la guía paso a paso en nuestra Guía de inicio rápido para configurar tu NVIDIA Jetson para la implementación de YOLO11.

¿Cuál es el beneficio de usar TensorRT con YOLO11 en NVIDIA Jetson?

El uso de TensorRT con YOLO11 optimiza el modelo para la inferencia, lo que reduce significativamente la latencia y mejora el rendimiento en los dispositivos NVIDIA Jetson. TensorRT proporciona una inferencia de aprendizaje profundo de alto rendimiento y baja latencia a través de la fusión de capas, la calibración de precisión y el ajuste automático del kernel. Esto conduce a una ejecución más rápida y eficiente, particularmente útil para aplicaciones en tiempo real como el análisis de video y las máquinas autónomas.

¿Puedo ejecutar Ultralytics YOLO11 con DeepStream SDK en diferentes hardware NVIDIA Jetson?

Sí, la guía para implementar Ultralytics YOLO11 con el DeepStream SDK y TensorRT es compatible con toda la línea NVIDIA Jetson. Esto incluye dispositivos como el Jetson Orin NX 16GB con JetPack 5.1.3 y el Jetson Nano 4GB con JetPack 4.6.4. Consulte la sección Configuración de DeepStream para YOLO11 para obtener pasos detallados.

¿Cómo puedo convertir un modelo YOLO11 a ONNX para DeepStream?

Para convertir un modelo YOLO11 al formato ONNX para su despliegue con DeepStream, utiliza el utils/export_yolo11.py script del DeepStream-Yolo repositorio.

Aquí tiene un comando de ejemplo:

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

Para obtener más detalles sobre la conversión de modelos, consulta nuestra sección de exportación de modelos.

¿Cuáles son los puntos de referencia de rendimiento para YOLO en NVIDIA Jetson Orin NX?

El rendimiento de los modelos YOLO11 en NVIDIA Jetson Orin NX 16GB varía según los niveles de precisión de TensorRT. Por ejemplo, los modelos YOLO11s alcanzan:

  • Precisión FP32: 14.6 ms/im, 68.5 FPS
  • Precisión FP16: 7.94 ms/im, 126 FPS
  • Precisión INT8: 5.95 ms/im, 168 FPS

Estos puntos de referencia subrayan la eficiencia y la capacidad de utilizar modelos YOLO11 optimizados para TensorRT en hardware NVIDIA Jetson. Para obtener más detalles, consulte nuestra sección de Resultados de referencia.



📅 Creado hace 1 año ✏️ Actualizado hace 2 meses

Comentarios