前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NVIDIA Jetson Nano使用Tensor RT加速YOLOv4神经网络推理

NVIDIA Jetson Nano使用Tensor RT加速YOLOv4神经网络推理

作者头像
GPUS Lady
发布2021-06-01 11:02:32
3.6K2
发布2021-06-01 11:02:32
举报
文章被收录于专栏:GPUS开发者

本文转载自:

注意手机浏览代码看不全,可以左右滑动代码哟!

1

如何使用YOLOv4

首先要先建置darknet的环境,先下载darknet的github:

代码语言:javascript
复制
$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet

接着需要修改一下Makefile,在官方的github当中有提到Jetson TX1/TX2的修改方法,Jetson Nano也是比照办理,前面的参数设定完了,往下搜寻到ARCH的部分,需要将其修改成compute_53:

代码语言:javascript
复制
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=1
LIBSO=1
ZED_CAMERA=0
ZED_CAMERA_v2_8=0

......

USE_CPP=0
DEBUG=0

ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]

接着就可以进行build的动作了:

代码语言:javascript
复制
$ make

如果Build darknet的时候出现找不到nvcc的问题,如下图:

可以在Makefile当中的NVCC后面新增绝对位置:

接着重新make一次如果没有错误讯息就代表Build好了!

2

使用YOLOv4进行推理

我们需要先下载YOLOv4的权重来用

代码语言:javascript
复制
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights \
       -q --show-progress --no-clobber

基本的推理方法有三种:图片、视频、摄影头 ( 实时影像 ),我们一一来介绍使用方法!主要执行除了darknet的执行档之外还需要给予模式、数据集、配置文件:

代码语言:javascript
复制
./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights

可以使用 --help来帮助查看:

代码语言:javascript
复制
./darknet detector --help

如果要开启图片的话需使用 test模式,他会在执行之后要你输入图片的位置,不过这边要注意的是按任意建离开后,图片不会帮你储存:

代码语言:javascript
复制
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25

如果想要指定图片并且将结果储存下来则可以增加 -ext_output 的选项,执行完会储存成 prediction.jpg,这边我用另一张图片当示范 ( Ximending.jfif):

代码语言:javascript
复制
./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output Taiwan.jfif

如果要使用影片或摄影机的话则是透过 demo 的指令来操作,这边如果用 -ext_output会直接覆盖掉原本的,我希望可以另存成别的档案则需要用到-output_filename来执行:

代码语言:javascript
复制
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights sample.mp4 -out_filename sample_.mp4

使用摄影机进行影像实时辨识需要在后面参数导入 -c:

代码语言:javascript
复制
$ ./darknet detector demo cfg/coco.data \
                          cfg/yolov4.cfg \
                          yolov4.weights \
                          -c 0

可以看到FPS大概会在0.8左右 ( 于终端机画面上 ),有明显的延迟感,但是辨识的结果还算可以。

3

修改输入維度大小

我们也可以直接修改输入输出的图片大小,我用简单一点的语法来操作,复制一个yolov4.cfg并命名为yolov4-416.cfg,并直接用nano去修改输入大小成416,这边使用&&的意思是让前一个指令完成之后再接续下一个指令:

代码语言:javascript
复制
$ cp cfg/yolov4.cfg cfg/yolov4-416.cfg && nano cfg/yolov4-416.cfg

在下方的图片可以看到,缩小图片之后FPS就直接提高了许多,从0.8升到了1.5;注意!这个示范只是提供了可以修改输入大小的方法,因为有时候你用的图片或影片大小不同就需要稍微修改一下;官方较推荐的大小是608以上,缩小图片可能会导致辨识结果变差:

4

使用结构更小的YOLO ( Yolov4-Tiny )

下一种加快速度的方法是使用yolov4-tiny.weights,一个更小型的yolov4,这边的小型指的是神经网络模型的结构,一般我们都会使用在运算能力相较于显示适配器低的装置上 ( 例如 : 边缘装置 ),实作的部分,我们先将该权重下载下来:

代码语言:javascript
复制
$ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights

接着使用摄影头来开启,注意这边的config (cfg) 档案需要更改成 yolov4-tiny.cfg,因为yolov4跟yolov4-tiny的架构有所不同,config档案当中所提供的就是神经网络的结构:

代码语言:javascript
复制
$ ./darknet detector demo cfg/coco.data \
                          cfg/yolov4-tiny.cfg \
                          yolov4-tiny.weights \
                          -c 0

