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上使用。

程序安装

RKNN Toolkit可从此链接中下载:下载链接 (提取码:17t4)

在3399Pro中安装

Fedora 28

发布的Fedora中已经配置好RKNN开发环境

基础依赖安装:

sudo dnf install -y cmake gcc gcc-c++ protobuf-devel protobuf-compiler lapack-devel \
python3-devel python3-opencv python3-numpy-f2py python3-h5py python3-lmdb  python3-grpcio

安装RKNN Toolkit及其依赖:

pip3 install --user scipy-1.2.0-cp36-cp36m-linux_aarch64.whl \
    fedora28/onnx-1.4.1-cp36-cp36m-linux_aarch64.whl \
    tensorflow-1.10.1-cp36-cp36m-linux_aarch64.whl \
    rknn-toolkit/packages/rknn_toolkit-1.3.0-cp36-cp36m-linux_aarch64.whl

Ubuntu 18.04

基础依赖安装:

sudo apt-get update
sudo apt-get install -y cmake python3 python3-pip python3-opencv \
    python3-h5py python3-lmdb libhdf5-serial-dev libgfortran5-dbg \
    protobuf-compiler libopenblas-dev gfortran libprotoc-dev

安装RKNN Toolkit及其依赖:

pip3 install --user Cython \
    numpy==1.14.5 \
    protobuf==3.11.2 \
    onnx \
    scipy-1.2.0-cp36-cp36m-linux_aarch64.whl \
    tensorflow-1.10.1-cp36-cp36m-linux_aarch64.whl
    rknn-toolkit/packages/rknn_toolkit-1.3.0-cp36-cp36m-linux_aarch64.whl

这里推荐一次安装完RKNN Toolkit及其依赖防止部分依赖被重复安装且版本对应不上。

如果安装后,使用的过程中出现如下错误:

Traceback (most recent call last):
  File "object_server.py", line 1, in <module>
    from rk_socket_class import rk_socket_server
  File "/home/firefly/master_rockx_demo/1808/rk_socket_class.py", line 2, in <module>
    import numpy as np
  File "/home/firefly/.local/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
    from . import core
  File "/home/firefly/.local/lib/python3.6/site-packages/numpy/core/__init__.py", line 74, in <module>
    raise ImportError(msg.format(path))
ImportError: Something is wrong with the numpy installation. While importing we detected an older version of numpy in ['/home/firefly/.local/lib/python3.6/site-packages/numpy']. One method of fixing this is to repeatedly uninstall numpy.

请使用如下解决方法:

# 重复执行如下命令直到没有已安装的任何版本的numpy
pip3 uninstall numpy
# 然后执行如下命令安装numpy
pip3 install --user numpy==1.14.5

在Ubuntu中请勿使用Fedora的onnx-1.4.1-cp36-cp36m-linux_aarch64.whl这个包

在PC中安装

Ubuntu 16.04

基础安装:

sudo apt-get install -y python3 python3-pip libglib2.0-dev \
        libsm-dev libxrender-dev libxext-dev

安装RKNN Toolkit:

pip3 install --user -r rknn-toolkit/packages/requirements-cpu.txt
pip3 install --user rknn-toolkit/packages/rknn_toolkit-1.3.0-cp35-cp35m-linux_x86_64.whl

如果PC中有GPU加速则用requirements-gpu.txt替换requirements-cpu.txt。

Ubuntu 18.04

步骤如Ubuntu 16.04,只需将rknn_toolkit-1.3.0-cp35-cp35m-linux_x86_64.whl替换为rknn_toolkit-1.3.0-cp36-cp36m-linux_x86_64.whl

程序升级(1.0.0 -> 1.3.0)

在3399Pro中

Ubuntu 18.04

sudo apt-get install libopenblas-dev gfortran libprotoc-dev
pip3 install --user -U  rknn-toolkit/packages/rknn_toolkit-1.3.0-cp36-cp36m-linux_aarch64.whl

在PC中

Ubuntu 18.04

pip3 install --user -r rknn-toolkit/packages/requirements-cpu.txt
pip3 install --user -U rknn-toolkit/packages/rknn_toolkit-1.3.0-cp36-cp36m-linux_x86_64.whl

如果PC中有GPU加速则用requirements-gpu.txt替换requirements-cpu.txt。

Ubuntu 16.04

pip3 install --user -r rknn-toolkit/packages/requirements-cpu.txt
pip3 install --user -U rknn-toolkit/packages/rknn_toolkit-1.3.0-cp35-cp35m-linux_x86_64.whl

API调用流程

模型转换

_images/rknn_toolkit_flowchart.png

模型转换使用示例如下,详细请参考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()

模型推理

_images/rknn_toolkit_inference_flowchart.png

模型推理使用示例如下,详细请参考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()

API

详细的API请参考RKNN-Toolkit中的使用指南文档:《RKNN-Toolkit使用指南_V*.pdf》