github: egbertYeah/yolox_deepstream (github.com)

0. 目标检测算法YoloX

YoloX是旷视科技于2021年提出的目标检测算法,本文主要介绍YoloX在deepstream环境下如何推理部署,对于算法的改进点以及性能不进行过多的分析。

paper: YOLOX: Exceeding YOLO Series in 2021

code:Yolox

1. 测试环境

该项目是在Jetson Nano的Jetpack 4.6上采用Deepstream6.0镜像测试,因此训练部署时,只需要满足以下的版本要求应该即可:

  • tensorrt >=7.2
  • Deepstream >= 5.0
  • Pytorch-YoloX训练测试的requirements

2. 转ONNX模型

在YoloX的项目中提供了export_onnx.py脚本用于到处ONNX模型,具体转换过程可参考对应的Redame。

导出ONNX模型之后,可使用netron工具查看ONNX模型的网络结构。主要需要注意输入与输出是否正确。

默认情况下,输入的name应该是"images",维度应该是[1, 3, 640, 640],输出的name应该是"output",维度应该是[1, 8400, 85]。

解释一下,这些数字的含义,在输入中: 1表示batch-size,3表示输入图像的通道数,640和640表示网络输入的大小;而在输出中:1表示的是batch-size的大小,8400表示的是预测框的个数,85等于80+4+1,其中80表示数据集的类别数,4表示预测框的位置信息,1表示该预测框是前景还是背景。

3. 生成tensorrt的engine文件

在第2步中,我们得到了onnx模型,第3步是如何生成tensorrt的engine文件用来推理。

在介绍如何转engine之前,需要重点说一下YoloX项目的分支问题,现有的YoloX项目中包含两个分支,一个分支是main另一个分支是0.1.1rc0, 这两个分支在图像预处理上有些许的差别【血盆大坑】,具体差异如下:

首先是main分支的yolox.cpp的代码

然后是0.1.1rc0分支的yolox.cpp的代码

不知道大家有没有看出这两个函数之间的差异,先回顾一下,Yolo系列目标检测算法图像预处理的过程,我画了一个图描述的大致过程

通过对比,我们可以知道在main版本中的图像归一化过程并没有进行像素值归一化和像数值标准化这两步,这个非常重要,也非常坑【这一步主要是对deep stream在部署上有很大的影响】。


现在大家明确自己采用的是哪个版本的Yolox,然后我们接下来看看如何将ONNX文件转成engine。本文提供三种方式转换engine文件

3.1 使用torch2trt工具转换engine

这种方式是Yolox项目中提供说明的,具体可以参考readme.

3.2 使用trtexec工具转换engine

trtexec工具是TensorRT中自带的一个转换engine的工具,具体介绍可参考链接。然后我这里给出我使用的命令:

trtexec --onnx="path to onnx file" --fp16 --workspace=10240 --saveEngine="path to engine save"

3.3 使用onnx-tensorrt工具转换engine

onnx-tensorrt项目是一个常用onnx转engine的工具,具体如何编译安装以及使用请参考这个项目的readme。

4. deepstream部署

之前有写过deepstream SDK中自带Yolov3的分析,有兴趣可以看看了解Yolo系列网络如何在deepstream进行部署。Deepstream的Yolov3使用流程(JetPack4.4环境下)

YoloX在deep stream上部署主要是编写一个后处理插件,如同Yolov3中的 nvdsinfer_custom_impl_Yolo一样,具体我们可以仿造Yolov3的和Yolox项目中tensorrt的C++推理代码Yolox.cpp文件。哈哈哈,我已经完成了这部分的修改,具体代码请查看GitHub。

既然代码有了,就说明一下如何使用和一些细节信息把!!!

首先,第一步是编译nvdsinfer_custom_impl_YoloX文件夹下的插件生成so动态库。这里面有几处需要修改的地方:

