从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南

从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南

在嵌入式AI领域,将训练好的深度学习模型高效部署到边缘设备的NPU(神经网络处理器)上是提升性能的关键。本文将详细介绍如何在Ubuntu 20.04环境下,将YOLOv5l模型(.pt文件)通过ONNX中间格式,最终转换为适用于RK3588 NPU的RKNN模型(.rknn文件),并全程采用环境隔离技术确保无依赖冲突。

一、准备工作:构建干净的工作环境

环境污染是模型转换过程中最常见的问题之一,因此我们首先创建一个全新的工作区,确保所有操作在干净的环境中进行。

1. 清理与创建工作区

打开终端,执行以下命令清理可能存在的旧工作区并创建新的工作目录:

# 回到主目录
cd ~
# 删除旧的工作区(如果存在)
rm -rf rknn_workspace
# 创建新工作区并进入
mkdir rknn_workspace
cd rknn_workspace

2. 准备核心文件

在新工作区内,我们需要准备四个关键组成部分:YOLOv5源代码、预训练模型、校准图片集和图片列表文件。

# 1. 克隆YOLOv5官方仓库
git clone https://github.com/ultralytics/yolov5.git# 2. 下载yolov5l预训练模型
wget https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5l.pt# 3. 创建图片文件夹(用于模型量化校准)
mkdir images# 4. 生成图片列表文件(后续量化会用到)
find "$(pwd)/images" -name "*.jpg" > dataset.txt
find "$(pwd)/images" -name "*.png" >> dataset.txt

完成后,执行ls命令检查,确保工作区内包含以下内容:

  • yolov5(文件夹)
  • yolov5l.pt(模型文件)
  • images(文件夹)
  • dataset.txt(文件)

二、任务一:导出ONNX模型(隔离环境操作)

ONNX(Open Neural Network Exchange)是一种通用的模型中间格式,我们首先将PyTorch模型转换为ONNX格式。为避免依赖冲突,这一步将在独立的虚拟环境中进行。

1. 创建并激活虚拟环境

# 进入YOLOv5目录
cd yolov5
# 创建虚拟环境
python3 -m venv onnx_export_venv
# 激活虚拟环境
source onnx_export_venv/bin/activate

激活成功后,终端提示符前会显示(onnx_export_venv),表示当前处于隔离环境中。

2. 安装依赖库

为加快下载速度并确保版本兼容,我们使用清华源并锁定特定版本的ONNX库:

# 配置清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 升级pip
pip install --upgrade pip
# 安装YOLOv5依赖
pip install -r requirements.txt
# 安装特定版本的ONNX(与RKNN工具兼容)
pip install onnx==1.12.0

3. 导出ONNX模型

将预训练模型复制到当前目录并执行导出命令:

# 复制模型文件到当前目录
cp ../yolov5l.pt .# 导出ONNX模型(指定opset 11以确保兼容性)
python export.py --weights yolov5l.pt --include onnx --opset 11

4. 整理结果并清理环境

导出成功后,会生成yolov5l.onnx文件。我们将其移至工作区根目录,然后销毁当前虚拟环境(使命已完成):

# 将ONNX模型移至工作区根目录
mv yolov5l.onnx ../
# 退出虚拟环境
deactivate
# 返回工作区根目录
cd ..
# 删除虚拟环境(释放空间)
rm -rf ./yolov5/onnx_export_venv

此时,工作区根目录应已出现yolov5l.onnx文件,第一步转换完成。

三、任务二:转换为RKNN模型(独立隔离环境)

接下来,我们在全新的虚拟环境中使用RKNN-Toolkit2将ONNX模型转换为RK3588可识别的RKNN模型。

1. 创建并激活新虚拟环境

# 确保在rknn_workspace目录下
python3 -m venv rknn_convert_venv
# 激活环境
source rknn_convert_venv/bin/activate

终端提示符前会显示(rknn_convert_venv),表示进入新的隔离环境。

2. 安装RKNN-Toolkit2

# 配置清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 升级pip
pip install --upgrade pip
# 安装指定版本的RKNN-Toolkit2(与RK3588兼容)
pip install rknn-toolkit2==2.3.2

该命令会自动安装所有依赖的兼容版本库,无需手动干预。

3. 准备转换脚本

创建convert_rknn.py脚本,用于执行模型转换:

nano convert_rknn.py

