RKNPU2从入门到实践 --- 【4】RKNN 模型构建【使用pycharm一步一步搭建RKNN模型】
目录
前言
1.1 RKNN 初始化及对象释放
1.1.1 概念介绍
1.1.2 实际演示
1.2 RKNN 模型配置
1.2.1 概念介绍
1.2.2 实际演示
1.3 模型加载
1.3.1 概念介绍
1.3.1.1 Caffe模型加载接口
1.3.1.2 TensorFlow模型加载接口
1.3.1.3 TensorFlowLite 模型加载接口
1.3.1.4 ONNX 模型加载接口
1.3.1.5 DarkNet模型加载接口 编辑编辑
1.3.1.6 PyTorch 模型加载接口
编辑 1.3.2 实际演示
1.4 构建RKNN模型
1.4.1 概念介绍
编辑1.4.2 实际演示
1.5 导出RKNN模型
1.5.1 概念介绍
1.5.2 实际演示
1.6 最终测试
前言
本篇博文中所使用到的系统为Ubuntu 20系统,搭建好RKNN Toolkit2环境后,方可继续往下看。
RKNN Toolkit2使用流程图如下所示:
RKNN模型构建流程如下图所示:
打开 VMware 虚拟软件,启动linux虚拟系【Ubuntu20系统】,在该系统中你已经配置好了RKNNToolkit2环境。
随后打开pycharm【在虚拟linux系统中打开的pycharm】,创建一个名为 export_rknn_learning 的文件夹,在该文件夹中创建一个名为export_rknn.py文件,创建一个log.txt文件用于存放日志信息,如下图所示。
随后按照如下步骤:
1.1 RKNN 初始化及对象释放
1.1.1 概念介绍
在使用 RKNNToolkit2 的所有 API 接口时,都需要先调用 RKNN()方法初始化 RKNN 对象,当不 再使用该对象时,通过调用该对象的 release()方法进行释放。
初始化 RKNN 对象时,可以设置 verbose 和 verbose_file 参数,从而打印详细的日志信息。其 中 verbose 参数指定是否要在终端打印详细日志信息;如果设置了 verbose_file 参数,且 verbose 参数值为 True,日志信息还将写到该参数指定的文件中。 举例如下:
from rknn.api import RKNN
#将详细的日志信息输出到终端,并写到 mobilenet_build.log 文件中
rknn=RKNN(verbose=True,verbose_file='./mobilenet_build.log')
rknn=RKNN(verbose=True) #将详细的日志信息输出到终端
…
rknn.release()
1.1.2 实际演示
第一步和最后一步的代码如下所示:
运行上述代码,得到:
log.txt 文件中的内容为:
红色框给出了 rknn-toolkit2 的版本,蓝色框给出了已经将日志log信息保存到 log.txt 文件中。
1.2 RKNN 模型配置
1.2.1 概念介绍
在构建 RKNN 模型之前,需要先对模型进行通道均值、量化图片 RGB2BGR 转换、量化类型等配置,这些操作需要通过 config 接口进行配置。
举例如下:
rknn.config(mean_values=[123.675,116.28,103.53],std_values=[58.395,58.395,58.395])
1.2.2 实际演示
第二步代码如下:
第二步代码添入后整体代码如下所示:
from rknn.api import RKNN
if __name__ == '__main__':
# 第一步:创建一个RKNN对象
rknn = RKNN(verbose=True, verbose_file='log.txt')
# 第二步:调用config接口配置要生成的RKNN模型
rknn.config(
mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
# 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
quantized_method='channel', # quantized_method 表示量化的方式
quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
quant_img_RGB2BGR=False, #
target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
optimization_level=3, # optimization_level 表示模型优化等级
custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
)
# 第三步:
# 最后一步:释放RKNN对象(不再使用RKNN时)
rknn.release()
1.3 模型加载
1.3.1 概念介绍
RKNN-Toolkit2 目前支持 Caffe、TensorFlow、TensorFlowLite、ONNX、DarkNet、PyTorch 等模型 的加载转换,这些模型在加载时需调用对应的接口,以下为这些接口的详细说明。
1.3.1.1 Caffe模型加载接口
1.3.1.2 TensorFlow模型加载接口
举例如下:
1.3.1.3 TensorFlowLite 模型加载接口
1.3.1.4 ONNX 模型加载接口
1.3.1.5 DarkNet模型加载接口
1.3.1.6 PyTorch 模型加载接口
1.3.2 实际演示
我们以pytorch模型结构为例,将提前准备好的 resnet18.pt 文件复制粘贴到虚拟机虚拟系统中的项目文件夹中,如下所示:
第三步代码如下:
第三步代码添入后整体代码如下:
from rknn.api import RKNN
if __name__ == '__main__':
# 第一步:创建一个RKNN对象
rknn = RKNN(verbose=True, verbose_file='log.txt')
# 第二步:调用config接口配置要生成的RKNN模型
rknn.config(
mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
# 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
quantized_method='channel', # quantized_method 表示量化的方式
quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
quant_img_RGB2BGR=False, #
target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
optimization_level=3, # optimization_level 表示模型优化等级
custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
)
# 第三步:添加 load_xxx 接口进行常用深度学习模型的导入
rknn.load_pytorch(
model='./resnet18.pt', # model表示加载模型的地址
input_size_list=[[1, 3, 224, 224]], # input_size_list 表示模型输入节点对应图片的尺寸和通道数
)
# 最后一步:释放RKNN对象(不再使用RKNN时)
rknn.release()
1.4 构建RKNN模型
1.4.1 概念介绍
举例如下:
1.4.2 实际演示
第四步的代码如下:
第四步代码添入后整体代码如下:
from rknn.api import RKNN
if __name__ == '__main__':
# 第一步:创建一个RKNN对象
rknn = RKNN(verbose=True, verbose_file='log.txt')
# 第二步:调用config接口配置要生成的RKNN模型
rknn.config(
mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
# 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
quantized_method='channel', # quantized_method 表示量化的方式
quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
quant_img_RGB2BGR=False, #
target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
optimization_level=3, # optimization_level 表示模型优化等级
custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
)
# 第三步:添加 load_xxx 接口进行常用深度学习模型的导入
rknn.load_pytorch(
model='./resnet18.pt', # model表示加载模型的地址
input_size_list=[[1, 3, 224, 224]], # input_size_list 表示模型输入节点对应图片的尺寸和通道数
)
# 第四步:使用build接口来构建RKNN模型
rknn.build(
do_quantization=True, # do_quantization 表示是否对RKNN模型进行量化操作
dataset='dataset.txt', # dataset 表示要量化的图片
rknn_batch_size=-1, # 目前用不到
)
# 最后一步:释放RKNN对象(不再使用RKNN时)
rknn.release()
1.5 导出RKNN模型
1.5.1 概念介绍
通过本工具构建的 RKNN 模型通过该接口可以导出存储为 RKNN 模型文件,用于模型部署。
1.5.2 实际演示
第五步代码如下所示:
第五步代码添入后的整体代码如下所示:
from rknn.api import RKNN
if __name__ == '__main__':
# 第一步:创建一个RKNN对象
rknn = RKNN(verbose=True, verbose_file='log.txt')
# 第二步:调用config接口配置要生成的RKNN模型
rknn.config(
mean_values=[[123.675, 116.28,103.53]], # mean_values 表示预处理要减去的均值化参数
std_values=[[58.395, 58.395, 58.395]], # std_values 表示预处理要除的标准化参数
# 上面这两个参数在模型训练时就已经设置好了,在这里应与训练时的取值一至
quantized_dtype='asymetric_quantized-8', # quantized_dtype 表示量化类型
quantized_method='channel', # quantized_method 表示量化的方式
quantized_algorithm='normal', # quantized_algorithm 表示量化的算法
quant_img_RGB2BGR=False, #
target_platform='rk3588', # target_platform 表示RKNN模型的运行平台
float_dtype='float16', # float_dtype 表示RKNN模型中的默认浮点数类型
optimization_level=3, # optimization_level 表示模型优化等级
custom_string='this is my rknn model', # 添加自定义字符串信息到 RKNN 模型
remove_weight=False, # remove_weight 表示生成一个去除权重信息的从模型
compress_weight=False, # 压缩模型权重,可以减小RKNN模型的大小。默认为False
inputs_yuv_fmt=False, # 表示RKNN模型输入数据的YUV格式
single_core_mode=False # 表示构建的RKNN模型运行在单核心模式,只适用RK3588
)
# 第三步:添加 load_xxx 接口进行常用深度学习模型的导入
rknn.load_pytorch(
model='./resnet18.pt', # model表示加载模型的地址
input_size_list=[[1, 3, 224, 224]], # input_size_list 表示模型输入节点对应图片的尺寸和通道数
)
# 第四步:使用build接口来构建RKNN模型
rknn.build(
do_quantization=True, # do_quantization 表示是否对RKNN模型进行量化操作
dataset='dataset.txt', # dataset 表示要量化的图片
rknn_batch_size=-1, # 目前用不到
)
# 第五步:调用export_rknn接口导出RKNN模型
rknn.export_rknn(
export_path='resnet18.rknn',# 表示导出的RKNN模型路径
)
# 最后一步:释放RKNN对象(不再使用RKNN时)
rknn.release()
1.6 最终测试
经过了前面的步骤,我们现在可以通过运行代码来完成了RKNN模型的导出工作,运行代码,得到如下图所示:
至此,我们完成了RKNN模型的导出工作,接下来可进行模型评估工作了。