一文教你地平线旭日派X3部署yolov5从训练-->转模型-->部署

一文教你地平线旭日派X3部署yolov5从训练,转模型,到部署

近日拿到了地平线的旭日派X3,官方说是支持等效5tops的AI算力,迫不及待的想在上面跑一个yolov5的模型,可谓是遇到了不少坑,好在皇天不负有心人,终于在手册和社区各个大佬的帮助下,终于在板子上推理成功,本文会从训练、模型转换、到部署到旭日派详细说明

1.训练

1.1准备yolov5-2.0源代码

根据地平线社区大佬说明,虽然旭日派X3支持yolov5所有版本,但是只有yolov5-2.0的主干网络算子都跑在BPU上,效果最好,帧率最高

yolov5-2.0源代码

注意yolov5的预训练权重在下载时也要下载对应版本

1.2使用conda创建一个虚拟环境安装相关依赖

image-20240203220522238

执行pip install -r requirements.txt可以注释掉有关torch的,使用此文件安装torch可能会导致安装cpu版本

1.3准备训练需要的文件

可以在data目录下创建自己的文件夹

这是最终的目录结构目录结构,images和labels一定要对应,data.yaml和yolov5s.yaml是从其他位置复制过来修改的,下图中的cache缓存文件一定要删除,一定要删除,一定要删除,否则会报错照片找不到

image-20240203221054695

复制data目录下的voc.yaml,改为data.yaml

image-20240203221352540

根据自己的需求修改,这个文件夹知名了数据集的路径和标签的种类和个数

image-20240203221541502

复制model目录下的yaml文件,有四种网络结构可供选择

image-20240203221721490

例如我选择的是yolov5s,修改yolov5s.yaml中的nc为自己的标签个数

image-20240203221907598

训练所需要的文件就准备好了

1.4修改train.py文件正式开始训练

修改红框中这几个default参数

  • 注意预训练模型与yolov5s.yaml要对应上
  • 输入图片大小最好使用672X672与后续官方例程保持一致
  • 训练轮次根据需求自己设置
  • batch-size 根据自己显卡的显存设置我是4060 8G版本设置的16

image-20240203223144064

之后就可以运行train.py文件开始训练,模型保存在根目录下的runs文件夹下的exp文件夹下的weight文件夹,也可以查看训练的收敛情况图片

image-20240203223737905

1.5导出onnx模型
1.5.1为旭日派的BPU加速特殊处理

根据地平线官方文档说明为了更好地适配后处理代码

在使用export.py导出onnx模型时需要对yolo.py做特殊修改

去除了每个输出分支尾部从4维到5维的reshape(即不将channel从255拆分成3x85), 然后将layout从NHWC转换成NCHW再输出。

以下左图为修改前的模型某一输出节点的可视化图,右图则为修改后的对应输出节点可视化图。

image-20240203222724581

image-20240203222855839

注意训练时和导出onnx模型时,此文件的不同

注意训练时和导出onnx模型时,此文件的不同

注意训练时和导出onnx模型时,此文件的不同

1.5.2修改export.py文件

在使用export.py脚本时,请注意:

  1. 由于地平线AI工具链支持的ONNX opset版本为 10 和 11, 请将 torch.onnx.exportopset_version 参数根据您要使用的版本进行修改。
  2. torch.onnx.export 部分的默认输入名称参数由 'images' 改为 'data',与模型转换示例包的YOLOv5s示例脚本保持一致。
  3. parser.add_argument 部分中默认的数据输入尺寸640x640改为模型转换示例包YOLOv5s示例中的672x672。

image-20240203224202451

执行后就得到onnx文件了

2.转模型

转模型需要在linux环境或者docker容器内进行,推荐使用ubuntu虚拟机进行,需要有anaconda+py3.6环境

image-20240203224542175

2.1环境配置

2.1.1获得yolov5-2.0转模型demo
wget -c ftp://xj3ftp@vrftp.horizon.ai/ai_toolchain/ai_toolchain.tar.gz --ftp-password=xj3ftp@123$%wget -c ftp://xj3ftp@vrftp.horizon.ai/model_convert_sample/yolov5s_v2.0.tar.gz --ftp-password=xj3ftp@123$%

