前言:这个板子网上的资料很少,我就当做日记来写一写经历。

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件

固件、环境搭建等官方教程 http://t.rock-chips.com/wiki.php?mod=view&id=14

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_Image_02

  社区里有一些很好的项目案例教程以及疑难提问与解答,推荐多留意, 社区链接  http://t.rock-chips.com/forum.php

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_Image_03

一. linux环境搭建(开发板预安装fedora28)

1.步骤

下载固件

——> 

烧写固件(我是通过Win主机烧录的固件:因为是安卓与linux双系统,我只需linux的,故欲单烧linux系统则在教程的第5步导入config_linux 配置)

注:导入配置时注意路径正确

——> 

开机启动(连电源线后按电源键,进入linux系统)

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_04

 

2. 模型转换

目前支持 Caffe、Tensorflow、TensorFlow Lite、ONNX、Darknet 共5种模型(听说下个版本更新会支持Pytorch模型),这5种都可以直接转为rknn模型从而在板子上实现npu的推理加速,Pytorch则需要先转为ONNX再转成rknn

(1). 安装环境 (若安好,则运行 from rknn.api import RKNN  不会报错)

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_05

 其中云盘里的内容如下:

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件_06

 

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件_07

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_08

注:对于上图,packages文件夹里的3个关于RKNN-Toolkit的whl文件的选择问题,按《RKNN-Toolkit使用指南_V1.0.0.pdf》里的如下操作

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_Image_09

安装时,比如执行sudo apt install virtualenv等会报错,实际上这些安装虚拟环境的指令是并不需要的,只需如下的2条指令就可以了

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件_10

(2) .模型转换执行代码

如下是官网给出的tensorflow模型转rknn模型的代码:

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()

如下是我仿照官方教程写的onnx模型转rknn模型的代码:

(注:建议把代码写放到txt文件,如命名transform.py,然后在命令窗口直接执行 python3 transform.py 即可,注意切换到txt路径)

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_11

其余的转rknn模型的方式见《RKNN-Toolkit使用指南_V1.0.0.pdf》里的3.5.2节模型加载部分:

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_12

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_Image_13

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_14

 

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_python_15

 

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件_16

(3).备注:pytorch转onnx文件的方法

import torch.onnx
import torchvision

input = torch.randn(10, 3, 224, 224).cuda()
model = torchvision.models.alexnet(pretrained=True).cuda()
torch.onnx.export(model, input, "alexnet.onnx", verbose=True)

3. 模型推理

官方代码如下:

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()

 我仿照以上代码,实现如下:

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_Image_17

 

注:执行指令时,要用python3开头,而不能是python,否则安装的rknn.api会找不到,见下图

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件_18

二 .目前遇到的问题

1. 含上采样的onnx模型一律无法转换至rknn模型

经咨询,到目前为止,该板子对tf的支持是最齐全的,其余4种多多少少都不全,更不要提对pytorch的支持了。官方只是说,未来会更新,直至支持pytorch与tf2.0 。。。

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_Image_19

怎样检查rk3288开发板是否安装了rsync rk3399开发板怎么用_固件_20

2. 性能目前感觉并不像介绍的那样好,比较失望,兼容性较差,相比英伟达家的tx2还是差的不少