模型部署——RKNN模型的评估和推理测试(附代码)

欢迎学习RKNN系列相关文章,从模型转换、精度分析,评估到部署,推荐好资源:
一、Ubuntu系统上安装rknn-toolkit
二、使用rknn-toolkit将Pytorch模型转为RKNN模型
三、RKNN模型的评估和推理测试
四、RKNN模型量化精度分析及混合量化提高精度
五、RKNN模型性能评估和内存评估
六、rknn-toolkit-lite2部署RKNN模型到开发板上(python版)
七、RKNN C API开发板上落地部署RKNN模型
八、RKNN零拷贝API开发板落地部署RKNN模型


在这里插入图片描述

一、直接加载RKNN模型和非RKNN模型的区别

1.1 模型格式

模型格式
非RKNN模型需要先转换成RKNN模型才能在RKNN推理框架中进行推理。RKNN模型格式是一种专为RKNN推理框架设计的模型格式,可以有效提高推理效率。目前,RKNN支持的模型格式包括:

Caffe
Tensorflow
Onnx
Pytorch
Mxnet
MindSpore

1.2 模型精度

非RKNN模型在转换成RKNN模型时,可以选择量化或浮点两种精度模式。量化模式可以有效降低模型的存储空间和计算资源消耗,但可能会降低模型的推理精度。浮点模式可以获得更高的推理精度,但需要更大的存储空间和计算资源消耗。

1.3 模型性能

非RKNN模型在转换成RKNN模型时,可以对模型进行优化,以提高推理性能。RKNN提供了多种优化选项,包括:
算子融合
内存优化
并行计算

1.4 模型部署

非RKNN模型在转换成RKNN模型后,可以部署到各种硬件平台上进行推理,包括:
CPU
GPU
NPU

注:非RKNN模型经过转换得到的RKNN模型可以在模拟器上推理,也可以在开发板上推理;而直接加载的RKNN模型不能再模拟器上推理,只能在开发板上推理。

以上区别总结起来,可以用下面表格表示:

在这里插入图片描述

二、源码包获取

本教程配套的源码包获取方法为文章末扫码到公众号中回复关键字:RKNN评估与推理。获取下载链接。

源码包下载解压后的样子如下:

在这里插入图片描述

三、加载非RKNN模型推理

3.1 推理流程图

加载非RKNN模型推理的流程图如下所示:

在这里插入图片描述

3.2 参数修改

需要修改的地方如下:

在这里插入图片描述

3.3 代码

代码对应源码包中的inference_pytorch.py,具体代码见下:

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

def show_outputs(output):
    output_sorted = sorted(output,reverse = True)
    top5_str = '\n----------top5-----------\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:
                top1 = "{}:{}\n".format(index[j],value)
            else:
                top1 = "-1:0.0\n"
            top5_str += top1
    print(top5_str)

def show_perfs(perfs):
    perfs = "perfs:{}\n".format(perfs)
    print(perfs)

def softmax(x):
    return np.exp(x)/sum(np.exp(x))

if __name__=='__main__':
    rknn = RKNN(verbose=True)             # 打印详细日志

    # 调用config接口设置模型的预处理、量化方法等参数
    rknn.config(
        mean_values = [[123.675,116.28,103.53]],           # mean_values表示预处理要减去的均值化参数
        std_values = [[58.395,58.395,58.395]],             # std_values 表示预处理要除的标准化参数
        target_platform = "rk3588"                         # target_platform表示生成的RKNN模型要运行在哪个RKNPU平台上。通常有rk3588,rk3566,rv1126等
    )

    # 添加load_xxx接口,进行常用深度学习模型的导入           将深度学习模型导入
    rknn.load_pytorch(
        model = "./resnet18.pt",
        input_size_list = [[1,3,224,224]]
    )

    # 使用build接口来构建RKNN模型
    rknn.build(
        do_quantization = True,
        dataset = "dataset.txt",
        rknn_batch_size = -1
    )

    # 调用export_rknn接口导出RKNN模型
    rknn.export_rknn(export_path="resnet18.rknn")

    # 调用init_runtime接口初始化运行时的环境
    rknn.init_runtime(
        target = "rk3588",    # target 表示rknn模型运行平台    通过连板带推理的方式加载到NPU上     设置为对应的板子型号就是直接在对应板子上跑
        # target=None,        # 设置为None就是在模拟器上跑
        target_sub_class = None,
        device_id=None,    # 电脑连接多开发板时,id的选择                 如果只连接了一个开发板,这里设置为none即可
        perf_debug = False,      # perf_debug设置为True时 ,可以打开性能评估的debug模式,dubug模式下可以获取到每一层的运行时间,否则就只能获取到模型运行的总时间
        eval_mem = False,         # 设置为True表示使能内存评估模式,
        async_mode= False,       # 表示是否使能异步模式    目前版本还不支持
        core_mask = RKNN.NPU_CORE_AUTO,            # 设置运行时NPU的核心,可以灵活调度RK3588的3个核心           自由调度
    )

    # 使用Opencv导入要推理的数据
    img = cv2.imread(
        filename = "space_shuttle_224.jpg",   # 图片路径
        flags = None      # 表示读取BGR三个通道的数据
    )

    # cvtcolor 将BGR图片转为RGB ,因为resnet18要求输入的图片为RGB
    cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

    # 调用inference接口进行推理测试
    outputs = rknn.inference(
        inputs = [img],     # inputs 表示要推理的数据
        data_format = "nhwc",   # 表示要推理的数据模式
    )

    # 对outputs进行后处理
    show_outputs(softmax(np.array(outputs[0][0])))   # 对outputs的内容进行softmax操作,根据概率排列之后,打印出前5名的概率

    rknn.release()

