基于rk3399pro的人工智能模型落地与服务器部署

大致流程:

数据获取–>模型搭建–>CPU训练模型–>模型转换–>嵌入式部署–>完成落地

硬件需求:

  1. 瑞芯微嵌入式开发板rk3399pro(搭载双核Cortex-A72及四核Cortex-A53组合架构处理器,四核GPU一块,以及最重要的NPU神经计算单元:内置算力3.0T)
  2. 键盘、鼠标、电源
  3. USB摄像头一块
  4. 有条件可以搭载RK1808算力棒

系统需求

  1. Python3.6以上版本
  2. 上位机搭建rknn.tooklit环境(用于模型转换)
  3. 上位机可搭建rknn.api环境(用于仿真嵌入式NPU)
  4. Tensorflow框架等Python环境
  5. Linux开发环境:(我使用的是Ubuntu系统,方便)
  6. 开发板搭建rknn.api环境以及npu驱动

为什么不采用大型服务器部署?:

个人理解:

  1. 小巧且具系统性能: 这块板子刚到手时就觉得其小巧,不够巴掌大,却如麻雀般内置了五脏六腑,还内置工智能芯片,rk3399pro与寻常电脑无异,可以烧写Linux系统,这就甩开了传统单片机、DSP、树莓派好几个档次。
  2. 功耗低、运算快: 我尝试过整天整天的运行程序都不发热,说明可以很好的适应产品环境 ,便于部署; 另外,内置NPU神经计算单元是电脑无可比拟的,该单元为神经网络计算而生,相比CPU、GPU运算速度、功耗、承受时长都远远超越。
  3. 丰富的接口: 具有单片机、DSP一样的管脚以及模拟量输出接口,可以直接完成外接控制器的功能实现。假如你让一台电脑去控制一个开关,一个电机,不可能吧?
    [点击进入B站大佬实现导盲小车控制]

模型转换

为什么你训练好的Python模型要转换呢,因为NPU采用指定的rknn模型,因此所有模型都需要转化为rknn模型才能完成部署。

该板子最新SDK已经能够支持tensoflow2、tensoflow lite 、Paddle、caffe、pytorch、Darknet、ONNX等模型,我目前是使用Python语言在tensorflow框架下学习,后续还是学一下百度飞桨Paddle,毕竟支持国产~
基于rk3399pro的人工智能模型落地与服务器部署_第1张图片
首先将写好的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’表示交换02通道,如果输入是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()

模型推理与部署

模型转换完成后,通过ssh将模型传输至开发板服务器,如下:

sudo su
scp -r model.rknn test.py toybrick@172.22.225.225:/home/test/
ssh toybrick@172.22.225.225 
cd /home/test/
python3 test.py

API具体流程如下:
基于rk3399pro的人工智能模型落地与服务器部署_第2张图片

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

采用Demo验证模型效果:

手语数字识别demo效果如下:
基于rk3399pro的人工智能模型落地与服务器部署_第3张图片
Demo资源如下:
https://download.csdn.net/download/weixin_45776027/13454590

你可能感兴趣的:(笔记,python,深度学习,人工智能,机器学习)