rknn3399pro 2小时入门指南(三)在PC上搭建RKNN模拟环境、 模型转换代码、RK3399 pro使用

目录

  • 1.前言
    • 官方论坛说明
  • 2.PC-ubuntu系统下tensorflow+keras虚拟环境搭建
  • 3.在PC-ubuntu下搭建rknn模拟环境搭建
  • 4.相关转化代码
    • (1) h5 -> tflite
    • (2) tflite -> rknn
  • 5.rknn板子上运行demo
  • Reference

总体思路就是,在本地使用PC电脑框架跑相关模型,通过官网相关模型转换代码,将tensorflow/pytorch/mxnet 模型转换成rknn模型,从而可以直接拷贝到嵌入式设备RK3399 pro板子上直接使用,真的是良心!

如果你还在为不能将AI模型放到嵌入设备上运行而发愁的话,建议你参看本文。

1.前言

官方论坛说明

V1.3.0 主要说明:

  1. 从该版本开始我们建议各位切换到debian10,并且直接使用apt和pip命令进行在线更新即可(计算棒dnf update)。
    (debian10发布地址:http://t.rock-chips.com/forum.php?mod=viewthread&tid=1121)
  2. rk3399prod Fedora不再支持rknn在线更新,请各位尽早切换到debian10使用。
  3. 该版本主要更新了pytorch(1.2)和mxnet的模型支持
  4. 该版本新增了RKNN的UI显示功能(具体请看文档)

V1.2.0 主要说明:

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

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

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

如果你刚开始使用tensorflow或者keras,或者还没有安装建议参看一下我前面讲解安装相关的内容:

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

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.4.1 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.6.1 scipy==1.3.0 onnx-tf==1.2.1

最后才是安装RKNN

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

4.相关转化代码

(1) h5 -> tflite

参见代码
or
参见代码

(2) tflite -> rknn

参见官方给出的相关转化文件
https://github.com/rockchip-linux/rknn-toolkit/tree/master/examples/rknn_convert
或者其他实例,在搭建好的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_v1\n-----TOP 5-----\n'
    for i in range(5):
        value = output_sorted[i]
        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.0\n'
            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_v1\n-----TOP 5-----\n'
    for i in range(5):
        value = output_sorted[i]
        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.0\n'
            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()

Reference

1.http://t.rock-chips.com/forum.php?mod=viewthread&tid=964&extra=page%3D1
2.https://github.com/rockchip-linux/rknn-toolkit
3. https://github.com/AIWintermuteAI/aXeleRate

你可能感兴趣的:(AI嵌入式设备)