复制以下代码到文件中:

from rknn.api import RKNNif __name__ == '__main__':rknn = RKNN(verbose=True)print('--> Config model')rknn.config(mean_values=[[0, 0, 0]],std_values=[[255, 255, 255]],target_platform='rk3588'  # 指定目标平台为RK3588)print('done')print('--> Loading model')ret = rknn.load_onnx(model='./yolov5l.onnx')if ret != 0:print('!!! Load yolov5l.onnx failed!')exit(ret)print('done')print('--> Building model')# 启用量化,并指定校准数据集ret = rknn.build(do_quantization=True, dataset='./dataset.txt')if ret != 0:print('!!! Build yolov5l.rknn failed!')exit(ret)print('done')print('--> Export rknn model')ret = rknn.export_rknn('./yolov5l.rknn')if ret != 0:print('!!! Export yolov5l.rknn failed!')exit(ret)print('done')rknn.release()

保存并退出(按Ctrl+O,回车,再按Ctrl+X)。

4. 准备量化校准图片

模型量化是提升NPU运行效率的关键步骤,需要20-30张代表性图片作为校准数据。如果没有现成图片,可以从视频中提取:

(1)安装OpenCV用于视频帧提取
pip install opencv-python
(2)创建视频帧提取脚本
nano extract_frames.py

复制以下代码:

import cv2
import os
import sys# 配置区 - 修改为你的视频路径
VIDEO_PATH = "/path/to/your/video.mp4"  # 替换为实际视频路径
OUTPUT_DIR = "images"
NUM_FRAMES_TO_EXTRACT = 30  # 提取30帧def extract_frames():if not os.path.exists(VIDEO_PATH):print(f"错误: 视频文件未找到! 路径: {VIDEO_PATH}")sys.exit(1)if not os.path.exists(OUTPUT_DIR):os.makedirs(OUTPUT_DIR)cap = cv2.VideoCapture(VIDEO_PATH)total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))if total_frames == 0:print("错误: 无法读取视频或视频为空。")cap.release()sys.exit(1)# 计算采样间隔,确保均匀取帧interval = total_frames // NUM_FRAMES_TO_EXTRACTif interval == 0:interval = 1print(f"视频总帧数: {total_frames}")print(f"计划提取 {NUM_FRAMES_TO_EXTRACT} 帧, 间隔 {interval} 帧。")frame_count = 0extracted_count = 0while cap.isOpened() and extracted_count < NUM_FRAMES_TO_EXTRACT:ret, frame = cap.read()if not ret:breakif frame_count % interval == 0:output_filename = os.path.join(OUTPUT_DIR, f"frame_{extracted_count:04d}.jpg")cv2.imwrite(output_filename, frame)print(f"已保存: {output_filename}")extracted_count += 1frame_count += 1cap.release()print(f"\n提取完成! 共保存 {extracted_count} 张图片到 '{OUTPUT_DIR}'。")if __name__ == "__main__":extract_frames()
(3)执行帧提取并更新数据集列表
# 修改脚本中的VIDEO_PATH为实际视频路径后执行
python3 extract_frames.py# 更新dataset.txt文件
find "$(pwd)/images" -name "*.jpg" > dataset.txt
find "$(pwd)/images" -name "*.png" >> dataset.txt

5. 执行RKNN转换

一切准备就绪后,运行转换脚本:

python3 convert_rknn.py

转换过程会持续几分钟,成功完成后会显示类似以下的日志:

I rknn-toolkit2 version: 2.3.2
...
I rknn building done.
done
--> Export rknn model
done

此时,工作区根目录会生成yolov5l.rknn文件,这就是RK3588 NPU可直接使用的模型文件。

四、常见问题与解决方案

  1. 错误:Dataset file ./dataset.txt not found!

    • 原因:未生成数据集列表文件或文件路径错误
    • 解决:确保images文件夹中有图片,并重新执行dataset.txt生成命令
  2. ONNX导出失败

    • 原因:YOLOv5版本与依赖库不兼容
    • 解决:使用本文指定的YOLOv5仓库和onnx==1.12.0版本
  3. RKNN转换时量化失败

    • 原因:校准图片数量不足或与模型场景不匹配
    • 解决:确保提供20-30张与模型应用场景相符的图片(如检测交通场景则提供交通图片)

五、总结与后续步骤

通过本文介绍的两步隔离环境转换法,我们成功将YOLOv5l模型转换为RK3588 NPU适用的RKNN模型,全程避免了依赖冲突问题。转换后的yolov5l.rknn文件可直接部署到RK3588设备。

后续步骤建议:

  1. yolov5l.rknn传输到已安装Ubuntu系统的RK3588开发板
  2. 使用RKNN-Toolkit2或RKNN Runtime API编写推理脚本
  3. 在RK3588上测试模型性能与精度,必要时进行优化调整

这种隔离环境的转换方法不仅适用于YOLOv5,也可推广到其他深度学习模型的RKNN转换过程,为嵌入式AI部署提供了可靠的技术参考。

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

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

相关文章

DNS的解析过程是怎样的?它基于传输层的什么协议?

问题DNS的解析过程是怎样的&#xff1f;它基于传输层的什么协议&#xff1f;我的回答&#xff1a;DNS解析过程是将域名转换为IP地址的一系列步骤。这个过程涉及多级缓存和查询&#xff1a;首先是浏览器缓存&#xff0c;浏览器会先检查自己的DNS缓存是否有记录。接着是操作系统缓…

模拟互联网大厂Java面试:电商场景下的技术探讨

模拟互联网大厂Java面试&#xff1a;电商场景下的技术探讨 场景概述 在这场模拟面试中&#xff0c;我们设定了一位互联网大厂的面试官与候选人小C之间的对话。面试官严肃专业&#xff0c;而小C则是搞笑的“水货程序员”。通过三轮问答&#xff0c;我们探索了Java技术栈在电商场…

遥感机器学习入门实战教程|Sklearn案例⑤:集成学习方法全览

在机器学习的实际应用中&#xff0c;单一分类器往往存在局限&#xff1a;比如决策树容易过拟合&#xff0c;kNN 对噪声敏感&#xff0c;逻辑回归在高维数据下收敛慢。为了提升整体效果&#xff0c;我们通常会采用 集成学习&#xff08;Ensemble Learning&#xff09;。 这篇文章…

大模型在垂直场景中的创新应用:搜索、推荐、营销与客服的新玩法

1. 引言 背景介绍:简述大模型(如GPT、BERT等)的发展历程及其在AI领域的核心作用,强调其在垂直场景中的潜力。 主题聚焦:说明本文将深入探讨搜索、推荐、营销、客服四大场景,分析大模型带来的创新开发方式。 目的与意义:阐述新玩法如何提升效率、增强用户体验,并推动行业…

华为仓颉语言的class(类)初步

华为仓颉语言的class&#xff08;类&#xff09;初步 class 概念 【官方文档 https://cangjie-lang.cn/docs?url%2F1.0.0%2Fuser_manual%2Fsource_zh_cn%2Fclass_and_interface%2Fclass.html 】 class 是仓颉面向对象体系的核心&#xff0c;用来描述“引用类型”对象。与 s…

健康常识查询系统|基于java和小程序的健康常识查询系统设计与实现(源码+数据库+文档)

健康常识查询系统 目录 基于java和小程序的健康常识查询系统设计与实现 一、前言 二、系统设计 三、系统功能设计 小程序功能设计 后台功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xf…

MySQL的高可用+MHA

即MySQL 主从复制高可用架构&#xff0c;是一套优秀的MySQL 高可用解决方案&#xff0c;由日本 DeNA 公司 youshimaton 开发&#xff0c;主要用于保障 MySQL 数据库在主服务器出现故障时&#xff0c;能快速进行主从切换&#xff0c;减少数据库服务中断时间。其核心特点包括&…

淘宝pc端首页做了哪些性能优化?

淘宝PC端首页作为中国电商领域流量最大的页面之一&#xff0c;其性能优化手段可以说是业界标杆&#xff0c;非常全面和深入。这些优化不是单一技术&#xff0c;而是一个完整的体系。 我们可以从以下几个层面来分析和理解淘宝首页所做的性能优化&#xff1a; 一、核心指标与整体…

让医学数据更直观——MedCalc 23.1.7 最新版使用体验

软件介绍 MedCalc 23.1.7是一款功能强大的生物医学研究统计软件&#xff0c;专为医学科研人员和医疗保健专家设计。它提供了丰富的统计分析工具和方法&#xff0c;旨在帮助用户更好地分析和解释医学数据。以下是该软件的一些主要特点&#xff1a; 一、数据导入和管理 支持导…

Text2SQL、ChatBI简介

概述 传统BI的三大核心瓶颈&#xff1a; 问数之难&#xff1a;不同用户往往存在个性化的分析逻辑&#xff0c;尽管企业内部已经创建大量报表和看板&#xff0c;但仍然无法完全满足业务部门对数据的个性化需求。但传统BI门槛较高&#xff0c;非技术人员在统一培训前&#xff0…

神经网络中 标量求导和向量求导

0. 引出问题 在神经网络反向传播过程中 loss [loss₁,loss₂, loss₃]&#xff0c;为什么 ∂loss/∂w ∂loss₁/∂w ∂loss₂/∂w ∂loss₃/∂w ∂loss₁/∂w 和 loss 维度一样都是三位向量 &#xff0c;[∂loss₁/∂w, ∂loss₂/∂w, ∂loss₃/∂w] 就变成3*3的矩阵 如下所…

tcpdump命令打印抓包信息

tcpdump命令打印抓包信息 下面是在服务器抓取打印服务端7701端口打印 rootgb:/home/gb# ifconfig -a eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.250.251.197 netmask 255.255.255.0 broadcast 10.250.251.255inet6 fe80::76fe:48ff:fe94:5a5 …

Mysql-经典实战案例(13):如何通过Federated实现跨实例访问表

实现原理&#xff1a;使用Federated引擎本创建一个链接表实现&#xff0c;但是Federated 引擎只是一个按列的顺序和类型解析远程返回的数据流准备工作&#xff1a; 1. 本地库启用 Federated 引擎查看是否已启用&#xff1a; SHOW ENGINES;如果Federated 引擎的 Support 是 YES …

Linux -- 动静态库

一、什么是库1、动静态库概念# 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个⼈的代码都从零开始&#xff0c;因此库的存在意义⾮同寻常。# 本质上来说库是⼀种可执⾏代码的⼆进制形式&#x…

Linux笔记---单例模式与线程池

1. 单例模式单例模式是一种常用的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式在需要控制资源访问、管理共享状态或协调系统行为时非常有用。单例模式的核心特点&#xff1a;私有构造函数&#xff1a;防止外部通过n…

Linux中的指令

1.adduseradduser的作用是创立一个新的用户。当我们在命令行中输入1中的指令后&#xff0c;就会弹出2中的命令行&#xff0c;让我们设立新的密码&#xff0c;紧接着就会让我们再次输入新的密码&#xff0c;对于密码的输入它是不会显示出来的&#xff0c;如果输入错误就会让我们…

【n8n】Docker容器中安装ffmpeg

容器化部署 n8n 时&#xff0c;常常会遇到一些环境依赖问题。缺少 docker 命令或无法安装 ffmpeg 是较为常见的场景&#xff0c;如果处理不当&#xff0c;会导致流程执行受限。 本文介绍如何在 n8n 容器中解决 docker 命令不可用和 ffmpeg 安装受限的问题&#xff0c;并给出多…

【基础算法】初识搜索:递归型枚举与回溯剪枝

文章目录一、搜索1. 什么是搜索&#xff1f;2. 遍历 vs 搜索3. 回溯与剪枝二、OJ 练习1. 枚举子集 ⭐(1) 解题思路(2) 代码实现2. 组合型枚举 ⭐(1) 解题思路请添加图片描述(2) 代码实现3. 枚举排列 ⭐(1) 解题思路(2) 代码实现4. 全排列问题 ⭐(1) 解题思路(2) 代码实现一、搜…

Node.js异步编程——async/await实现

一、async/await基础语法 在Node.Js编程中,async关键字用于定义异步函数,这个异步函数执行完会返回一个Promise对象,异步函数的内部可以使用await关键字来暂停当前代码的继续执行,直到Promise操作完成。 在用法上,async关键字主要用于声明一个异步函数,await关键字主要…

搭建一个简单的Agent

准备本案例使用deepseek&#xff0c;登录deepseek官网&#xff0c;登录账号&#xff0c;充值几块钱&#xff0c;然后创建Api key可以创建虚拟环境&#xff0c;python版本最好是3.12&#xff0c;以下是文件目录。test文件夹中&#xff0c;放一些txt文件做测试&#xff0c;main.p…