总体思路就是,在本地使用PC电脑框架跑相关模型,通过官网相关模型转换代码,将tensorflow/pytorch/mxnet 模型转换成rknn模型,从而可以直接拷贝到嵌入式设备RK3399 pro板子上直接使用,真的是良心!
如果你还在为不能将AI模型放到嵌入设备上运行而发愁的话,建议你参看本文。
V1.3.0 主要说明:
V1.2.0 主要说明:
简单来说,可以理解为:
支持tensorflow1(keras)、pytorch、mxnet开发;
模型可以在PC(linux)、开发板、max上编译运行;
本次安装最新版本是rknn-toolkit-1.3.2
如果你刚开始使用tensorflow或者keras,或者还没有安装建议参看一下我前面讲解安装相关的内容:
(建议使用linux版本,因为win无法正常安装rknn-api;mac只是支持转化模型、不支持模型推理过程)
linux环境安装和使用
在安装完成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
参见代码
or
参见代码
参见官方给出的相关转化文件
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()
在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()
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