可以看到FPS已经来到了14,延迟感明显降低许多:

5

使用TensorRT引擎加速

接下来是TensorRT的版本,稍微简短介绍一下Tensor RT (以下简称 TRT ),它是一个加速引擎可以运用在有CUDA核心的NVIDIA显示适配器当中,如果要使用TRT引擎加速需要先将神经网络模型转换成ONNX的格式才行。

下载、安装环境

坊间利用Yolov4做了很多应用,而转换这块也已经有人完成了,所以我们直接使用网络上提供的Github来实现即可:

代码语言:javascript
复制
$ git clone https://github.com/jkjung-avt/tensorrt_demos.git

下载下来之后可以直接到ssd文件夹中执行install_pycuda.sh:

代码语言:javascript
复制
$ cd ${HOME}/project/tensorrt_demos/ssd
$ ./install_pycuda.sh

如果显示nvcc not found的话则需要手动修改 install_pycuda的档案,我们需要将cuda的绝对位置存放到环境变量当中:

透过nano编辑器开启并且将iffi中间的内容修改如下,原本的内容记得要批注掉:

代码语言:javascript
复制
$ nano ./install_pycuda.sh

安装完之后应该会显示 finished processing dependencies,也可以使用pip3 list去查看pycuda是否有安装成功:

接着需要安装onnx,一开始先安装相依套件,接着在安装onnx 1.4.1版本:

代码语言:javascript
复制
$ sudo apt-get install protobuf-compiler libprotoc-dev
$ sudo pip3 install onnx==1.4.1

都完成之后我们需要先将相关的程序build起来:

代码语言:javascript
复制
$ cd ${HOME}/project/tensorrt_demos/plugins
$ make

可以注意到又有nvcc的问题了,这时候一样需要修改Makefile来解决,将原本的NVCC=nvcc修改成NVCC=/usr/local/cuda/bin/nvcc即可:

6

下载并转换yolo模型

接着需要下载模型的权重,你将会看到它下载了yolo3跟yolo4的三种不同版本,并且直接放在当前文件夹当中,这边可以注意到下载的模型与刚刚的YOLOv4相同,所以其实也是可以直接用复制的方式或是直接写绝对位置进行转换:

代码语言:javascript
复制
$ cd ${HOME}/project/tensorrt_demos/yolo
$ ./download_yolo.sh

最后可以执行 yolo_to_onnx.py 将yolo的权重档转换成onnx档案,接着再编译成TRT可用的模型,在onnx_to_tensorrt.py我会建议使用 -v 来看到进度,不然看着画面没动静会有点紧张:

代码语言:javascript
复制
$ python3 yolo_to_onnx.py -m yolov4-416
$ python3 onnx_to_tensorrt.py -m yolov4-416 -v

转换ONNX大约耗费15分钟,会储存成yolov4-416.onnx,接着转换TRT大概也是差不多的时间,最后会储存成yolov4-416.trt。

7

使用TRT运行YOLOv4-416

这边我们使用 --usb 代表使用USB摄影机, --model则是选择特定模型:

代码语言:javascript
复制
$ cd ${HOME}/project/tensorrt_demos
$ python3 trt_yolo.py --usb 0 --model yolov4-416

左上角有显示FPS数值,实测下来大约都会在 4.2~4.5之间,我们这次使用的是416维度,相较没有使用TensorRT引擎的Darknet ( FPS 1.5),快了将近3倍。

刚刚输入的部分使用usb摄影机,而作者很贴心地都写得很完善了,在utils/camera.py的部分可以看到输入的内容选项,也可以直接使用 --help来查看:

这里有提供图片( --image )、视频 ( --video )、重复视频 ( --video_lopping )、网络摄影机 ( --usb ) 等都可以使用。

使用TRT运行YOLOv4-Tiny-416

接下来为了追求更快的速度,我们当然要来实测一下tiny版本的:

代码语言:javascript
复制
$ python3 yolo_to_onnx.py -m yolov4-tiny-416
$ python3 onnx_to_tensorrt.py -m yolov4-tiny -416 -v
$ cd ${HOME}/project/tensorrt_demos
$ python3 trt_yolo.py --usb 0 --model yolov4-tiny-416

使用tiny的话FPS来到18.05,基本上已经有不错的效果了!不过因为是tiny所以辨识的成效没有预期中的好:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用TRT运行YOLOv4-Tiny-416
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档