RKNN:yolov8模型转换与板端推理流程

近期,在研究瑞芯微的RKNN模型推理时,遇到一些坑,现记录下来,以备忘,亦供同道者参考。

目录

1. 模型转换

1.1. 宿主机环境配置

1.2. onnx模型准备

1.3. onnx转rknn

2. 模型推理

2.1. 推理环境配置

2.2. 推理验证

2.2.1. 输入格式报错

 2.2.2. 需要使用torch


本文主要内容包括两块,一是在宿主机进行onnx-->rknn的模型转换,二是在SOC上利用转换好的rknn模型进行推理。

1. 模型转换

这一步需要在x86宿主机上进行,并配置相关环境。

1.1. 宿主机环境配置

主要就是在python环境中安装RKNN-Toolkit2。

构造环境这一步,建议在docker里面进行,这样可以避免和宿主机环境产生冲突,或者因为宿主机环境和需要的环境不匹配而导致的模型转换出现问题。

PS:之前博主在宿主机的python环境中直接pip安装的rknn-toolkit2,然而用一样的代码进行模型转换,最后推理结果总是出现错乱或者直接所有结果置信度特别低(接近0),最后放弃挣扎,转用docker才没有问题。

这里使用的版本是1.6.0,下载地址:

https://codeload.github.com/rockchip-linux/rknn-toolkit2/zip/refs/tags/v1.6.0icon-default.png?t=N7T8https://codeload.github.com/rockchip-linux/rknn-toolkit2/zip/refs/tags/v1.6.0下载解压之后的目录如下所示:

.
├── CHANGELOG.md
├── doc
├── LICENSE
├── README.md
├── res
├── rknn-toolkit2
├── rknn_toolkit_lite2
└── rknpu2

进到“rknn-toolkit2/docker/docker_file/ubuntu_20_04_cp38”目录下,并利用提供的Dockerfile构建一个docker镜像:

docker build -t rknn_toolkit2_1.6.0 . -f Dockerfile_ubuntu_20_04_for_cp38

等待镜像构建完毕,就会在里面自动安装模型转换所需的所有软件环境。然后,就可以启动一个容器,进到docker系统中:

# 注意:我们上一步构造的镜像命名为rknn_toolkit2_1.6.0,需要改为你的镜像名字;
#      同时,这里作了一个主机和容器之间的路径映射,以便于文件共享,需要将“ /data/projects/other/rknn_test/share_dir”改为你自己的路径
docker run -v /data/projects/other/rknn_test/share_dir:/workspace/ -it rknn_toolkit2_1.6.0

至此,就构建好了所需的环境。

1.2. onnx模型准备

这一步是为了从我们训练的torch模型转为onnx中间格式的模型。这里不能直接使用ultralytics官方的库,需要作一定的改动,使其最后的detect部分改为rknn支持的方式:

 可以参考rknn修改后的ultralytics版本:

GitHub - airockchip/ultralytics_yolov8: NEW - YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLiteNEW - YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite - airockchip/ultralytics_yolov8icon-default.png?t=N7T8https://github.com/airockchip/ultralytics_yolov8也可以自己在ultralytics的源码上修改,基本就是改ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件,这里不细说了,有空了可以单独聊聊这块内容。

使用修改后的ultralytics进行模型转换:

yolo export model=yolov8n.pt format=rknn

即可得到一个支持转rknn的onnx模型。

1.3. onnx转rknn

这一步需要利用rknn_model_zoo里面的代码,当然自己写一个转换的脚本也很简单。这里以rknn_model_zoo为例说明。先把该代码拉下来,地址在:

GitHub - airockchip/rknn_model_zooContribute to airockchip/rknn_model_zoo development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/airockchip/rknn_model_zoo.git进入目录:rknn_model_zoo/examples/yolov8/python,然后使用模型转换脚本将onnx模型转为所需的rknn格式的模型: 

python convert.py yolov8n.onnx rk3588

OK,至此,我们在宿主机的工作就完毕了。接下来,需要到板子上进行操作。

2. 模型推理

2.1. 推理环境配置

首先配置一个python虚拟环境:

# 根据你使用python版本进行创建:
conda create -n py38 python=3.8

然后,在1.1中我们下载的文件里面有rknn-toolkit2-1.6.0/rknn_toolkit_lite2/packages这个文件夹,从里面找到对应的安装包,比如我这里Python用的3.8所以就选择rknn_toolkit_lite2-1.6.0-cp38-cp38-linux_aarch64.whl;

