英伟达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项目代码文件夹结构
该项目中支持Yolov3,Yolov3 tiny和 Yolov2, Yolov2 tiny。大家可以根据自己的实际情况选择不同的网络模型。本文章以Yolov3为例讲解怎么编译执行。在上面的文件中nvdsinfer_custom_impl_Yolo文件夹实现了Yolov3的tensorrt engine生成,bounding box的处理包括decode和NMS两步。该文件夹下包含如下一些文件:
- kernel.cu :实现了CUDA下预测位置,objectness和classification的sigmoid和exp处理
- 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系列网络给出一个总体的框架流程图。
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分钟后,才开始运行
等第一次运行结束后,可以把config_infer_primary_yoloV3.txt文件中
# 当这项配置打开时,这样只会在第一次生成引擎,后续启动会很快。
model-engine-file=yolov3_b1_gpu0_int8.engine
名字可能不是默认的,我的是
# 当这项配置打开时,这样只会在第一次生成引擎,后续启动会很快。
model-engine-file=model_b1_gpu0_int8.engine
再次运行,速度会快很多。
标签:DeepStream,伟达,Yolov3,10,Yolo,custom,engine,文件,2.2 来源: https://blog.csdn.net/mao_hui_fei/article/details/117650211