Deepstream6.0-python 入门 - Yolov5客制化

Deepstream6.0-python 入门 - Yolov5客制化

前言

中文网上关于deepstream-python api 的文章实在太少了,因此想力所能及分享一点踩过的坑和经验。

预备

  • deepstream 官方python项目
  • tensorrtx for yolo
  • 示例代码
    官方的python项目需要进行一定的编译-绑定操作,详细的步骤以后有空会补上。
    由于deepstream是英伟达家的,所以对自己的TensorRT引擎有很好的支持。以后有空也会写关于TensorRT的相关文章。

结构

官方其实在SDK的sources/objectDetector_Yolo目录下是有yolo的示例的,但是由于其都是v3,v4版本的,v5需要我们自己去下载权重并序列化。官方的cpp示例其实很清楚了,一个客制化的应用结构应该如下:

  1. 主程序。官方的deepstream-app其实是编译后的可执行,其cpp源代码可以在sources/apps/sample_apps/deepstream-app中找到。而官方运行的deepstream_app_config_yolo*.txt其实是告诉deepstream-app:我的管道长啥样怎么连。由于咱们要自己写python脚本,所以并不需要这个管道配置文件了(自食其力)。

  2. 引擎/推理器配置文件。在创建nvinfer管道组件后,需要指定对应的配置文件。对于yolo来说,由于其预处理、类别都没变,所以基本不需要啥变动(如果你是用自己的数据集训练的,需要更改对应的类别数和标签文件)。本文不讨论INT8量化。

  3. 标签文件。略。

  4. nvdsinfer_custom_impl_Yolo。
    如果你是提前训练好的TensorRT引擎,那么核心文件只需要nvdsparsebbox_Yolo.cpp和他相关依赖就行了。
    nvdsparsebbox_Yolo.cpp deepstream 是基于Gstreamer开发的应用,因此遵循Gstreamer的流程。视频以buffer的形式进入引擎进行推理,随后以buffer的形式向下传去。那么不同的模型不同的引擎(甚至同一个模型不同的引擎)都有不同的输出层,而这个程序/库就是告诉pipeline怎么解析这个buffer的。以tensorrtx生成的yolov5为例,由它推理出的buffer只有一层,第一个数据output[0]为整个层所包含的数据量,而后的数据遵循4个坐标-置信度-标签的格式。GitHub上大多数deepstream-YoloV5的cpp还采用了nms来处理数据。

  5. 引擎文件和生成引擎时带的动态链接库。这个库的作用是解析引擎输出结果并进行筛选。

使用步骤

在预备完成后。

  1. 编译nvdsinfer_custom_impl_Yolo生成动态链接库。
  2. 检查/修改配置文件中的路径。
  3. 通过LD_PRELOAD来预加载动态连接库或者在代码中用ctypes.cdll.LoadLibrary
  4. 运行程序。

运行

你可能感兴趣的:(Deepstream笔记,python,计算机视觉)