最后,将其拷贝到RK板子上,并在板子上打开命令行,进入Python虚拟环境,安装rknn_toolkit_lite2:

pip install rknn_toolkit_lite2-1.6.0-cp38-cp38-linux_aarch64.whl

2.2. 推理验证

将1.3中拉下来的demo代码考到板子上,进到rknn_model_zoo/examples/yolov8/python目录下,使用python脚本进行推理:

# 注意,../model/yolov8.rknn要改为你转换的rknn模型路径
python yolov8.py --model_path ../model/yolov8.rknn --img_show --img_save --target rk3588

这一步如果没问题的话,就会展示推理结果,不过可能会出现以下问题:

2.2.1. 输入格式报错

Traceback (most recent call last):
  File "yolov8.py", line 262, in <module>
    outputs = model.run([input_data])
  File "/home/linaro/pkgs/rknn_model_zoo/py_utils/rknn_executor.py", line 24, in run
    print(inputs.shape)
AttributeError: 'list' object has no attribute 'shape'

对于这个错误,可以将这行代码:input_data = img

修改为:

input_data = np.expand_dims(img, axis=3)

将这行代码:outputs = model.run([input_data]) 

修改为:

outputs = model.run(input_data)

 2.2.2. 需要使用torch

在脚本实现的dfl函数中,使用了torch库,我们在板子上肯定不可能再去装一个torch的。因此,这里需要改为numpy实现,将以下代码替换原来的dfl函数即可:

def dfl(postion):
    n, c, h, w = postion.shape
    p_num = 4
    mc = c // p_num
    y = postion.reshape(n, p_num, mc, h, w)
    y = softmax(y, 2)
    acc_metrix = np.arange(mc).reshape(1, 1, mc, 1, 1)
    y = (y * acc_metrix).sum(2)
    return y
    
def softmax(data, dim):
    max = np.max(data, axis=dim, keepdims=True).repeat(data.shape[dim], axis=dim)
    exps = np.exp(data - max)
    return exps / np.sum(exps, axis=dim, keepdims=True)

最后,没有其他意外的话,就可以得到推理结果了:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

码农解压宝典

在快速发展的IT行业中&#xff0c;程序员们面临着巨大的工作压力。长时间的工作、高强度的编程任务以及不断更新的技术知识&#xff0c;使得程序员们时常感到疲惫不堪。然而&#xff0c;通过掌握一些简单的小窍门&#xff0c;程序员们可以有效地缓解工作压力&#xff0c;保持身…

【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 static静态成员 友元 友元函数 友元类 内部类 匿名对象 结语 前言 本篇主要内容&#xff1a;类和对象的一些知识点补充&#xff0c;包括static静态成员&#xff0c;友…

AWTK 开源串口屏开发(17) - 通过 MODBUS 访问数组数据

在 AWTK 串口屏中&#xff0c;内置了 MODBUS Client Channel 的模型&#xff0c;不用编写代码即可实现在 ListView 中显示数组数据。 MODBUS 协议一次只能读取 125 个 WORD&#xff0c;AWTK-MODBUS Client Channel 支持长数据&#xff0c;自动分成多个请求访问。 1. 功能 不用…

C语言入门课程学习记录5

C语言入门课程学习记录5 第23课 - C 语言中的常量第24课 - 初探程序中的数组第25课 - 数组特性深入剖析第26课 - 多维数组的概念与示例 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 第23课 - C 语言中…

SecretFlow学习指南(2)学习路径

目录 一、模块架构 二、模块详解 三、算法协议 四、学习路线 一、模块架构 良好的分层设计可以提高开发效率和可维护性&#xff0c;满足不同用户的需求。隐语从上到下一共分为六层。 ●产品层&#xff1a;通过白屏化产品提供隐语整体隐私计算能力的输出&#xff0c;让用户简…

paddle ocr模型量化实践

参考&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/main/deploy/slim/quantization/README.md https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/FAQ.md 蒸馏 剪枝 量化 参考&#xff1a;https://blog.csdn.net/mddCSDN/article/de…

【MySQL】MySQL中MVCC多版本并发控制的概念

