当前位置: 首页 > news >正文

yolov5-6.2 在 rk3399pro 上的移植

文章目录

    • 一、搭建yolov5环境
    • 二、导出onnx模型
    • 三、安装 rknn-toolkit
    • 四、通过netron 查看 yolov5s.onnx 输出节点
    • 五、创建 onnx2rknn.py 文件
    • 六、通过toolkit将onnx转换为rknn模型
    • 七、在rk3399pro开发板上运行rknn模型

一、搭建yolov5环境

从yolov5官方仓库 ultralytics/yolov5/releases 中下载 yolov5-6.2 代码。
解压后,修改 requirements.txt :
1、将第12行 torch>=1.7.0 改为 torch==1.9.0
因为只有 pytorch 1.8.0 或 1.9.0 版本才能正常导出模型
2、删除第28、29行 onnx>=1.9.0 前的 # 号,否则无法导出onnx模型;
执行

pip install -r requirement.txt

验证环境是否搭建成功

python detect.py

二、导出onnx模型

1、进入 yolov5-6.2/models ,将 yolo.py 文件中 class Detect 中的 forward 函数,修改如下

def forward(self, x):z = []  # inference outputfor i in range(self.nl):x[i] = self.m[i](x[i])  # convreturn x[0],x[1],x[2]

在这里插入图片描述
2、进入 yolov5-6.2 主目录,执行以下命令导出onnx模型

python export.py --weights yolov5s.pt --img 640 --batch 1 --opset 12 --include onnx

执行成功后,将在 yolov5s.pt 同目录生成 yolov5s.onnx 文件

三、安装 rknn-toolkit

1、下载docker版本的toolkit
从 rockchip-linux/rknn-toolkit 下载 docker版本的toolkit,提取码:rknn
在这里插入图片描述
这里下载的是 1.7.3 版本
在这里插入图片描述
2、在安装有docker的linux服务器上导入上述toolkit

docker load --input rknn-toolkit-1.7.3-docker.tar.gz

导入完成后执行 docker images,将看到 toolkit-1.7.3 镜像
在这里插入图片描述
执行以下命令,进入docker

docker run -t -i --privileged -v $PWD:/test rknn-toolkit:1.7.3 /bin/bash

其中 -v $PWD:/test 是指把当前目录映射到docker容器的/test目录内,这样当要和docker容器内部进行文件传输时,只需把需要传输的文件放到当前目录,就能在 docker 容器内的 /test 目录看到,反之亦然。
执行成功后,将自动进入docker容器内
在这里插入图片描述
可以看到已经有一个 test 目录,test 目录的内容就是服务器当前目录的内容。

四、通过netron 查看 yolov5s.onnx 输出节点

先安装后 netron,然后netron打开上述第二步导出的 yolov5s.onnx 模型,点击左上角图标,即可看到输出节点信息
在这里插入图片描述
可以看到这里的输出节点分别是: output、327、328,记住这几个输出节点,下一步导出rknn时将用到

五、创建 onnx2rknn.py 文件

在该文件中指定onnx_model路径,platform,以及 rknn.load_onnx 时一定要指定上一步查看的输出节点信息

from rknn.api import RKNN
ONNX_MODEL = 'yolov5s.onnx'
platform = "rk3399pro"
RKNN_MODEL = 'yolov5s_{}_out_opt.rknn'.format(platform)
if __name__ == '__main__':add_perm = False # 如果设置成True,则将模型输入layout修改成NHWC# Create RKNN objectrknn = RKNN(verbose=True)# pre-process configprint('--> config model')rknn.config(batch_size=1, mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], reorder_channel='0 1 2', target_platform=[platform], force_builtin_perm=add_perm, output_optimize=1)print('done')# Load tensorflow modelprint('--> Loading model')ret = rknn.load_onnx(model=ONNX_MODEL,outputs=['output', '327', '328'])# 这里一定要根据onnx模型输出节点进行修改if ret != 0:print('Load onnx model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=True, dataset='./dataset.txt')if ret != 0:print('Build rkmodel failed!')exit(ret)print('done')# rknn.export_rknn_precompile_model(RKNN_MODEL)rknn.export_rknn(RKNN_MODEL)rknn.release()

六、通过toolkit将onnx转换为rknn模型

1、将上述第二步导出的 yolov5s.onnx 模型以及 第五步创建的 onnx2rknn.py 放到服务器当前目录,即映射到docker容器内/test目录的目录;
2、进入docker容器内,执行

cp /test/yolov5s.onnx /examples/onnx/yolov5/
cp /test/onnx2rknn.py /examples/onnx/yolov5/
cd /examples/onnx/yolov5/
python onnx2rknn.py
cp yolov5s_rk3399pro_out_opt.rknn /test

执行完成后将生成相应的 yolov5s_rk3399pro_out_opt.rknn 模型
在这里插入图片描述

七、在rk3399pro开发板上运行rknn模型

1、下载 airockchip/RK3399Pro_npu,将其放到 rk3399pro 开发板上;
2、如有必要,根据说明更新NPU驱动,只需要替换相应的boot.img 即可;
3、进入 RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo 目录,执行以下命令

cd RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ ..
make -j4

执行成功后,将在build目录生成可执行程序 rknn_yolov5_demo
4、将上述第六步导出的yolov5s_rk3399pro_out_opt.rknn模型上传到rk3399pro的
RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo/model 目录
5、在RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo创建以下运行脚本 run_demo.sh

export LD_LIBRARY_PATH=./lib/
./build/rknn_yolov5_demo  model/yolov5s_rk3399pro_out_opt.rknn  model/bus.bmp

6、执行脚本

./run_demo.sh

正常将输出预测信息
在这里插入图片描述
可视化结果如图所示
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力扣面试150 三角形最小路径和 DFS 记忆化搜索 DP 滚动数组优化DP
  • 一次性了解Neo4j图形数据库
  • 外贸人提高潜在客户EDM电子邮件营销参与度的一些建议
  • C++ 类型的转换
  • vivado 时间汇总报告
  • 一台手机一个ip地址吗?手机ip地址泄露了怎么办
  • 快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
  • Lianwei 安全周报|2024.09.09
  • 【springsecurity】使用PasswordEncoder加密用户密码
  • 基于单片机的简易录音笔设计
  • 九月五日(k8s配置)
  • 五种IO模型
  • 个人简历 (自己设计的)
  • JS_阿里云oss视频上传后,如何获取视频封面
  • 深度学习速通系列:鲁棒性和稳定性
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • sessionStorage和localStorage
  • Tornado学习笔记(1)
  • Vue2 SSR 的优化之旅
  • Vue官网教程学习过程中值得记录的一些事情
  • Webpack 4x 之路 ( 四 )
  • 构造函数(constructor)与原型链(prototype)关系
  • 离散点最小(凸)包围边界查找
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 思维导图—你不知道的JavaScript中卷
  • python最赚钱的4个方向,你最心动的是哪个?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Ubuntu(修改root信息)
  • (day 12)JavaScript学习笔记(数组3)
  • (vue)页面文件上传获取:action地址
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (规划)24届春招和25届暑假实习路线准备规划
  • (回溯) LeetCode 46. 全排列
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (原創) 未来三学期想要修的课 (日記)
  • (转)scrum常见工具列表
  • .Net 4.0并行库实用性演练
  • .NET Core 2.1路线图
  • .NET delegate 委托 、 Event 事件
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • :=
  • @ConditionalOnProperty注解使用说明
  • @javax.ws.rs Webservice注解
  • @SpringBootConfiguration重复加载报错
  • [2544]最短路 (两种算法)(HDU)
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据