從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
英文地址,請注明出處:http://en.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…