当前位置:   article > 正文

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

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

五、总结

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/854524
推荐阅读
相关标签
  

闽ICP备14008679号