#define NMS_THRESH 0.45        // NMS的阈值
#define BBOX_CONF_THRESH 0.3    // 分类置信度的阈值
static const int NUM_CLASSES = 1;    // 数据集中的类别数static const int INPUT_W = 640;    // 网络输入的宽高
static const int INPUT_H = 640;
static const int IMAGE_W = 2048;    // 这个宽高需要与streammux插件设置的宽高相同(重点)
static const int IMAGE_H = 3072;const char* INPUT_BLOB_NAME = "images";// engine input和output的name与onnx文件相同
const char* OUTPUT_BLOB_NAME = "output";

重点需要验证的属性包括:NUM_CLASSES,IMAGE_W, IMAGE_H, 以及 INPUT_BLOB_NAME和OUTPUT_BLOB_NAME。

通过上面修改之后,make得到so动态链接库。

第二步,是修改config_infer_primary.txt文件,内容如下

[property]
gpu-id=0

  • 这里需要重点说一下,如果你采用的是main版本的,一定要将net-scale-factor设置为1,而如果你采用另一个版本需要采用net-scale-factor=0.0039215697906911373。【这个就是图像预处理过程中是否做没做像素值归一化和标准化的区别,也是之前强调的】

# net-scale-factor=0.0039215697906911373
net-scale-factor=1
# 0:RGB 1:BGR
model-color-format=0

  • engine的路径

model-engine-file=yolox_s_loulan.trt

  • 与数据集类别对应的label文件和类别数

labelfile-path=labels.txt
num-detected-classes=1

batch-size=1
interval=0
gie-unique-id=1

# primary 
process-mode=1

# Detector
network-type=0

# FP16
network-mode=2

# 0:Group Rectange 1:DBSCAN 2:NMS 3:DBSCAN+NMS 4:None
cluster-mode=4

  • maintain-aspect-ratio表示resize过程是否保存输入宽高比

maintain-aspect-ratio=1
scaling-filter=1
scaling-compute-hw=0

  • 这个需要指定后处理的so动态库路径,以及后处理的函数接口

parse-bbox-func-name=NvDsInferParseCustomYolox
custom-lib-path=nvdsinfer_custom_impl_yolox/libnvdsinfer_custom_impl_yolox.so

[class-attrs-all]
pre-cluster-threshold=0.3

第三步,是修改deepstream_app_config.txt的配置信息,主要修改的是如下几部分:

[source0]
enable=1# 1:camera(v4l2) 2: single uri 3:multi uri 4:rtsp 5 camera(CSI) only for Jetson
type=2
uri=file://./sample_1080p_h264.mp4
num-sources=1
gpu-id=0
cudadec-memtype=0
select-rtp-protocol=4

使用uri参数指定需要推理的视频文件路径

[streammux]
gpu-id=0
live-source=0
batch-size=1
batched-push-timeout=40000
width=2048
height=3072
enable-padding=1
nvbuf-memory-type=0

重点需要修改width和height参数,在这里设置的width和height需要与后处理插件代码中的IMAGE_W, IMAGE_H大小对应。

最后,采用如下的命令进行推理

deepstream-app -c deepstream_app_config.txt

至此,我们完成的YoloX在deep stream上的推理,撒花!!!!

