Salta para o conteúdo

Ultralytics YOLOv8 no NVIDIA Jetson usando DeepStream SDK e TensorRT

Este guia abrangente fornece um passo a passo detalhado para implantar Ultralytics YOLOv8 em dispositivos NVIDIA Jetson usando DeepStream SDK e TensorRT. Aqui usamos TensorRT para maximizar o desempenho da inferência na plataforma Jetson.

DeepStream em NVIDIA Jetson

Nota

Este guia foi testado tanto com o Seeed Studio reComputer J4012, que é baseado no NVIDIA Jetson Orin NX 16GB executando a versão JetPack do JP5.1.3, quanto com o Seeed Studio reComputer J1020 v2, que é baseado no NVIDIA Jetson Nano 4GB executando a versão JetPack do JP4.6.4. Espera-se que funcione em toda a linha de hardware NVIDIA Jetson, incluindo o mais recente e o legado.

O que é NVIDIA DeepStream?

O DeepStream SDK da NVIDIA é um kit de ferramentas completo de análise de streaming baseado no GStreamer para processamento multissensor baseado em AI, vídeo, áudio e compreensão de imagem. É ideal para desenvolvedores de AI de visão, parceiros de software, startups e OEMs que criam aplicativos e serviços de IVA (Intelligent Video Analytics). Agora podes criar pipelines de processamento de fluxo que incorporam redes neurais e outras tarefas de processamento complexas, como rastreio, codificação/decodificação de vídeo e renderização de vídeo. Esses pipelines permitem análises em tempo real de dados de vídeo, imagens e sensores. O suporte multiplataforma do DeepStream oferece uma maneira mais rápida e fácil de desenvolver aplicativos e serviços de IA de visão no local, na borda e na nuvem.

Pré-requisitos

Antes de começar a seguir este guia:

Dica

Neste guia, usamos o método do pacote Debian para instalar o DeepStream SDK no dispositivo Jetson. Também podes visitar a página DeepStream SDK on Jetson (Archived) para aceder a versões antigas do DeepStream.

Configuração DeepStream para YOLOv8

Aqui estamos a utilizar o repositório marcoslucianops/DeepStream-Yolo GitHub que inclui o suporte NVIDIA DeepStream SDK para modelos YOLO . Agradecemos os esforços de marcoslucianops pelas suas contribuições!

  1. Instalar dependências

    pip install cmake
    pip install onnxsim
    
  2. Clone o seguinte repositório

    git clone https://github.com/marcoslucianops/DeepStream-Yolo
    cd DeepStream-Yolo
    
  3. Descarrega Ultralytics YOLOv8 modelo de deteção (.pt) à tua escolha a partir das versõesYOLOv8 . Aqui utilizamos yolov8s.pt.

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

    Nota

    Também podes utilizar um modelo YOLOv8 personalizado e treinado.

  4. Converter modelo em ONNX

    python3 utils/export_yoloV8.py -w yolov8s.pt
    

    Passe os argumentos abaixo para o comando acima

    Para DeepStream 6.0.1, use opset 12 ou inferior. O opset padrão é 16.

    --opset 12
    

    Para alterar o tamanho da inferência (padrão: 640)

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

    Exemplo para 1280:

    -s 1280
    or
    -s 1280 1280
    

    Para simplificar o ONNX modelo (DeepStream >= 6,0)

    --simplify
    

    Para usar tamanho de lote dinâmico (DeepStream >= 6.1)

    --dynamic
    

    Para usar tamanho de lote estático (exemplo para tamanho de lote = 4)

    --batch 4
    
  5. Defina a versão CUDA de acordo com a versão do JetPack instalada

    Para JetPack 4.6.4:

    export CUDA_VER=10.2
    

    Para JetPack 5.1.3:

    export CUDA_VER=11.4
    
  6. Compilar a biblioteca

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  7. Edite o config_infer_primary_yoloV8.txt arquivo de acordo com seu modelo (por YOLOv8s com 80 aulas)

    [property]
    ...
    onnx-file=yolov8s.onnx
    ...
    num-detected-classes=80
    ...
    
  8. Edite o deepstream_app_config ficheiro

    ...
    [primary-gie]
    ...
    config-file=config_infer_primary_yoloV8.txt
    
  9. Você também pode alterar a fonte de vídeo em deepstream_app_config arquivo. Aqui um arquivo de vídeo padrão é carregado

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

