Jetson Linux API 参考文档

32.7.4 版本
04_video_dec_trt (TensorRT 视频解码)

概述

本示例演示了使用 NVIDIA® TensorRT 解码视频并将边界框信息保存到 result.txt 文件的最简单方法。TensorRT 以前被称为 GPU 推理引擎 (GIE)。

本示例不需要摄像头或显示器。


构建和运行

前提条件

  • 您已按照 构建和运行 中的步骤 1-3 进行操作。
  • 您已安装以下组件
    • NVIDIA® CUDA®
    • TensorRT (以前称为 GPU 推理引擎 (GIE))
    • OpenCV

安装 TensorRT

  1. 在文本编辑器中打开 apt 源配置文件
      $ sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
    
  2. 在下面显示的 deb 命令中更改存储库名称和下载 URL

      deb https://repo.download.nvidia.com/jetson/common <release> main
      deb https://repo.download.nvidia.com/jetson/<platform> <release> main
    

    <release> 是版本号。例如:r32.5。

    <platform> 标识平台的处理器。

    • t194 用于 Jetson AGX Xavier 系列或 Jetson Xavier NX
    • t186 用于 Jetson TX2 系列
    • t210 用于 Jetson Nano 或 Jetson TX1
  3. 输入
      $ sudo apt-get update
      $ sudo apt-get install tensorrt
    

构建

  • 输入
     $ cd /usr/src/jetson_multimedia_api/samples/04_video_dec_trt
     $ make
    

运行

  • 输入
     $ ./video_dec_trt [Channel-num] <in-file1> <in-file2> ... <in-format> [options]
    

示例

以下示例生成两个结果:result0.txtresult1.txt。结果包含检测到的对象的归一化矩形坐标。

   $ ./video_dec_trt 2 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 \
     ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 \
     --trt-onnxmodel ../../data/Model/resnet10/resnet10_dynamic_batch.onnx \
     --trt-mode 0

注意事项

  • 在运行性能测试之前提升时钟频率。
     $ sudo ~/jetson_clocks.sh
    
  • 要更改批大小,请使用 Channel-num 选项。
  • 有关打开超过 16 个视频设备的信息,请参阅以下 NVIDIA® DevTalk 主题

    https://devtalk.nvidia.com/default/topic/1025375/

  • 如果模式或任何其他参数已更改,请运行以下命令。
     $ rm trtModel.cache
    
  • 日志显示具有以下语法的性能结果
     Inference Performance(ms per batch):xx  Wait from decode takes(ms per batch):xx
    
  • 要验证结果并缩放矩形参数,请输入以下命令
    $ cp result*.txt /usr/src/jetson_multimedia_api/samples/02_video_dec_cuda
    $ cd /usr/src/jetson_multimedia_api/samples/02_video_dec_cuda
    $ ./video_dec_cuda ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --bbox-file result0.txt
    $ ./video_dec_cuda ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --bbox-file result1.txt
    


流程

数据管道如下

Input video file -> Decoder -> VIC -> TensorRT Inference -> Plain text file with Bounding Box info

操作流程

本示例执行以下操作

  1. 编码输入视频流。
  2. 执行单通道视频解码 VIC,它执行以下操作
    • 将缓冲区布局从块线性转换为 pitch 线性。
    • 将图像分辨率缩放到 TensorRT 需要的分辨率。
  3. 使用 TensorRT 执行对象识别,并将边界框添加到原始帧中识别的对象。
  4. 将图像从 YUV 转换为 RGB 格式,并将其保存在文件中。

以下框图显示了视频解码器管道以及不同引擎之间的内存共享。此内存共享也适用于其他 L4T 多媒体示例。


关键结构和类

本示例使用以下关键结构和类

全局结构 context_t 管理应用程序中的所有资源。

元素描述
NvVideoDecoder 包含所有与视频解码相关的元素和函数。
NvVideoConverter 包含用于视频格式转换的元素和函数。
EGLDisplay指定用于 CUDA 处理的 EGLImage。
conv_output_plane_buf_queue指定用于视频转换的输出平面队列。
TRT_Context 指定用于加载 ONNXmodel/Caffemodel 和执行推理的接口。

关键线程

成员描述
decCaptureLoop从 dec 捕获平面获取缓冲区并推送到转换器,并处理分辨率更改。
Conv outputPlane dqThread将从转换器输出平面出队的缓冲区返回到解码器捕获平面。
Conv captuerPlane dqThread从 conv 捕获平面获取缓冲区并推送到 TensorRT 缓冲区队列。
trtThread指定 CUDA 进程和推理特性。

编程注意事项

要显示和验证结果并缩放矩形参数,请按如下方式使用 02_video_dec_cuda 示例

   $ ./video_dec_cuda <in-file> <in-format> --bbox-file result.txt

本示例执行以下操作

  • 将生成的归一化矩形保存在 [0,1] 范围内。
  • 支持流内分辨率更改。
  • 使用默认文件

     resnet10_dynamic_batch.onnx
    

    在此目录中

    $SDKDIR/data/Model/resnet10
    
  • 执行流结束 (EOS) 处理,如下所示

    a. 完全读取文件。

    b. 将空 v4l2buf 推送到解码器。

    c. 等待所有输出平面缓冲区返回。

    d. 设置 get_eos

      decCap thread exit
    

    e. 结束 TensorRT 线程。

    f. 将 EOS 发送到转换器

       conv output plane dqThread callback return false
       conv output plane dqThread exit
       conv capture plane dqThread callback return false
       conv capture plane dqThread exit
    

    g. 删除解码器

      deinit output plane and capture plane buffers
    

    h. 删除转换器

       unmap capture plane buffers
    

命令行选项

./video_dec_trt [Channel-num] <in-file1> <in-file2> ... <in-format> [选项]

选项描述
--trt-onnxmodel设置 ONNX 模型文件名。
--trt-deployfile设置部署文件名。(将要被弃用,因为 TensorRT 正在弃用 Caffe 解析器)
--trt-modelfile设置模型文件名。(将要被弃用,因为 TensorRT 正在弃用 Caffe 解析器)
--trt-mode <int>指定是否使用 float16 [0-2],其中 <int> 是以下之一
  • 0 float16
  • 1 float32
  • 2 int8
--trt-enable-perf启用性能测量。
. All rights reserved.