赞
踩
欢迎学习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模型才能在RKNN推理框架中进行推理。RKNN模型格式是一种专为RKNN推理框架设计的模型格式,可以有效提高推理效率。目前,RKNN支持的模型格式包括:
Caffe
Tensorflow
Onnx
Pytorch
Mxnet
MindSpore
非RKNN模型在转换成RKNN模型时,可以选择量化或浮点两种精度模式。量化模式可以有效降低模型的存储空间和计算资源消耗,但可能会降低模型的推理精度。浮点模式可以获得更高的推理精度,但需要更大的存储空间和计算资源消耗。
非RKNN模型在转换成RKNN模型时,可以对模型进行优化,以提高推理性能。RKNN提供了多种优化选项,包括:
算子融合
内存优化
并行计算
非RKNN模型在转换成RKNN模型后,可以部署到各种硬件平台上进行推理,包括:
CPU
GPU
NPU
注:非RKNN模型经过转换得到的RKNN模型可以在模拟器上推理,也可以在开发板上推理;而直接加载的RKNN模型不能再模拟器上推理,只能在开发板上推理。
以上区别总结起来,可以用下面表格表示:
本教程配套的源码包获取方法为文章末扫码到公众号中回复关键字:RKNN评估与推理。获取下载链接。
源码包下载解压后的样子如下:
加载非RKNN模型推理的流程图如下所示:
需要修改的地方如下:
代码对应源码包中的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()
运行脚步后输出的结果:
打开imagnet1000标签.txt文件查找812,预测结果正确,如下:
加载RKNN模型进行模型推理的流程图如下:
需要修改的地方如下:
代码对应于源码包中的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模型的评估和推理测试详细过程,希望能帮到你!
总结不易,多多支持,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。