MySQL中MVCC多版本并发控制的概念 锁相关的知识我们已经学习完了&#xff0c;在其中我们提到过一个概念&#xff0c;那就是 MVCC 。这又是个什么东西呢&#xff1f;今天我们就来好好看看 MVCC 到底是干嘛的。 MVCC 多版本并发控制&#xff0c;它主要是控制 读 操作&#xff0c;…

x264 编码器源码分析综述

================================================================================ 系列文章 x264配置文章链接🔗Windows11编译x264源码https://blog.csdn.net/yanceyxin/article/details/135035650Mac调试x264源码https://blog.csdn.net/yanceyxin/article/details

《软件设计师教程:计算机网络浅了解计算机之间相互运运作的模式》

​ 个人主页&#xff1a;李仙桎 &#x1f525; 个人专栏: 《软件设计师》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ​ ⛺️前言&#xff1a;各位铁汁们好啊&#xff01;&#xff01;&#xff01;&#xff0c;今天开始继续学习中级软件设计师考试相关的内容&#xff0…

python中怎么注释多行

多行代码注释 方法一&#xff1a;先选中要注释的段落&#xff0c;然后按下“ctrl/”&#xff0c;即可实现多行代码的注释。效果如下&#xff1a; 再一次按下“ctrl/”就可以取消注释。 方法二&#xff1a;跟注释单行一样在每一行前面输入“shift#”。 #r(i-arr[idx])*rat[idx]…

三阶魔方公式大全 图解

https://www.mitao521.com/miji/2020112215034.html 三阶魔方七步还原法的公式有R’UF’U’、R’D’RD X,3OR5,R U R’,(RU R’U’),(RU R’U’)3,U’ L’ U L U F U’ F’,U R U’ R’ U’ F’ U F,F(R U R’ U’)F’。 还有(R U R’ U’)2和(R U R’ U’)5,R2 D2 R’ U’ R …

各种螺纹介绍

按用途&#xff0c;有三个主要大类&#xff1a; 第一&#xff0c;连接螺纹&#xff0c;用于紧固&#xff0c;即是螺栓螺母&#xff1b; 第二&#xff0c;传动螺纹&#xff0c;就是车床走刀那种&#xff1b; 第三&#xff0c;管螺纹&#xff0c;管道连接用。 按标准&#xf…

【刷题篇】动态规划-01背包问题(十)

文章目录 1、01背包2、分割等和子集3、目标和4、最后一块石头的重量 II 1、01背包 #include <iostream> #include<vector> using namespace std;int main() {int n,v;cin>>n>>v;vector<int> Weight(n1);vector<int> Value(n1);vector<i…

PDF加密了无法编辑?解密方法来了!

一下午都在捣鼓各种格式问题&#xff0c;首先是需要合并几个 PDF&#xff0c;然而有一个文件加密了无法操作&#xff0c;碰到加密不能编辑就很头痛&#xff0c;终于让我找到一个可行的方法了&#xff0c; 首先就这个加密文件右键选择打开方式-Google Chrome>>打开>>…

环形链表——java

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

2024年Q1季度洗衣机行业线上市场销售数据分析

Q1季度洗衣机线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;洗衣机累计销量约650万件&#xff0c;环比下降14%&#xff0c;同比下降14%&#xff1b;累计销售额约96亿元&#xff0c;环比下降30%&#…

军工单位安全内网文件导出,怎样做到严密的安全管控?

军工单位是指承担国家下达的军事装备、产品研制、生产计划任务的企、事业单位&#xff0c;主要包括电子工业部、航空工业总公司、航天工业总公司、兵器工业总公司、核工业总公司、船舶工业总公司、中国工程物理研究院及各省国防工业办公室等。 军工单位的特点主要体现在以下几个…

(学习日记)2024.04.20:UCOSIII第四十八节:各文件功能概览

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

和鲸科技出席第五届空间数据智能学术会议,执行总裁殷自强受邀发表主题报告

4月26日&#xff0c;由 ACM SIGSPATIAL 中国分会、ACM SIGMOD 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff0c;下简称“会议”&#xff09;在南京盛大开幕。本次会议特邀李清泉院士、周成虎院士、丛高教授、谢炯博士、张雪英教授等国内外知名…

Matlab|交直流混合配电网潮流计算(统一求解法)

目录 1 主要内容 算例模型 统一求解法迭代方程 算法流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序为matlab代码&#xff0c;采用统一求解法对交直流混合配电网进行潮流计算&#xff0c;统一迭代法又称统一求解法&#xff0c;其思路是将混联系统中的交流网…