目录
0.前言
1.Yolov5模型
1.1模型生成
1.2模型转换
1.2.1 yolov5模型转换为onnx
1.2.2 onnx模型转换为engine
2.deepstream介绍
2.1简介
2.2安装
2.2.1 dGpu
2.2.2 Jetson
2.3使用方法
3.Yolov5模型在deepstream6.1.1上应用
3.1Yolov5输出与deepstream对接
3.1.1yolov5输出格式介绍
3.1.2deepstream输入格式介绍
3.2Gstreamer管道设计
3.2.1DeepStreamSDK关键插件介绍
3.2.2参考管道例子
3.2.3管道设计
0.前言
阅读此文章,您需要对以下技术有一定的了解:
Yolov5
Gstreamer
Deepstream6.1.1
1.Yolov5模型
1.1模型生成
参考yolov5官方文档
GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite
1.2模型转换
1.2.1 yolov5模型转换为onnx
python detect.py --weights yolov5s.onnx
详细参考TFLite, ONNX, CoreML, TensorRT Export · Issue #251 · ultralytics/yolov5 · GitHub
1.2.2 onnx模型转换为engine
./trtexec --onnx=<onnx_file> \ #指定onnx模型文件
--explicitBatch \ #在构建引擎时使用显式批大小(默认=隐式)显示批处理
--saveEngine=<tensorRT_engine_file> \#输出engine
--workspace=<size_in_megabytes> \#设置工作空间大小单位是MB(默认为16MB)
--fp16 #除了fp32之外,还启用fp16精度(默认=禁用)
2.deepstream介绍
2.1简介
NVIDIA Deepstream SDK是一个通用的流分析框架,可以让你从各个传感器中构建你自己的应用。它实际上是一个建立在GStreamer之上的SDK,GStreamer是一个开源的多媒体分析框架。NVIDIA将Deepstream作为SDK,旨在加速流视频分析所需的完整堆栈。它是一个模块化的SDK,允许开发人员为智能视频分析(IVA)构建一个高效的管道。您在这里看到的是一个典型的IVA管道,由Deepstream插件构建,它支持插件使用的底层硬件、管道的每个功能,并利用硬件体系结构移动数据,而无需任何内存拷贝。
DeepStream 的对象检测和分割模型提供广泛的 AI 模型支持,例如最先进的 SSD、YOLO、FasterRCNN 和 MaskRCNN。
DeepStream SDK 可以成为许多视频分析解决方案的基础层,例如了解智慧城市中的交通和行人、医院中的健康和安全监控、零售中的自助结账和分析、制造工厂中的组件缺陷检测等。
2.2安装
2.2.1 dGpu
官方安装文章:
Quickstart Guide — DeepStream 6.1.1 Release documentation
注意:安装顺序为ubuntu20.04->driver->cuda->tensorrt->deepstream
2.2.2 Jetson
官方安装文章:
Quickstart Guide — DeepStream 6.1.1 Release documentation
注意:建议使用SDKManager安装
2.3使用方法
DeepStream SDK支持使用 C/C++ 和 Python 开发应用程序。为了更容易上手,DeepStream 附带了几个 C/C++ 和 Python 中的参考应用程序。请参阅C/C++ 示例应用程序源详细信息和Python 示例应用程序源详细信息部分,以了解有关可用应用程序的更多信息。有关一些示例 DeepStream 参考应用程序,请参阅NVIDIA-AI-IOT Github 页面。
3.Yolov5模型在deepstream6.1.1上应用
3.1Yolov5输出与deepstream结合
deepstream提供了自定义动态库参数,用于解析各类模型的输出,统一格式化到deepstream的输入上,deepstream内部仅支持到yolov3,yolov5需要自己写动态库,建议在下面例子上修改。
参考例子https://github.com/marcoslucianops/DeepStream-Yolo
3.1.1yolov5输出格式介绍
转载:目标检测 YOLOv5 - YOLOv5的后处理_西西弗Sisyphus的博客-CSDN博客_yolov5后处理
3.1.2deepstream输入格式介绍
3.1.2.1 deepstream输入为NvDsInferParseObjectInfo的数组
std::vector<NvDsInferParseObjectInfo> objectList;
3.1.2.2 NvDsInferParseObjectInfo结构体介绍
typedef struct
{
/** Holds the ID of the class to which the object belongs. */
unsigned int classId;
/** Holds the horizontal offset of the bounding box shape for the object. */
float left;
/** Holds the vertical offset of the object's bounding box. */
float top;
/** Holds the width of the object's bounding box. */
float width;
/** Holds the height of the object's bounding box. */
float height;
/** Holds the object detection confidence level; must in the range
[0.0,1.0]. */
float detectionConfidence;
} NvDsInferObjectDetectionInfo;
3.1.3 NvDsInferObjectDetectionInfo拓展
Yolov5有的模型输出更多的参数,比如人脸的关键点(5个关键点信息),则需要修改NvDsInferObjectDetectionInfo结构体,增加相应的字段。
修改deepstream代码,将自定义信息添加Gst-Buffer里面的metadata里面,重新编译deepstream相应的模块。
nvinfer推理的pad里面提取metadata,参考例子deepstream_python_apps/apps/deepstream-test1 at master · NVIDIA-AI-IOT/deepstream_python_apps · GitHub
3.2Gstreamer管道设计
3.2.1DeepStreamSDK关键插件介绍
3.2.1.1 NvStreamMux
3.2.1.2 NvStreamDemux
3.2.1.3 nvInfer
3.2.1.4 nvTracker
3.2.1.5 nvdsOsd
3.2.1.6 典型使用
nvStreamMux->nvinfer->nvtrack->nvdsosd->nvStreamDemux
3.2.2参考管道例子
结合实际项目,项目中需要动态添加,删除视频源,参考了官方的动态增加和删除源的例子
https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/master/apps/runtime_source_add_delete
deepstream_python_apps/apps/deepstream-demux-multi-in-multi-out at master · NVIDIA-AI-IOT/deepstream_python_apps · GitHub
3.2.3管道设计
为满足项目实际应用,满足动态添加,删除等需求,将管道设计分为三部分:
Base管道:包含推理、跟踪、osd画框等
输入管道:多种格式视频输入,硬件解码,支持动态添加删除
推流管道:包含编码,混流,封装,推流,支持动态添加删除
3.2.3.1 Base管道
nvStreamMux->nvinfer->nvtrack->nvosd->nvStreamDemux
3.2.3.2视频源添加、删除
视频源输入采用uridecodebin,uridecodebin支持多种视频源,包括rtsp,rtmp,flv,视频文件等
uridecodebin与nvstreammux链接采用gstreamer里面的link,断开链接采用unlink。
3.2.3.3视频推流添加、删除
推流管道(bin)设计:
queue->nvvideoconvert->nvdsosd->nvvideoconvert->nvv4l2h264enc->h264parse->mpegtsmux->rtpmp2tpay->udpsink
推流的动态添加、删除:
nvstreamdemux与推流的bin采用gstreamer里面的link进行链接,unlink断开链接。