目錄
一、任務(wù)介紹
二、實(shí)驗(yàn)過(guò)程
2.1 使用正確版本的yolov5進(jìn)行訓(xùn)練(平臺(tái):x86機(jī)器windows系統(tǒng))
2.2 best.pt轉(zhuǎn)換為best.onnx(平臺(tái):x86機(jī)器window系統(tǒng))
2.3 best.onnx轉(zhuǎn)換為best.rknn(平臺(tái):x86機(jī)器Linux系統(tǒng))
2.3.1 環(huán)境準(zhǔn)備和工具包安裝
2.3.2 onnx轉(zhuǎn)換為rknn
2.4 RK3588部署rknn實(shí)現(xiàn)NPU加速(平臺(tái):aarch板子Linux系統(tǒng))
三、總結(jié)
一、任務(wù)介紹
????????瑞芯微RK3588是一款搭載了NPU的國(guó)產(chǎn)開發(fā)板。NPU(neural-network processing units)可以說(shuō)是為了嵌入式神經(jīng)網(wǎng)絡(luò)和邊緣計(jì)算量身定制的,但若想調(diào)用RK3588的NPU單元進(jìn)行推理加速,則需要首先將模型轉(zhuǎn)換為.rknn格式的模型,否則無(wú)法使用。
? ? ? ? 這次我們的任務(wù)是將yolov5訓(xùn)練得到的pt模型,一步步轉(zhuǎn)換為rknn模型,并將rknn模型部署在搭載RK3588的StationPC M3主機(jī)上,使用NPU推理。(官網(wǎng)NPU教程:NPU使用 — Firefly Wiki)查閱資料和官網(wǎng)后發(fā)現(xiàn)轉(zhuǎn)換和使用過(guò)程分以下幾步,首先總結(jié)給大家,后文細(xì)說(shuō):
1.使用正確版本(v5.0)的yolov5進(jìn)行訓(xùn)練得到pt模型;
2.將pt模型使用yolov5工程中的export.py轉(zhuǎn)換為onnx模型;
3.將onnx模型使用rknn-toolkit2中onnx文件夾的test.py轉(zhuǎn)換為rknn模型;
4.在板子上使用rknpu2工具調(diào)用rknn模型,實(shí)現(xiàn)NPU推理加速。
? ? ? ? 接下來(lái)進(jìn)行詳細(xì)介紹。
二、實(shí)驗(yàn)過(guò)程
2.1 使用正確版本的yolov5進(jìn)行訓(xùn)練(平臺(tái):x86機(jī)器windows系統(tǒng))
? ? ? ? 在這次任務(wù)之前,博主本人甚至不知道yolov5有不同的版本(小白落淚),更不知道用不同版本訓(xùn)練得到的pt模型會(huì)決定rknn模型轉(zhuǎn)換的成功與否。一開始我使用的是最新版本的yolov5(大概是v7.0)進(jìn)行訓(xùn)練,最后模型轉(zhuǎn)換自然是不成功。網(wǎng)上也有許多使用新版本yolov5訓(xùn)練,之后修改onnx模型的教程,但都比較麻煩。人菜就要跟著官方教程做,請(qǐng)看官方教程:
rknn-toolkit/examples/pytorch/yolov5 at master · rockchip-linux/rknn-toolkit · GitHub
? ? ? ? 需要指出的是,雖然我們后面要使用的是rknn-toolkit2工具進(jìn)行模型轉(zhuǎn)換,但教程卻在rknn-toolkit工程中,github二者的父目錄如圖:
? ? ? ? ?進(jìn)入rknn-toolkit工程,瀏覽至/example/pytorch/yolov5,在README中赫然寫著:
? ? ? ? 這就是我們本次要使用的“正確版本的yolov5” ,怕麻煩的讀者請(qǐng)一定按照這個(gè)id去yolov5官網(wǎng)找到工程并克隆下來(lái)。進(jìn)入yolov5官網(wǎng)GitHub - ultralytics/yolov5: YOLOv5 ?? in PyTorch > ONNX > CoreML > TFLite
在右上角搜索這個(gè)commit id并進(jìn)入“In this repository”,如圖所示:
? ? ? ? ?進(jìn)入commits,點(diǎn)擊右邊的commit id,再次進(jìn)入后點(diǎn)擊Browse files,如下三圖所示:
? ? ? ? commit id:
? ? ? ? Browse files:
? ? ? ? 對(duì)應(yīng)版本的源碼:
????????非常棒,至此我們已經(jīng)找到了正確版本的yolov5!接下來(lái)就是把代碼克隆到本地或者云服務(wù)器,開始訓(xùn)練自己的pt模型;此處實(shí)際上是yolov5 5.0版本的工程,其中未包含預(yù)訓(xùn)練模型yolov5s.pt,需要我們自行下載,在releasesl鏈接中找到V5.0下載yolov5s.pt,鏈接如下:
https://github.com/ultralytics/yolov5/releases
? ? ? ? 關(guān)于yolov5的運(yùn)行環(huán)境配置、參數(shù)修改和訓(xùn)練命令,網(wǎng)上教程很多,滿足package的要求,可以開始訓(xùn)練收斂即可,不作為本文重點(diǎn)。最終在經(jīng)過(guò)若干輪訓(xùn)練后,我們得到了自己的best.pt模型,本部分告一段落。
2.2 best.pt轉(zhuǎn)換為best.onnx(平臺(tái):x86機(jī)器window系統(tǒng))
? ? ? ? 此處依然參考rknn-toolkit工程中的教程進(jìn)行轉(zhuǎn)換,切記以下步驟!??!
? ? ? ? 注意:在訓(xùn)練時(shí)不要修改yolo.py的這段代碼,訓(xùn)練完成后使用export.py進(jìn)行模型導(dǎo)出轉(zhuǎn)換時(shí)一定要進(jìn)行修改,不然會(huì)導(dǎo)致后面的rknn模型轉(zhuǎn)換失敗!?
? ? ? ? 修改后將best.pt移動(dòng)至export.py同一文件夾下,在命令行調(diào)用以下命令:
python export.py --weights best.pt --img 640 --batch 1 --include onnx
? ? ? ? 我們便可以得到成功轉(zhuǎn)換的模型best.onnx。
2.3 best.onnx轉(zhuǎn)換為best.rknn(平臺(tái):x86機(jī)器Linux系統(tǒng))
2.3.1 環(huán)境準(zhǔn)備和工具包安裝
? ? ? ? 有了以上的best.onnx模型作為基礎(chǔ),現(xiàn)在可以正式開始rknn模型的轉(zhuǎn)換了。此處的轉(zhuǎn)換工具rknn-toolkit2只能在Linux系統(tǒng)上運(yùn)行,這里我使用的是PC上的Ubuntu虛擬機(jī)。在上文提到的鏈接中下載rknn-toolkit2,下載后的文件夾如圖:
? ? ? ? 首先安裝rknn-toolkit2的環(huán)境,?其環(huán)境要求在./doc/requirements_cp38-1.4.0.txt中,這里我使用的是miniconda創(chuàng)建的python3.8虛擬環(huán)境,和windows下anaconda使用方法類似,方便且占用空間小,推薦大家在管理python環(huán)境時(shí)使用。創(chuàng)建環(huán)境并命名為rknn,使用pip安裝requirements_cp38-1.4.0.txt中的包,過(guò)程如下圖:
? ? ? ? ?環(huán)境滿足需求后便可以安裝rknn-toolkit2工具包了,瀏覽至./packages中,輸入以下命令:
pip install rknn_toolkit2-1.4.0_22dcfef4-cp38-cp38-linux_x86_64.whl
? ? ? ? 提示安裝完成后我們可以檢查是否安裝成功,在終端中運(yùn)行python,輸入:
from rknn.api import RKNN
? ? ? ? 若不報(bào)錯(cuò)說(shuō)明我們的工具包已經(jīng)安裝成功,之后便可進(jìn)行rknn模型的轉(zhuǎn)換了~
2.3.2 onnx轉(zhuǎn)換為rknn
? ? ? ? 在rknn-toolkit2工程文件夾中瀏覽至./examples/onnx/yolov5,將我們?cè)?.2中轉(zhuǎn)換得到的best.onnx復(fù)制到該文件夾下,修改該文件夾下的test.py中的內(nèi)容為自己模型的名字,要修改的地方如下:
?????????在這個(gè)test.py的main函數(shù)中(在第239行附近)可以了解到這個(gè)python文件的作用:
? ? ? ?【?配置——加載onnx模型—導(dǎo)出rknn模型——rknn模型推理——后處理——輸出結(jié)果】
? ? ? ? 運(yùn)行test.py,神奇的轉(zhuǎn)換過(guò)程就開始了...
python test.py
? ? ? ? 最終彈窗得到post process result,若結(jié)果正確,說(shuō)明我們的rknn模型轉(zhuǎn)換成功了!這里的test.py構(gòu)建了一個(gè)虛擬的NPU運(yùn)行環(huán)境,模擬在RK3588上真實(shí)運(yùn)行的情況。結(jié)果正確說(shuō)明離最終完成任務(wù)只差部署在板子上這一步了。
?????????這時(shí)在當(dāng)前文件夾./example/onnx/yolov5中可以看到生成的best.rknn模型。至此,我們離勝利就不遠(yuǎn)了。
2.4 RK3588部署rknn實(shí)現(xiàn)NPU加速(平臺(tái):aarch板子Linux系統(tǒng))
? ? ? ? 終于RK3588板子登場(chǎng)的時(shí)候了,但如果它還是原生的安卓系統(tǒng),請(qǐng)按官網(wǎng)教程給它安裝一個(gè)Linux系統(tǒng)吧。我這里使用TF卡燒錄安裝了Ubuntu系統(tǒng)。
? ? ? ? 依然找到官網(wǎng),下載其中的rknpu2工具,鏈接如下:https://github.com/rockchip-linux/rknpu2
? ? ? ? 這一部分借鑒了該博客,十分詳細(xì),大家可以將轉(zhuǎn)換后的best.rknn模型復(fù)制到板子上,并按照這個(gè)步驟進(jìn)行操作:yolov5訓(xùn)練并生成rknn模型以及3588平臺(tái)部署_新鑫信心的博客-CSDN博客_rknn yolov5
?????????最終安裝的命令如上圖最后一行代碼所示,第一個(gè)參數(shù)為生成的推理程序,第二個(gè)參數(shù)為我們之前訓(xùn)練和轉(zhuǎn)換得到的best.rknn模型,第三個(gè)參數(shù)為待檢測(cè)的圖片。最終會(huì)輸出推理結(jié)果out.jpg。若讀者想要在自己編寫的python代碼中調(diào)用該程序,可以使用subprocess.Popen()命令,我書寫的代碼段如下,僅供參考:
p = subprocess.Popen(['./rknn_yolov5_demo', './model/RK3588/best.rknn', './defect_det.jpg'])
p.wait()
picDetected = cv2.imread('out.jpg')
??????? 我得到的out.jpg如下,一個(gè)簡(jiǎn)單的二分類缺陷檢測(cè):
??????? 到了這一步,我們已經(jīng)成功完成了任務(wù),撒花~~~但調(diào)用了NPU之后,與CPU相比究竟有沒有實(shí)現(xiàn)加速呢?這里進(jìn)行一個(gè)對(duì)比:
????????NPU推理速度(69ms左右):
????????CPU推理速度(2.16s左右):?
? ? ? ? 推理速度快了30多倍!NPU還是很給力的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-777399.html
三、總結(jié)
? ? ? ? 本文比較好地實(shí)現(xiàn)了yolov5模型從訓(xùn)練pt模型,到轉(zhuǎn)換為rknn模型,最終部署在RK3588板子上使用NPU加速推理的過(guò)程。其它教程指出也可以使用rknn-toolkit-lite在RK3588上完成部署,這部分沒有時(shí)間驗(yàn)證了,歡迎大家進(jìn)行探索。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-777399.html
到了這里,關(guān)于yolov5訓(xùn)練pt模型并轉(zhuǎn)換為rknn模型,部署在RK3588開發(fā)板上——從訓(xùn)練到部署全過(guò)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!