3.4 运行结果

运行脚步后输出的结果:

在这里插入图片描述

打开imagnet1000标签.txt文件查找812,预测结果正确,如下:

在这里插入图片描述

四、加载RKNN模型进行模型推理

4.1 推理流程图

加载RKNN模型进行模型推理的流程图如下:

在这里插入图片描述

4.2 参数修改

需要修改的地方如下:

在这里插入图片描述

4.3 代码

代码对应于源码包中的inference_rknn.py脚本,具体代码如下:

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

def show_outputs(output):
    output_sorted = sorted(output,reverse = True)
    top5_str = '\n----------top5-----------\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:
                top1 = "{}:{}\n".format(index[j],value)
            else:
                top1 = "-1:0.0\n"
            top5_str += top1
    print(top5_str)

def show_perfs(perfs):
    perfs = "perfs:{}\n".format(perfs)
    print(perfs)

def softmax(x):
    return np.exp(x)/sum(np.exp(x))

if __name__=='__main__':
    rknn = RKNN(verbose=True)             # 打印详细日志

    # 调用load_rknn接口直接加载RKNN模型
    rknn.load_rknn(path = "resnet18.rknn")

    # 调用export_rknn接口导出RKNN模型
    rknn.export_rknn(export_path="resnet18.rknn")

    # 调用init_runtime接口初始化运行时的环境
    rknn.init_runtime(
        target = "rk3588",    # target 表示rknn模型运行平台    通过连板带推理的方式加载到NPU上     设置为对应的板子型号就是直接在对应板子上跑
        # target=None,        # 设置为None就是在模拟器上跑
        target_sub_class = None,
        device_id=None,    # 电脑连接多开发板时,id的选择                 如果只连接了一个开发板,这里设置为none即可
        perf_debug = False,      # perf_debug设置为True时 ,可以打开性能评估的debug模式,dubug模式下可以获取到每一层的运行时间,否则就只能获取到模型运行的总时间
        eval_mem = False,         # 设置为True表示使能内存评估模式,
        async_mode= False,       # 表示是否使能异步模式    目前版本还不支持
        core_mask = RKNN.NPU_CORE_AUTO,            # 设置运行时NPU的核心,可以灵活调度RK3588的3个核心           自由调度
    )

    # 使用Opencv导入要推理的数据
    img = cv2.imread(
        filename = "space_shuttle_224.jpg",   # 图片路径
        flags = None      # 表示读取BGR三个通道的数据
    )

    # cvtcolor 将BGR图片转为RGB ,因为resnet18要求输入的图片为RGB
    cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

    # 调用inference接口进行推理测试
    outputs = rknn.inference(
        inputs = [img],     # inputs 表示要推理的数据
        data_format = "nhwc",   # 表示要推理的数据模式
    )

    # 对outputs进行后处理
    show_outputs(softmax(np.array(outputs[0][0])))   # 对outputs的内容进行softmax操作,根据概率排列之后,打印出前5名的概率

    rknn.release()

五、总结

以上就是RKNN模型的评估和推理测试详细过程,希望能帮到你!

总结不易,多多支持,谢谢!

  • 43
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐咖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值