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

切克切克闹

11年用户 467经验值
私信 关注
[问答]

如何在PC-ubuntu下搭建一种rknn模拟环境呢

PC-ubuntu系统下tensorflow+keras虚拟环境该怎样去搭建呢?

如何在PC-ubuntu下搭建一种rknn模拟环境呢?

回帖(1)

李天氍

2022-2-14 10:27:13
1.前言

官方论坛说明

V1.6.0 主要说明:


  • 支持Keras框架,并且支持TF 2.0导出的h5模型
  • 支持Pytorch 1.6.0
  • 支持ONNX 1.6.0
  • 增加模型加密功能
  • 新增更多OP支持以及Bug修复

Drv需要更新到 >= 1.5.0
  V1.4.0 主要说明:


  • 增加逐层量化分析子功能;
  • 输入预处理支持多个std_value;
  • 支持从开发板导出预编译模型。
  • 优化channel_mean_value参数,改为mean_values/std_values;
  • 移除load_tensorflow接口中的mean_values和std_values;
  • 可视化完善对多输入的支持,增加对RK1806/RV1109/RV1126的支持;
  • 精度分析功能增加非归一化的余弦距离和欧式距离;
  • 修复已知bug。

  V1.3.0 主要说明:


  • 从该版本开始我们建议各位切换到debian10,并且直接使用apt和pip命令进行在线更新即可(计算棒dnf update)。

  • rk3399prod Fedora不再支持rknn在线更新,请各位尽早切换到debian10使用。
  • 该版本主要更新了pytorch(1.2)和mxnet的模型支持
  • 该版本新增了RKNN的UI显示功能(具体请看文档)

V1.2.0 主要说明:


  • 建议添加RK官方pip源安装,较为方便,开发版、PC、MAC均可使用该源下载rknn-toolkit。(新版固件会自带该源)
  • Tensorflow for aarch64已纳入该官方pip源,可直接安装。
  • Tensorflow 2.0 由于一些第三方库还未支持,目前rknn暂不支持tf2.0,请勿升级使用。
  • rknntoolkit和rknnapi需要版本匹配,模型如果早于rknntoolkit 1.1以前生成的需要重新生成,否则运行可能会出问题。
    API: 1.2.1
    DRV: 0.9.9/1.2.0

简单来说,可以理解为:
支持tensorflow1(keras)、pytorch、mxnet开发;
模型可以在PC(linux)、开发板、mac上编译运行;
本次安装最新版本是rknn-toolkit-1.3.2

2.PC-ubuntu系统下tensorflow+keras虚拟环境搭建

如果你刚开始使用tensorflow或者keras,或者还没有安装建议参看一下我前面讲解安装相关的内容:
注意:建议安装python3.6.3的版本,太高和太低的版本都会和torch1.6或者rknn系列多多少少有一些不必要的麻烦

(建议使用linux版本,因为win无法正常安装rknn-api;mac只是支持转化模型、不支持模型推理过程)

3.在PC-ubuntu下搭建rknn模拟环境搭建

在安装完成tensorflow1.14之后,rknn模型需要安装相关支持的软件:
(这个因为我是新安装的anaconda虚拟环境,所以缺少的比较多,此处都记录下来。如果你环境中已经有的话,自行选择缺少的安装包安装)
(建议在自己的虚拟环境中安装)

pip install ruamel.yaml==0.15.81 flatbuffers==1.10 flask==1.0.2  lmdb==0.93 requests==2.22.0 onnx==1.6.0 numpy==1.16.3 dill==0.2.8.2 networkx==1.11 Pillow==5.3.0 ply==3.11 h5py==2.8.0 psutil==5.6.2 protobuf==3.11.2 scipy==1.3.0 onnx-tf==1.2.1


最后才是安装RKNN

pip install rknn-toolkit -i http://repo.rock-chips.com/pypi/simple --trusted-host repo.rock-chips.com


4.相关转化代码

(1) h5 -> tflite

(2) tflite -> rknn

