1. rknn-toolkit-lite介紹
rknn-toolkit-lite是用于python算法的推理的組件,當(dāng)前已經(jīng)在EASY-EAI-Nano完成適配,用戶可以用它進(jìn)行深度學(xué)習(xí)算法的純python開發(fā)。而且同時(shí)支持已經(jīng)進(jìn)行了預(yù)編譯的模型,短短幾行代碼即可完成算法的推理,大幅降低開發(fā)成本。同時(shí)很多不熟悉C/C++的算法開發(fā)人員有效降低開發(fā)門檻。本地文檔是根據(jù)已經(jīng)完成rknn模型轉(zhuǎn)換的模型進(jìn)行板卡上的推理,關(guān)于rknn模型轉(zhuǎn)換請(qǐng)閱讀請(qǐng)閱讀《在EASY EAI Nano運(yùn)行自定義的AI算法》。
2. 固件燒錄
當(dāng)前我們通過系統(tǒng)預(yù)裝的方式支持rknn-toolkit-lite,燒錄固件方式請(qǐng)閱讀《固件燒錄與更新》。
固件下載鏈接:https://pan.baidu.com/s/1sWFoPf6oJtZsUPp-_do7AQ
提取碼:1234
固件包如下所示:
3. 在板卡測(cè)試demo
下載百度網(wǎng)盤:https://pan.baidu.com/s/1yoof_SyY1ty93dIRe1dZgA (提取碼:1234 )
“測(cè)試程序/inference_with_lite.tar.bz2”,把文件傳到EASY-EAI-Nano板卡目錄上。
執(zhí)行以下指令進(jìn)行解壓:
tar xvf inference_with_lite.tar.bz2

