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示例其实很清楚了,一个客制化的应用结构应该如下:
- 主程序。官方的
deepstream-app
其实是编译后的可执行,其cpp源代码可以在sources/apps/sample_apps/deepstream-app
中找到。而官方运行的deepstream_app_config_yolo*.txt
其实是告诉deepstream-app
:我的管道长啥样怎么连。由于咱们要自己写python脚本,所以并不需要这个管道配置文件了(自食其力)。 - 引擎/推理器配置文件。在创建
nvinfer
管道组件后,需要指定对应的配置文件。对于yolo来说,由于其预处理、类别都没变,所以基本不需要啥变动(如果你是用自己的数据集训练的,需要更改对应的类别数和标签文件)。本文不讨论INT8量化。 - 标签文件。略。
- 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来处理数据。 - 引擎文件和生成引擎时带的动态链接库。这个库的作用是解析引擎输出结果并进行筛选。
使用步骤
在预备完成后。
- 编译
nvdsinfer_custom_impl_Yolo
生成动态链接库。 - 检查/修改配置文件中的路径。
- 通过
LD_PRELOAD
来预加载动态连接库或者在代码中用ctypes.cdll.LoadLibrary
。 - 运行程序。
运行