YOLOV5在deepstream6.1.1上应用

目录

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模型文件

        --explicitBatch \   #在构建引擎时使用显式批大小(默认=隐式)显示批处理

        --saveEngine= \#输出engine

        --workspace= \#设置工作空间大小单位是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后处理

YOLOV5在deepstream6.1.1上应用_第1张图片

3.1.2deepstream输入格式介绍

3.1.2.1 deepstream输入为NvDsInferParseObjectInfo的数组

std::vector 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

YOLOV5在deepstream6.1.1上应用_第2张图片

3.2.1.2 NvStreamDemux

YOLOV5在deepstream6.1.1上应用_第3张图片

3.2.1.3 nvInfer

YOLOV5在deepstream6.1.1上应用_第4张图片

3.2.1.4 nvTracker

YOLOV5在deepstream6.1.1上应用_第5张图片

3.2.1.5 nvdsOsd

YOLOV5在deepstream6.1.1上应用_第6张图片

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断开链接。

你可能感兴趣的:(人工智能,深度学习,神经网络,deepstream)