或者其他实例,在搭建好的PC-UBUNTU系统上,将自己的模型转化成相关.rknn文件。
下面以官方demo(mobilenet-v1)为例,说明tflite -> rknn模型转化。

import numpy as np
import cv2
from rknn.api import RKNN


def show_outputs(outputs):
    output = outputs[0][0]
    output_sorted = sorted(output, reverse=True)
    top5_str = 'mobilenet_v1n-----TOP 5-----n'
    for i in range(5):
        value = output_sorted
        index = np.where(output == value)
        for j in range(len(index)):
            if (i + j) >= 5:
                break
            if value > 0:
                topi = '{}: {}n'.format(index[j], value)
            else:
                topi = '-1: 0.0n'
            top5_str += topi
    print(top5_str)




if __name__ == '__main__':


    # Create RKNN object
    rknn = RKNN()
   
    # pre-process config
    print('--> config model')
    rknn.config(channel_mean_value='127.5 127.5 127.5 127.5', reorder_channel='0 1 2')
    print('done')


    # Load tensorflow model
    print('--> Loading model')
    ret = rknn.load_tflite(model='./mobilenet_v1.tflite')
    if ret != 0:
        print('Load mobilenet_v1 failed!')
        exit(ret)
    print('done')


    # Build model
    print('--> Building model')
    ret = rknn.build(do_quantization=True, dataset='./dataset.txt', pre_compile=False)
    if ret != 0:
        print('Build mobilenet_v1 failed!')
        exit(ret)
    print('done')


    # Export rknn model
    print('--> Export RKNN model')
    ret = rknn.export_rknn('./mobilenet_v1.rknn')
    if ret != 0:
        print('Export mobilenet_v1.rknn failed!')
        exit(ret)
    print('done')


    # Set inputs
    img = cv2.imread('./dog_224x224.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


    # init runtime environment
    print('--> Init runtime environment')
    ret = rknn.init_runtime()
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')


    # Inference
    print('--> Running model')
    outputs = rknn.inference(inputs=[img])
    show_outputs(outputs)
    print('done')


    # perf
    print('--> Begin evaluate model performance')
    perf_results = rknn.eval_perf(inputs=[img])
    print('done')


    rknn.release()
5.rknn板子上运行demo

在rknn3399 pro板子上初步运行(此处使用的是mobilenet v1)直接运行如下文件,即可:

import numpy as np
import cv2
from rknn.api import RKNN


def show_outputs(outputs):
    output = outputs[0][0]
    output_sorted = sorted(output, reverse=True)
    top5_str = 'mobilenet_v1n-----TOP 5-----n'
    for i in range(5):
        value = output_sorted
        index = np.where(output == value)
        for j in range(len(index)):
            if (i + j) >= 5:
                break
            if value > 0:
                topi = '{}: {}n'.format(index[j], value)
            else:
                topi = '-1: 0.0n'
            top5_str += topi
print(top5_str)


if __name__ == '__main__':


    # Create RKNN object
    rknn = RKNN()
   
    # pre-process config
    print('--> config model')
    rknn.config(channel_mean_value='127.5 127.5 127.5 127.5', reorder_channel='0 1 2')
    print('done')


    # Load tensorflow model(加载自己在PC上生成的RKNN文件,直接使用)
    print('--> Loading model')
    ret = rknn.load_rknn(model='./mobilenet_v1.rknn')
    if ret != 0:
        print('Load mobilenet_v1 failed!')
        exit(ret)
    print('done')


    # Set inputs
    img = cv2.imread('./dog_224x224.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


    # init runtime environment
    print('--> Init runtime environment')
    ret = rknn.init_runtime()
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')


    # Inference
    print('--> Running model')
    outputs = rknn.inference(inputs=[img])
    show_outputs(outputs)
    print('done')


    # perf
    print('--> Begin evaluate model performance')
    perf_results = rknn.eval_perf(inputs=[img])
    print('done')


        rknn.release()
举报

更多回帖

×
20
完善资料,
赚取积分