若需更多公版模型转换示例,可执行命令: wget -c

ftp://xj3ftp@vrftp.horizon.ai/model_convert_sample/horizon_model_convert_sample.tar.gz --ftp-password=xj3ftp@123$%
2.1.2创建模型转换环境
//horizon_bpu 为环境名,可自行设置conda create -n horizon_bpu python=3.6 -y
2.1.3进入模型转换环境:
// horizon_bpu 为上文创建python环境名,  conda环境命令会根据不同的操作系统有所差异,以下两条命令请选择其中能进入conda模型转换环境的命令来使用source activate horizon_bpu 或 conda activate horizon_bpu
2.1.4解压模型转换环境和示例模型安装包并进行相关依赖的安装
tar -xzvf yolov5s_v2.0.tar.gztar -xzvf ai_toolchain.tar.gzpip install ai_toolchain/h* -i https://mirrors.aliyun.com/pypi/simplepip install pycocotools -i https://mirrors.aliyun.com/pypi/simple
2.2转换模型
2.2.1验证模型

修改01_check.sh

image-20240203225705634

运行

./01_check.sh

终端输出这些就说明你的onnx是正常的可以运行在旭日派X3上的

image-20240203231115077

2.2.2校准模型

因为BPU是INT8计算,所以注定会有精度损失。而且这些误差也是可以传递的,所以到后面精度是越来越低的。如果网络深度过高,也会导致整体精度的下降。

参考了地平线社区一个佬的yolov3文章这里

1. 在01_common创建一个存放图像文件夹

image-20240204002511726

执行 bash 02_preprocess.sh

2.2.3转换配置yolov5s_config_X3.yaml

借用大佬的yolov3的思维导图

在这里插入图片描述

image-20240203233945230

执行03_build.sh

image-20240204002850385

转换成功,位于model_output文件夹

image-20240204002925959

3.部署

3.1修改test_yolov5.py

image-20240204003344464

3.2postprocess.py

image-20240204003543604

reshape的第2,3个参数,就是你模型尺寸分别除以8,16,32;第5个参数要改成刚才的num_classes+5(图中没有标出来)

将图片fire01.jpg输入推理

fire01

结果

image-20240204004028707

result1

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

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

相关文章

车载技术提升系列——CANape快速入门

车载技术提升系列——CANape快速入门 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

Qt中的线程与信号槽

小实践 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H // #pragma once #include <QMainWindow> #include"zthread.h"QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass ZThread;class MainWindow : public QMainWin…

C++棋类小游戏2

今天给大家带来我花了1周时间自创的小游戏的升级版&#xff0c;博主还是一名小学生&#xff0c;希望大家提提意见。这是我写的最长的C代码&#xff0c;希望大家喜欢&#xff0c;不要抄袭&#xff0c;任何编译器都可以。 以前版本——C自创棋类小游戏-CSDN博客 C内容提示&…

苹果CMS挖片网升级版视频主题模版源码

自适应视频站正版高级挖片网收录模板&#xff0c;模板不错&#xff0c;是挖片网的升级版。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88799583 更多资源下载&#xff1a;关注我。

RCS系统之:地图编辑

一般每个供应商都有不同的需求&#xff0c;不同的需求都会是在不同的场景下产生的。而不同的场景都会需要构建不同的地图数据。 所有一个动态编辑的地图的能力都软件&#xff0c;是非常有必要的。基于这个想法&#xff0c;我们提供了一个可以实时&#xff0c;动态编辑地图的界面…

7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ&#xff0c;包含对 RibbitMQ 的架构介绍、应用场景、坑点解析以及代码实战。 我将使用 waynboot-mall 项目作为代码讲解&#xff0c;项目地址&#xff1a;https://github.com/wayn111/waynboot-mall。本文大…

红日靶场1搭建渗透

环境搭建 下载好镜像文件并解压&#xff0c;启动vmware 这里我用自己的win7 sp1虚拟机作为攻击机&#xff0c;设置为双网卡NAT&#xff0c;vm2 其中用ipconfig查看攻击机ip地址 设置win7 x64为双网卡&#xff0c;vm1&#xff0c;vm2 设置win08单网卡vm1&#xff0c;win2k3为单…