執(zhí)行以下指令切換目錄并執(zhí)行測(cè)試程序:
cd /userdata/inference_with_lite/ python3 test.py
結(jié)果如下所示:
4. rknn-toolkit-lite流程說明
4.1 使用流程圖
RKNN Tookit Lite使用流程如下:
4.2 例程
第三小節(jié)的例程如下所示:
import platform import cv2 import numpy as np from rknnlite.api import RKNNLite RKNN_MODEL = '10class_ResNet50_pre.rknn' IMG_PATH = './test-1.jpg' INPUT_SIZE = 224 BOX_THRESH = 0.25 NMS_THRESH = 0.6 CLASSES = ("SUV", "bus", "family sedan", "fire engine", "heavy truck", "jeep", "minibus", "racing car", "taxi", "truck") def show_outputs(output): print("softmax output:", output) max_confidence = np.max(output) index = np.where(output == max_confidence) print("max confidence:", max_confidence) print("max confidence index:", index[0][0]) print("CLASSES predict: ", CLASSES[index[0][0]]) def softmax(x): return np.exp(x)/sum(np.exp(x)) if __name__ == '__main__': rknn_lite = RKNNLite() # load RKNN model print('--> Load RKNN model') ret = rknn_lite.load_rknn(RKNN_MODEL) if ret != 0: print('Load RKNN model failed') exit(ret) print('done') # Set inputs img = cv2.imread(IMG_PATH) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) resize_img = cv2.resize(img,(224,224)) # init runtime environment print('--> Init runtime environment') ret = rknn_lite.init_runtime(target=None) if ret != 0: print('Init runtime environment failed') exit(ret) print('done') # Inference print('--> Running model') outputs = rknn_lite.inference(inputs=[resize_img]) print("outputs[0]:", outputs[0]) print("outputs[0].shape:", outputs[0].shape) show_outputs(softmax(np.array(outputs[0][0]))) rknn_lite.release()
5. API詳細(xì)說明
5.1 RKNNLite初始化及對(duì)象釋放
在使用RKNN Toolkit Lite時(shí),都需要先調(diào)用RKNNLite()方法初始化一個(gè)RKNNLite對(duì)象,并在用完后調(diào)用該對(duì)象的release()方法將資源釋放掉。
初始化RKNNLite對(duì)象時(shí),可以設(shè)置verbose和verbose_file參數(shù),以打印詳細(xì)的日志信息。其中verbose參數(shù)指定是否要在屏幕上打印詳細(xì)日志信息;如果設(shè)置了verbose_file參數(shù),且verbose參數(shù)值為True,日志信息還將寫到這個(gè)參數(shù)指定的文件中。
舉例如下:
# 將詳細(xì)的日志信息輸出到屏幕,并寫到inference.log文件中 rknn_lite = RKNNLite(verbose=True, verbose_file='./inference.log') # 只在屏幕打印詳細(xì)的日志信息 rknn_lite = RKNNLite(verbose=True) … rknn_lite.release()
5.2 加載RKNN模型
API | Load_rknn |
描述 | 加載RKNN模型。 |
參數(shù) | path:RKNN模型文件路徑 |
load_model_in_npu: 是否直接加載npu中的rknn模型。其中path為rknn模型在npu中的路徑。只有當(dāng)RKNN Toolkit Lite運(yùn)行在連有NPU設(shè)備的PC上或RK3399Pro Linux開發(fā)板時(shí)才可以設(shè)為True。默認(rèn)值為False. | |
返回值 | 0:加載成功 |
-1:加載失敗 |
舉例如下:
# 從當(dāng)前目錄加載 ResNet50模型 ret = rknn_lite.load_rknn('10class_ResNet50_pre.rknn')
5.3 初始化運(yùn)行時(shí)環(huán)境
在模型推理之前,必須先初始化運(yùn)行時(shí)環(huán)境,確定模型在哪一個(gè)芯片平臺(tái)上運(yùn)行。
API | init_runtime |
描述 | 初始化運(yùn)行時(shí)環(huán)境。確定模型運(yùn)行的設(shè)備信息(芯片型號(hào)、設(shè)備 ID)。 |
參數(shù) | target:目標(biāo)硬件平臺(tái),目前支持“rk3399pro”、“rk1806”、“rk1808”、“rv1109”、 “rv1126”。默認(rèn)為 None,將根據(jù)應(yīng)用所運(yùn)行的開發(fā)板自動(dòng)選擇。 |
device_id:設(shè)備編號(hào),如果 PC 連接多臺(tái)智能設(shè)備時(shí),需要指定該參數(shù),設(shè)備編號(hào)可 以通過”list_devices”接口查看。默認(rèn)值為 None。 | |
async_mode:是否使用異步模式。調(diào)用推理接口時(shí),涉及設(shè)置輸入圖片、模型推理、 獲取推理結(jié)果三個(gè)階段。如果開啟了異步模式,設(shè)置當(dāng)前幀的輸入將與推理上一幀同 時(shí)進(jìn)行,所以除第一幀外,之后的每一幀都可以隱藏設(shè)置輸入的時(shí)間,從而提升性能。 在異步模式下,每次返回的推理結(jié)果都是上一幀的。該參數(shù)的默認(rèn)值為 False。 | |
返回值 | 0:加載成功 |
-1:加載失敗 |
舉例如下:
# init runtime environment print('--> Init runtime environment') ret = rknn_lite.init_runtime(target=None) if ret != 0: print('Init runtime environment failed') exit(ret) print('done')
5.4 模型推理
API | inference |
描述 | 對(duì)指定輸入進(jìn)行推理,返回推理結(jié)果。 |
參數(shù) | inputs:待推理的輸入,如經(jīng)過 cv2 處理的圖片。類型是 list,列表成員是 ndarray。 |
data_type:輸入數(shù)據(jù)的類型,可填以下值:’float32’, ‘float16’, ‘uint8’, ‘int8’, ‘int16’。 默認(rèn)值為’uint8’。 | |
data_format:數(shù)據(jù)模式,可以填以下值: “nchw”, “nhwc”。默認(rèn)值為’nhwc’。這兩個(gè)的 不同之處在于 channel 放置的位置。 | |
inputs_pass_through: 將輸入透?jìng)鹘o NPU 驅(qū)動(dòng)。非透?jìng)髂J较?,在將輸入傳給 NPU 驅(qū) 動(dòng)之前,工具會(huì)對(duì)輸入進(jìn)行減均值、除方差等操作;而透?jìng)髂J较?,不?huì)做這些操作。 這個(gè)參數(shù)的值是一個(gè)數(shù)組,比如要透?jìng)?input0,不透?jìng)?input1,則這個(gè)參數(shù)的值為[1, 0]。默認(rèn)值為 None,即對(duì)所有輸入都不透?jìng)鳌?/td> | |
返回值 | results:推理結(jié)果,類型是 list,列表成員是 ndarray。 |
舉例如下:
以分類模型為例,如 resnet50,代碼如下(完整代碼參考第三小節(jié)):
# Inference print('--> Running model') outputs = rknn_lite.inference(inputs=[resize_img]) print("outputs[0]:", outputs[0]) print("outputs[0].shape:", outputs[0].shape) show_outputs(softmax(np.array(outputs[0][0])))
5.5 查詢 SDK 版本
API | get_sdk_version |
描述 |
獲取 SDK API 和驅(qū)動(dòng)的版本號(hào)。 注:使用該接口前必須完成模型加載和初始化運(yùn)行環(huán)境。 |
參數(shù) | 無 |
返回值 | sdk_version:API 和驅(qū)動(dòng)版本信息。類型為字符串 |
舉例說明:
# 獲取 SDK 版本信息 …… sdk_version = rknn_lite.get_sdk_version() ……
返回的 SDK 信息如下:
審核編輯 黃宇
-
API
+關(guān)注
關(guān)注
2文章
1556瀏覽量
63354 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5432瀏覽量
101236 -
SDK
+關(guān)注
關(guān)注
3文章
1058瀏覽量
47438 -
rv1126
+關(guān)注
關(guān)注
0文章
106瀏覽量
3288
發(fā)布評(píng)論請(qǐng)先 登錄
基于RV1126開發(fā)板實(shí)現(xiàn)人臉檢測(cè)方案

基于RV1126開發(fā)板實(shí)現(xiàn)人臉檢測(cè)方案

基于RV1126開發(fā)板實(shí)現(xiàn)人臉識(shí)別方案

基于RV1126開發(fā)板實(shí)現(xiàn)人臉檢測(cè)方案

基于RV1126開發(fā)板實(shí)現(xiàn)安全帽檢測(cè)方案

基于RV1126開發(fā)板實(shí)現(xiàn)駕駛員行為檢測(cè)方案

基于RV1126開發(fā)板實(shí)現(xiàn)人員檢測(cè)方案

基于RV1126開發(fā)板的音頻硬件電路設(shè)計(jì)

基于RV1126開發(fā)板網(wǎng)絡(luò)配置方法

RV1126 實(shí)現(xiàn)人臉檢測(cè)方案

評(píng)論