赞
踩
中文网上关于deepstream-python api 的文章实在太少了,因此想力所能及分享一点踩过的坑和经验。
官方其实在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
。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。