MySQL查询缓存

MySQL查询缓存 MySQL在查询的时候首先会查询缓存&#xff0c;如果缓存命中的话就直接返回结果&#xff0c;不需要解析sql语句&#xff0c;也不会生成执行计划&#xff0c;更不会执行&#xff1b;如果没有命中缓存&#xff0c;则再进行SQL解析以及进行查询&#xff0c;并将结果返…

【轮式平衡机器人】——TMS320F28069片内外设之ADC

一、ADC概述 这一部分不是我们的重点&#xff0c;原理分类啥的这里简要说明&#xff01; 步骤&#xff1a;采样、保持、量化、编码 将采样电平&#xff08;模拟值&#xff09;转换为数字值的方法&#xff1a;直接比较型&#xff08;并行ADC、逐次逼近型ADC&#xff09;&…

【MongoDB】跨库跨表查询(python版)

MongoDB跨表跨库查询 1.数据准备&#xff1a;2.跨集合查询3.跨库查询应该怎么做&#xff1f; 讲一个简单的例子&#xff0c;python连接mongodb做跨表跨库查询的正确姿势 1.数据准备&#xff1a; use order_db; db.createCollection("orders"); db.orders.insertMan…

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

阅读导航 引言一、C语言的输入与输出二、流是什么三、CIO流1. C标准IO流&#xff08;1&#xff09;istream&#xff08;2&#xff09;ostream&#xff08;3&#xff09;iostream&#xff08;4&#xff09;cin 和 cout 2. C文件IO流&#xff08;1&#xff09;ifstream&#xff0…

【Android新版本兼容】onBackPressed()方法被弃用的解决方案

提示&#xff1a;此文章仅作为本人记录日常学习使用&#xff0c;若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、使用 AndroidX API 实现预测性返回手势1.1 添加依赖1.2 启用返回手势1.3 注册OnBackPressedCallback()方法来处理返回手势 一、使用 AndroidX API 实现预测…

Linux实验记录:使用vsftpd服务传输文件

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 为了解决在多样复杂的设备之间解决传…

Android studio打包apk比较大

1.遇到的问题 在集成linphone打包时发现有118m&#xff0c;为什么如此之大额。用studio打开后发现都是不同的cpu架构。 2.解决办法 增加ndk配置&#xff0c;不需要配置那么多的cpu结构&#xff0c;根据自己需要调整。 defaultConfig { applicationId "com.matt.linp…

关于Ubuntu下docker-mysql:ERROR 2002报错

报错场景&#xff1a; mysql容器创建好后登录mysql时即使密码正确也是报出下方提示&#xff1a; 原因是在创建mysql容器在创建时本地目录缺失&#xff0c; 先去自建一个目录&#xff0c;例如&#xff1a; /opt/my_sql 正确完整目录如下&#xff1a; docker run --namemys…

【微服务】skywalking自定义链路追踪与日志采集

目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…

springboot153相亲网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

lava学习-多态-final-抽象类

一.多态 1.什么是多态&#xff1f; 现象&#xff1a;对象多态&#xff1a;比如说一个人 类&#xff0c;他可以是一个老师&#xff0c;也可以是一个同学 行为多态&#xff1a;多个对象同一类行为的不同表现形式&#xff0c;比如两个人&#xff0c;一个人跑得快&#xff0c;另一个…

Spring 事务原理总结三

今天这篇文章&#xff0c;我想梳理一下Spring事务用到的几个核心组件。这些核心组件是我们理解Spring事务原理的基础。通过它们我们可以体会学习一下Spring设计者设计Spring事务时的基本思路。这些组件是&#xff1a;TransactionInfo、TransactionStatus、TransactionManager、…

极速上手:使用Jmeter轻松实现N种参数化

参数化的方式&#xff1a; 一、使用用户自定义变量 一种方式&#xff1a;直接在测试计划中添加用户自定义变量 另外一种方式&#xff1a;配置元件——用户自定义变量 示例&#xff1a;用户自定义变量&#xff0c;登录手机号码 在接口请求的时候&#xff0c;进行引用 请求之后&…