Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件

Jetson nano上部署自己的Yolov5模型(TensorRT加速)onnx模型转engine文件

背景

在主机上训练自己的Yolov5模型,转为TensorRT模型并部署到Jetson Nano上,用DeepStream运行。

硬件环境:

RTX 2080TI主机

Jetson Nano 4G B01

软件环境:

Jetson Nano:

Ubuntu 18.04

Jetpack 4.5.1

DeepStream 5.1

主机:

Ubuntu 18.04

CUDA 10.2

yolov5 5.0

训练模型(主机上)

yolov5项目链接https://github.com/ultralytics/yolov5

克隆yolov5官方的代码

git clone https://github.com/ultralytics/yolov5.git

官方训练教程详见https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

预备环境

准备python3.8以上环境,可用conda创建一个虚拟环境,安装yolov5项目下yolov5/requirements.txt里的依赖

pip install -r requirements.txt

pytorch建议按pytorch官网教程的方式安装PyTorch

如CUDA 10.2 conda环境下安装

conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

conda安装太慢可用mamba

准备数据集

手上有一个用labelImg(https://github.com/tzutalin/labelImg)打好标签的voc格式数据集,数据集里只有两种类型,鸭子duck和马桶抽sucker。(可自行用其他方式打voc格式数据集或用labelImg直接打yolo格式数据集)

用下面代码将voc格式转成yolo格式数据集,生成images文件夹(存放所有图片),labels文件夹(存放打好的标签),test.txt(测试集),train.txt(训练集),val.txt(验证集)

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets = ['train', 'test','val']
classes = ["duck", "sucker"]def convert(size, box):dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)
def convert_annotation(image_id):in_file = open('VOC2007/Annotations/%s.xml' % (image_id))out_file = open('data/labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
print(wd)
for image_set in sets:if not os.path.exists('data/labels/'):os.makedirs('data/labels/')image_ids = open('VOC2007/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()list_file = open('data/%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write('data/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()

按实际情况修改类型classes和文件路径。

创建配置文件

创建数据集配置文件dataset.yaml

train: data/train.txt  # 数据集里的训练集列表文件路径
val: data/val.txt  # 数据集里的验证集列表文件路径nc: 2 #类型数量names: [ 'duck', 'sucker' ]  #类型名

创建模型配置文件model.yaml,在yolov5项目下yolov5/models里复制一个要训练的模型出来修改,如yolov5s,只需修改类型数量nc

# parameters
nc: 2  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# anchors
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 9, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 1, SPP, [1024, [5, 9, 13]]],[-1, 3, C3, [1024, False]],  # 9]# YOLOv5 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

训练

从https://github.com/ultralytics/yolov5/releases下载预训练权重,如yolov5s.pt

执行yolov5项目下的train.py

python train.py --data datast.yaml --cfg model.yaml --weights yolov5s.pt --device 0

参数路径按实际情况修改

--data 数据集配置文件路径

--cfg 模型配置文件路径

--weights 预训练权重文件路径

--device CUDA设备或CPU,单显卡一般为0

其他参数详见train.py代码

运行完会在yolov5/runs/train/exp{n}/weights/下生成权重文件,best.pt为效果最佳权重,last.pt为最后一次epoch权重

用yolov5/detect.py验证识别效果

python detect.py --source path/images --weights runs/train/exp4/weights/best.pt --view-img

--source 待识别的图片文件夹路径或摄像头

--weights 权重路径

--view-img 显示识别结果

其他参数详见detect.py代码

转TensorRT

使用tensorrtx项目进行转换GitHub - wang-xinyu/tensorrtx: Implementation of popular deep learning networks with TensorRT network definition API

克隆tensorrtx项目

git clone https://github.com/wang-xinyu/tensorrtx.git

官方教程详见https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5

将tensorrtx/yolov5/gen_wts.py复制到yolov5项目根目录下

执行命令生成.wts文件

python gen_wts.py yolov5/runs/train/exp4/weights/best.pt

执行完在.pt权重路径下会生成一个.wts文件

环境转到Jetson Nano

在nano上也克隆一个tensorrtx项目

将生成的.wts放到tensorrtx/yolov5/下

修改tensorrtx/yolov5/yololayer.h

static constexpr int CLASS_NUM = 2;

修改类型数量,原来是80

在tensorrtx/yolov5/目录下

编译代码

mkdir build
cd build
cmake ..
make

将.wts文件转为.engine文件

sudo ./yolov5 -s ../best.wts ../best.engine s

将验证图片放在tensorrtx/yolov5/samples/下,执行命令验证转换是否成功

sudo ./yolov5 -d ../best.engine ../samples

执行完会在当前目录生成一张相应的图片

用DeepStream部署(Nano上)

安装DeepStream,DeepStream Getting Started | NVIDIA Developer

安装完后在/opt/nvidia/deepstream/deepstream-5.1/sources/objectDetector_Yolo会有一个部署yolo的官方实例代码,但只有yolov3的。

这里我们直接用已经改好的yolov5项目GitHub - DanaHan/Yolov5-in-Deepstream-5.0: Describe how to use yolov5 in Deepstream 5.0

可不用按照项目官方的说明,直接按以下步骤即可。

克隆项目

git clone https://github.com/DanaHan/Yolov5-in-Deepstream-5.0.git

进入Yolov5-in-Deepstream-5.0/Deepstream 5.0/nvdsinfer_custom_impl_Yolo/目录下

修改nvdsparsebbox_Yolo.cpp文件中的类型数量

static const int NUM_CLASSES_YOLO = 2;

原本为80,改为自己模型的类型数量

保存编译

make

返回上级目录,进入Yolov5-in-Deepstream-5.0/Deepstream 5.0/

将tensorrtx生成的.engine文件和libmyplugins.so放到目录下

这里是tensorrtx/yolov5/best.engine和tensorrtx/yolov5/builkd/libmyplugins.so

修改DeepStream处理流程配置文件deepstream_app_config_yoloV5.txt 

...[source0]
#Type - 1=CameraV4L2(usb摄像头) 2=URI(文件) 3=MultiURI
type=1
camera-width=2560
camera-height=720
camera-fps-n=30
camera-fps-d=1...[streammux]
...
width=1344
height=376
...[primary-gie]
...
model-engine-file=best.engine
...[tracker]
enable=0
tracker-width=512
tracker-height=320
ll-lib-file=/opt/nvidia/deepstream/deepstream-5.1/lib/libnvds_mot_klt.so...

我修改了[source0],改为用摄像头实时跑识别,需要加上长宽和帧率设置。这里我用的是一个双目摄像头。

[streammux]显示窗口改为1344*376

[primary-gie]修改权重路径

[tracker]改为deepstream5.1的地址

修改config_infer_primary_yoloV5.txt文件

...model-engine-file=best.engine...num-detected-classes=2...custom-lib-path=nvdsinfer_custom_impl_Yolo/libnvdsinfer_custom_impl_Yolo.so...

修改权重路径

修改识别类型数量,原本为80

修改编译文件路径

注意,文件里还有个labels文件路径的配置

labelfile-path=labels.txt

文件夹里是没有labels.txt的,补上labels.txt标签类型文件

duck
sucker

执行命令运行DeepStream

LD_PRELOAD=./libmyplugins.so deepstream-app -c deepstream_app_config_yoloV5.txt

运行帧率在13-14fps左右

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员专属精美简历合集—第二弹

找工作除了技能之外最重要的就是简历,从某种意义上来说简历有时候比能力更重要!为什么简历如此重要?根据拉勾的招聘调研报告显示,大约有 80% 的简历通不过主筛。所以简历就是一堆 0 之前的那个 1,如果简历通不过筛选&a…

CDH6报错解决全记录

一、服务器准备 1、服务器配置 准备3台服务器,建议最低配置如下(阿里云大约每台每月六百多): centos7.4 8c 16G 39.101.192.109 node001 39.101.179.3 node002 39.99.236.205 node003 为服务器开启外网端口访问 7180、8900 2…

QT5动态创建多个按钮控件并关联信号槽函数

创建QT对话框工程,动态创建多个按钮,把动态创建的按钮存放在QList中,并关联同一个信号槽函数,在该槽函数中根据按钮对象名称各自进行其他事项处理。 在mainwindow.h文件添加 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include…

Java 200+ 面试题补充 ThreadLocal 模块

让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致。 本文是前文《Java 最常见的 200 面试题》的第一个补充模块。 1.ThreadLocal 是什么? ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程…

如何在CDH5.16.2中部署海豚调度器Apache Dolphin Scheduler 1.2.0

Apache Dolphin Scheduler 组件介绍 分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 官网 : https://dolphinscheduler.apache.org/en-us/ Github : https://github.com/apache…

Ubuntu20.04 pycharm python打包制作DEB包详细步骤及雷区

记录一次Deb打包过程及踩雷警示 最近写了一个python的小程序,希望能打包成deb文件,便于将写好的软件安装 在其他没有安装工作环境的电脑上,把这安装deb后可以在应用列表和桌面看到。下面介绍一个python工程的打包过程, 分为两大步…

有人问我,为什么1+1等于2

2019独角兽企业重金招聘Python工程师标准>>> 我回复说:“这是规则,天地万物有其规则,人观察而形成自己的规则。李小龙说:“以无法为有法,以无限为有限”,其实也是用最大的规则作为准则&#xff…

你真的知道 == 和 equals 的区别吗?

让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致。 在 Java 中 和 equals 的区别,感觉只有很少的人能才完全说正确。 常见的错误回答就是: 基础类型对比的是值是否相同,引用类型对比的是…

Ray集群搭建 Python Demo

目录 准备条件(基于linux环境) 参考文献例子-python Ray集群 1.部署head节点2.部署worker节点部署Ray集群安装Ray(在所有节点上安装)Ray工作原理Ray的优势Ray简介准备条件(基于linux环境) 这里部署2个节点…

Java 200+ 面试题补充② Netty 模块

让我们每天都能看到自己的进步。老王带你打造最全的 Java 面试清单,认真把一件事做到最好。 本文是前文《Java 最常见的 200 面试题》的第二个补充模块,第一模块为:《Java 200 面试题补充 ThreadLocal 模块》。 1.Netty 是什么? …

Ray.tune可视化调整超参数Tensorflow 2.0

Ray.tune官方文档 调整超参数通常是机器学习工作流程中最昂贵的部分。 Tune专为解决此问题而设计,展示了针对此痛点的有效且可扩展的解决方案。 请注意,此示例取决于Tensorflow 2.0。 Code: ray/python/ray/tune at master ray-project/ray GitHub E…

MySql 优化的 30 条建议

文章来源&#xff1a;包子博客MySql 优化的 30 条建议1、应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引…

Ubuntu18 Win10搭建Caffe训练识别mnist手写数字demo

ubuntu 系统下的Caffe环境搭建 对于caffe的系统一般使用linux系统&#xff0c;当然也有windows版本的caffe&#xff0c;不过如果你一开始使用了windows下面的caffe&#xff0c;后面学习的过程中&#xff0c;会经常遇到各种错误&#xff0c;网上下载的一些源码、模型也往往不能…

windows server 2008 IE代理服务器实验

一、首先介绍IE代理服务器的好处如下&#xff1a;1、节省带宽 2、绕过防火墙二、下面以这个软件为代理软件&#xff0c;本人在物理机和虚拟机实验&#xff0c;1、首先在物理机安装代理软件&#xff0c;安装完成如图所示&#xff1a;2、在“设置”项代理协议端口、在本地局域网…

Java 200+ 面试题补充③ Dubbo 模块

昨天在我的 Java 面试粉丝群里&#xff0c;有一个只有一年开发经验的小伙伴只用了三天时间&#xff0c;就找到了一个年薪 20 万的工作&#xff0c;真是替他感到开心。 他的经历告诉我们&#xff1a;除了加强自我实战经验之外&#xff0c;还要努力积累自己的理论知识。 人生没有…

十一、PyQt5点击主窗口弹出另一个非模态子窗口

单击主对话框菜单“设置“下的”交换机配置”action的信号与槽 主对话框代码: # -*- coding: utf-8 -*-import sys from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QDesktopWidget import win32api import win32con

彻底搞懂 Java 中的注解 Annotation

Java注解是一系列元数据&#xff0c;它提供数据用来解释程序代码&#xff0c;但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。网络上对注解的解释过于严肃、刻板&#xff0c;这并不是我喜欢的风格。尽管这样的解释听起来非常的专业。为了缓解大…

cs时间校准

2019独角兽企业重金招聘Python工程师标准>>> c/s结构中的时间校准 拜读了风云的一篇博客 思路比较明显简单: C发包打时间戳 S收包打时间戳 S回应包打时间戳 C收包打时间戳 4个时间戳可以进行计算校准. 假设来回时间相等 转载于:https://my.oschina.net/u/1449566/bl…

使用ACME部署生成阿里云免费HTTPS证书

使用ACME部署HTTPS证书 背景 现在越来越多的服务都是基于web&#xff0c;大多数默认使用HTTP协议。HTTP协议是一种没有加密的协议&#xff0c;所有数据都通过明文传输&#xff0c;即便是只在内网使用也存在一定的安全风险。尤其是对于登录等操作&#xff0c;账号密码通过HTTP…

Java性能优化的50个细节(珍藏版)

来源&#xff1a;http://t.cn/EMze6kc在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担&#xff0c;缩短加载…