瑞芯微Rockchip开发者社区
直播中

王树林

7年用户 1685经验值
私信 关注
[经验]

在RK3399Pro开发板或PC上使用RKNN Toolkit开发套件

RKNN Toolkit
Rockchip提供RKNN-Toolkit开发套件进行模型转换、推理运行和性能评估。
用户通过提供的 python 接口可以便捷地完成以下功能:
1)模型转换:支持 Caffe、Tensorflow、TensorFlow Lite、ONNX、Darknet 模型,支持RKNN 模型导入导出,后续能够在硬件平台上加载使用。
2)模型推理:能够在 PC 上模拟运行模型并获取推理结果,也可以在指定硬件平台RK3399Pro Linux上运行模型并获取推理结果。
3)性能评估:能够在 PC 上模拟运行并获取模型总耗时及每一层的耗时信息,也可以通过联机调试的方式在指定硬件平台 RK3399Pro Linux上运行模型,并获取模型在硬件上运行时的总时间和每一层的耗时信息。
RKNN Tookit仅支持Linux系统,可在3399pro开发板或PC上使用。
2.1. 程序安装
2.1.1. 在PC中安装
2.1.2. 在板子上安装
因为 板子因存储空间和CPU性能限制,而且 RKNN Toolkit 安装过程非常困难, 所以推荐安装在板子上安装 RKNN Toolkit Lite 只负责推理部分。
2.2. API调用流程
2.2.1. 模型转换

模型转换使用示例如下,详细请参考RKNN Tookit中的example。
from rknn.api import RKNN
INPUT_SIZE = 64
if __name__ == '__main__':
    # 创建RKNN执行对象
    rknn = RKNN()
    # 配置模型输入,用于NPU对数据输入的预处理
    # channel_mean_value='0 0 0 255',那么模型推理时,将会对RGB数据做如下转换
    # (R - 0)/255, (G - 0)/255, (B - 0)/255。推理时,RKNN模型会自动做均值和归一化处理
    # reorder_channel=’0 1 2’用于指定是否调整图像通道顺序,设置成0 1 2即按输入的图像通道顺序不做调整
    # reorder_channel=’2 1 0’表示交换0和2通道,如果输入是RGB,将会被调整为BGR。如果是BGR将会被调整为RGB
    #图像通道顺序不做调整
    rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2')
    # 加载TensorFlow模型
    # tf_pb='digital_gesture.pb'指定待转换的TensorFlow模型
    # inputs指定模型中的输入节点
    # outputs指定模型中输出节点
    # input_size_list指定模型输入的大小
    print('--> Loading model')
    rknn.load_tensorflow(tf_pb='digital_gesture.pb',
                         inputs=['input_x'],
                         outputs=['probability'],
                         input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])
    print('done')
    # 创建解析pb模型
    # do_quantization=False指定不进行量化
    # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
    print('--> Building model')
    rknn.build(do_quantization=False)
    print('done')
    # 导出保存rknn模型文件
    rknn.export_rknn('./digital_gesture.rknn')
    # Release RKNN Context
    rknn.release()
2.2.2. 模型推理

模型推理使用示例如下,详细请参考RKNN Tookit中的example。
import numpy as np
from PIL import Image
from rknn.api import RKNN
# 解析模型的输出,获得概率最大的手势和对应的概率
def get_predict(probability):
    data = probability[0][0]
    data = data.tolist()
    max_prob = max(data)
    return data.index(max_prob), max_prob
def load_model():
    # 创建RKNN对象
    rknn = RKNN()
    # 载入RKNN模型
    print('-->loading model')
    rknn.load_rknn('./digital_gesture.rknn')
    print('loading model done')
    # 初始化RKNN运行环境
    print('--> Init runtime environment')
    ret = rknn.init_runtime(target='rk3399pro')
    if ret != 0:
       print('Init runtime environment failed')
       exit(ret)
    print('done')
    return rknn
def predict(rknn):
    im = Image.open("../picture/6_7.jpg")   # 加载图片
    im = im.resize((64, 64),Image.ANTIALIAS)  # 图像缩放到64x64
    mat = np.asarray(im.convert('RGB'))    # 转换成RGB格式
    outputs = rknn.inference(inputs=[mat])   # 运行推理,得到推理结果
    pred, prob = get_predict(outputs)     # 将推理结果转化为可视信息
    print(prob)
    print(pred)
if __name__=="__main__":
    rknn = load_model()
    predict(rknn)
    rknn.release()

原作者:Firefly Wiki

更多回帖

发帖
×
20
完善资料,
赚取积分