英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用

英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用

运行环境
硬件设备:

$ deepstream-app --version-all
deepstream-app version 5.0.0
DeepStreamSDK 5.0.0
CUDA Driver Version: 10.2
CUDA Runtime Version: 10.2
TensorRT Version: 7.1
cuDNN Version: 8.0
libNVWarp360 Version: 2.0.1d3

参考:
https://github.com/NVIDIA-AI-IOT/yolov4_deepstream

一、背景

Yolo系列的目标检测算法对目标检测技术起到绝对性的推进作用。Yolov3是YOLO(You Only Look Once)系列中的第三版,相比之前的算法,特别是针对小目标,精度总体上用显著提升。

DeepStream是英伟达开发的在TX2、AGX Xavier等设备上用于简化开发难度的一个流分析工具包用于构建AI-powered应用。DeepStream接收流数据(USB/CSI camera, video from file 或者RTSP流)作为输入,同时使用AI和computer vision用于生成insights为了更好的理解环境,将像素转换成insights。Deep Stream SDK可用于构建视频分析解决方案,用于智慧城市中的交通和行人理解,医院中的健康和安全监控,零售商店的自检和分析,检测制造工厂中组件缺陷等。

二、运行DeepStream5.0中Yolo v3示例代码

示例源码路径在:
\opt\nvidia\deepstream\deepstream-5.0\sources\objectDetector_Yolo 中,

2.1 Yolov3项目代码文件夹结构

英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用
该项目中支持Yolov3,Yolov3 tiny和 Yolov2, Yolov2 tiny。大家可以根据自己的实际情况选择不同的网络模型。本文章以Yolov3为例讲解怎么编译执行。在上面的文件中nvdsinfer_custom_impl_Yolo文件夹实现了Yolov3的tensorrt engine生成,bounding box的处理包括decode和NMS两步。该文件夹下包含如下一些文件:
英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用

  • kernel.cu :实现了CUDA下预测位置,objectness和classification的sigmoid和exp处理
    英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用
  • Makefile: 用于编译
  • nvdsinfer_yolo_engine.cpp:根据网络类型创建引擎,用于生成tensorrt engine, 该例子是基于tensorrt API构建的网络定义
  • nvdsparsebbox_Yolo.cpp:yolo目标检测结果的输出,用于网络预测后信息的处理包括预测框的decode和bounding box的NMS处理
  • 其他文件 :用来构建Yolov3网络
  • YoloPlugin: 模型搭建的一些组件以及相应的实现,是Yolo网络中的Yolo layer 的一个tensorrt custom plugin.
    kernels.cu: cuda核最底层的实现
    trt_utils.cpp: 建立tensorRT网络的部分,已经支持的部分
    yolo.cpp :创建引擎、创建网络等的具体实现

2.2 编译运行Yolov3

2.2.1下载权重文件和配置文件

首先准备好yolov3.cfg和yolov3.weights,这个可以从yolo v3官方提供的下载地址下载。下载后放置到

或者用百度网盘下载:
链接:https://pan.baidu.com/s/1KUi1v3q9qXqbd5Aq6InM4A
提取码:xhoa

2.2.2 修改config_infer_primary_yoloV3.txt文件

然后修改每个相应config_infer_primary_yolo中模型地址。
该文件中各项配置含义如下:

[property]
gpu-id=0
net-scale-factor=0.0039215697906911373
#0=RGB, 1=BGR
model-color-format=0

 # 模型网络结构文件路径
custom-network-config=yolov3.cfg

# 模型权重文件路径
model-file=yolov3.weights

# 模型生成的推理引擎路径。
# 注意:这个配置如果注释的话,每次都会重新生成引擎,而生成引擎的过程很慢。
# 当这项配置打开时,这样只会在第一次生成引擎,后续启动会很快。
#model-engine-file=yolov3_b1_gpu0_int8.engine

 # 类别标签文件的路径
labelfile-path=labels.txt
int8-calib-file=yolov3-calibration.table.trt7.0
 # 设置推理精度,0表示fp32, 1表示int8,  2 表示fp16。
  # 从fp32到fp16再到int8, 推理速度会越来越快,但推理精度会越来越差。
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=1
# 目标检测的类别
num-detected-classes=80
gie-unique-id=1
network-type=0
is-classifier=0
 # 选择NMS算法
## 0=Group Rectangles, 1=DBSCAN, 2=NMS, 3= DBSCAN+NMS Hybrid, 4 = None(No clustering)
cluster-mode=2
maintain-aspect-ratio=1

# 解析检测框的函数名称
parse-bbox-func-name=NvDsInferParseCustomYoloV3

# 编译的动态库路径。我们在下文中会执行命令编译得到这样的so动态库文件
custom-lib-path=nvdsinfer_custom_impl_Yolo/libnvdsinfer_custom_impl_Yolo.so

# 生成引擎的函数名称
engine-create-func-name=NvDsInferYoloCudaEngineGet
#scaling-filter=0
#scaling-compute-hw=0

[class-attrs-all]

# NMS的阈值
nms-iou-threshold=0.3

 # 检测框的过滤阈值
threshold=0.7

对于Yolo系列网络给出一个总体的框架流程图。
英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用

2.2.3 编译工程

进入objectDetector_Yolo文件夹下

export CUDA_VER=10.0
make -C nvdsinfer_custom_impl_Yolo     

这时候会在nvdsinfer_custom_impl_Yolo文件夹里生成.so文件

2.2.4 运行示例

deepstream-app -c deepstream_app_config_yoloV3.txt

2.2.5 效果图

第一次运行等待了接近4分钟后,才开始运行
英伟达DeepStream学习笔记10——DeepStream5.0中Yolo v3的使用
等第一次运行结束后,可以把config_infer_primary_yoloV3.txt文件中

# 当这项配置打开时,这样只会在第一次生成引擎,后续启动会很快。
model-engine-file=yolov3_b1_gpu0_int8.engine

名字可能不是默认的,我的是

# 当这项配置打开时,这样只会在第一次生成引擎,后续启动会很快。
model-engine-file=model_b1_gpu0_int8.engine

再次运行,速度会快很多。

上一篇:点云上实时三维目标检测的欧拉区域方案 ----Complex-YOLO


下一篇:深度学习-物体检测-YOLO系列