【Deepstream之YoloX部署】相关推荐

  1. Transfer Learning Toolkit (TLT) + DeepStream (DS)快速部署深度学习模型(以口罩检测为例)

    文章目录 简介 TLT DS 基于TLT进行迁移学习 环境准备 模型训练 基于DS的模型部署 总结 最近在做一个深度学习的横向,被实时性搞的很头疼,遂打算研究研究新的技术路线,做点技术储备.TLT+D ...

  2. YOLOX部署优化训练

    用给一个小不知名小板卡部署一下 不过这里用python 就当个玩具吧 YOLOX将近两年来目标检测领域的各个角度的优秀进展与YOLO进行了巧妙地集成组合并且重回Anchor Free的怀抱.本文详细的 ...

  3. [深度文]YoloX部署、优化、训练相关

    来自  叶润源 链接  https://www.yuque.com/yerunyuan/ar9831/tsm0id#Kfi4w YOLOX的Anchor Free(Anchor Based针对数据集聚 ...

  4. Tensorrt下的Yolox部署

    这里写目录标题 一.Ubuntu系统的安装与显卡驱动安装 二.Tensorrt的安装 三.YOLOX的安装 四. torch2trt的安装 五.engine文件的准备 根据设备修改源文件 引擎生成 六 ...

  5. 使用TensorRT加速YOLOX目标检测算法

    文章目录 源码下载 一.整体实现方法 1.部署流程 2.TensorRT的安装 3.onnx文件的导出 4.tensorrt引擎文件的生成 5.tensorrt部署网络 (1)初始化tensorrt ...

  6. NVIDIA DeepStream5.0官方总结(改动版)

    一.DeepStream综述 DeepStream是一个视频流分析工具包,用于构建AI驱动的应用程序.它以USB / CSI摄像机流数据作为输入,视频来自文件视频或基于RTSP的流,并使用AI和计算机 ...

  7. 我参加第七届NVIDIA Sky Hackathon——训练CV模型

    如何从0开始训练自己的CV模型 第一步 配置基本环境(在上一篇已经配置了我参加第七届NVIDIA Sky Hackathon--训练ASR模型 ) 第二步 利用labelimg制作图像数据集 第三步 ...

  8. Jetson TX2上配置archiconda、Yolov5、tensorrtx环境问题记录

    文章目录 前言 本文主要记录在Jetson TX2上配置archiconda.Yolov5.tensorrtx环境中遇到的问题以及解决方法.以及一些包的分享. 一.Jetson TX2刷机 二.安装a ...

  9. 机器学习笔记 - YOLO家族简介

    一.背景概述 目标检测是计算机视觉中最重要的课题之一.大多数计算机视觉问题都涉及检测视觉对象类别,如行人.汽车.公共汽车.人脸等.这一领域不仅限于学术界,而且在视频监控.医疗保健.车载传感和自动驾驶. ...

最新文章

  1. 学完javase和mysql_Java基础学完接下来应该学什么呢?
  2. 关于TensorFlow报错ModuleNotFoundError: No module named ‘imutils‘
  3. golang reflect Pointer 获取 传入的interface信息
  4. 初等数论--整除--判断一个数是否是素数
  5. 1、MySQL存储过程是什么?
  6. stm32之RCC寄存器学习
  7. 垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)
  8. nokia n1 android 6,诺基亚推Nokia N1拥抱安卓,微软该怎么想?
  9. Mac中安装NetBeans方法
  10. 实现Android的消息通知栏
  11. IDEA 访问Maven私服与上传组件
  12. [leetcode]5169. 日期之间隔几天
  13. 浅谈算法和数据结构: 十二 无向图相关算法基础
  14. FileSplit.exe
  15. 基于Cassandra的分布式存储数据一致性算法研究
  16. Ubuntu系统查看显卡型号
  17. 直角三角形面积Java_怎么用Java计算三角形的周长和面积
  18. python挂机脚本怎么运行,Python实现自动挂机脚本(基础篇)
  19. canvas内的字体实现阴影效果
  20. winform 如何让 comboBox1 不能输入,只能下拉选择

热门文章

  1. Manjaro Linux21三种界面截图gnome,kde,xfce
  2. OpenCV中的 Gui特性-把鼠标作为画笔
  3. bdp mysql支持_bdp个人版到底是什么神器?
  4. flask_socketio
  5. 解决小米Note adb调试无法发现设备
  6. 模拟实现memmove
  7. 计算机组装接线口诀,2016年机电一级建造师_一、三章案例 口诀
  8. apache 设置允许跨域
  9. Arcgis for js,Openlayers中加载GeoJSON
  10. 练习-Java循环之嵌套循环之比赛名单判断