Executar inferência

deepstream-app -c deepstream_app_config.txt

Nota

Levará muito tempo para gerar o TensorRT arquivo do mecanismo antes de iniciar a inferência. Então, por favor, seja paciente.

YOLOv8 com deepstream

Dica

Se você deseja converter o modelo para precisão FP16, basta definir model-engine-file=model_b1_gpu0_fp16.engine e network-mode=2 dentro config_infer_primary_yoloV8.txt

Calibração INT8

Se quiseres utilizar a precisão INT8 para a inferência, tens de seguir os passos seguintes

  1. Definir OPENCV variável de ambiente

    export OPENCV=1
    
  2. Compilar a biblioteca

    make -C nvdsinfer_custom_impl_Yolo clean && make -C nvdsinfer_custom_impl_Yolo
    
  3. Para o conjunto de dados COCO, descarrega o val2017, extrai e passa para DeepStream-Yolo pasta

  4. Crie um novo diretório para imagens de calibração

    mkdir calibration
    
  5. Execute o seguinte para selecionar 1000 imagens aleatórias do conjunto de dados COCO para executar a calibração

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

    Nota

    A NVIDIA recomenda pelo menos 500 imagens para obteres uma boa precisão. Neste exemplo, escolheste 1000 imagens para obteres uma melhor precisão (mais imagens = mais precisão). Podes definir a partir de head -1000. Por exemplo, para 2000 imagens, coloca a cabeça -2000. Este processo pode demorar muito tempo.

  6. Crie o calibration.txt arquivo com todas as imagens selecionadas

    realpath calibration/*jpg > calibration.txt
    
  7. Definir variáveis de ambiente

    export INT8_CALIB_IMG_PATH=calibration.txt
    export INT8_CALIB_BATCH_SIZE=1
    

    Nota

    Valores mais altos de INT8_CALIB_BATCH_SIZE resultarão em mais precisão e velocidade de calibração mais rápida. Configure-o de acordo com a memória da sua GPU.

  8. Atualize o config_infer_primary_yoloV8.txt ficheiro

    De

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

    Para

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

Executar inferência

deepstream-app -c deepstream_app_config.txt

Configuração MultiStream

Para configurar vários streams em um único aplicativo deepstream, você pode fazer as seguintes alterações no arquivo deepstream_app_config.txt ficheiro

  1. Altere as linhas e colunas para construir uma exibição em grade de acordo com o número de fluxos que você deseja ter. Por exemplo, para 4 fluxos, podemos adicionar 2 linhas e 2 colunas.

    [tiled-display]
    rows=2
    columns=2
    
  2. Definir num-sources=4 e adicione uri de todos os 4 fluxos

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

Executar inferência

deepstream-app -c deepstream_app_config.txt
Configuração de fluxo múltiplo

Resultados de referência

A tabela a seguir resume como YOLOv8s modelos funcionam em diferentes TensorRT níveis de precisão com um tamanho de entrada de 640x640 em NVIDIA Jetson Orin NX 16GB.

Nome do modelo Precisão Tempo de inferência (ms/im) FPS
YOLOv8s FP32 15.63 64
FP16 7.94 126
INT8 5.53 181

Reconhecimentos

Este guia foi criado inicialmente por nossos amigos do Seeed Studio, Lakshantha e Elaine.



Criado em 2024-07-01, Atualizado em 2024-07-01
Autores: lakshanthad (1)

Comentários