欢迎学习RKNN系列相关文章,从模型转换、精度分析,评估到部署,推荐好资源:
一、Ubuntu系统上安装rknn-toolkit
二、使用rknn-toolkit将Pytorch模型转为RKNN模型
三、RKNN模型的评估和推理测试
四、RKNN模型量化精度分析及混合量化提高精度
五、RKNN模型性能评估和内存评估
六、rknn-toolkit-lite2部署RKNN模型到开发板上(python版)
七、RKNN C API开发板上落地部署RKNN模型
八、RKNN零拷贝API开发板落地部署RKNN模型
目录
一、环境准备二、源码包获取三、RKNN模型转换3.1 模型转换的流程图3.2 参数修改3.3 代码3.4 运行结果3.5 转换得到的RKNN模型 四、总结
一、环境准备
在进行RKNN模型转换之前,需要安装rknn-toolkit工具,关于此工具的具体安装过程参考我另外一篇博文:安装rknn-toolkit工具
下面是我自己运行的环境,供参考:
二、源码包获取
我提供一个resnet18的模型和测试数据集,还有相关转换代码,都打包在源码包中,,获取方法为文章末扫码到公众号中回复关键字:模型部署转RKNN模型。获取下载链接。
下载解压后的样子如下:
三、RKNN模型转换
3.1 模型转换的流程图
3.2 参数修改
在我提供的源码包中,直接运行脚本export_rknn.py即可。
3.3 代码
转换代码为:
## 测试用来构建RKNN模型的APIfrom rknn.api import RKNNif __name__=="__main__": rknn = RKNN(verbose=True,verbose_file="log.txt") # verbose为True表示打印详细的日志,verbose_file表示将日志存放到指定的路径中 # 调用config接口配置要生成的RKNN模型 # 调用config接口设置模型的预处理、量化方法等参数 rknn.config( mean_values = [[123.675,116.28,103.53]], # mean_values表示预处理要减去的均值化参数 std_values = [[58.395,58.395,58.395]], # std_values 表示预处理要除的标准化参数 quantized_dtype = "asymmetric_quantized-8", # 表示默认为8位非对称量化。quantized_dtype表示量化类型 通用的模型权重和激活值都是float32类型的,会占据4个字节,而经过8位的非对称量化之后,权重和激活值量化为int8类型,只占1个字节 quantized_algorithm = "normal", # quantized_algorithm表示量化的算法,目前支持norm,mmse,kl quantized_method = "channel", # quantized_method表示量化方式,总的有channel(通道级量化)和layer(层级量化)两种,channel的精度要要高一些,默认为channel quant_img_RGB2BGR = False, # 表示在做量化时,是否做RGB2BGR的转换。此参数只会应用到量化阶段,并不会嵌入到RKNN模型中。 target_platform = "rk3588", # target_platform表示生成的RKNN模型要运行在哪个RKNPU平台上。通常有rk3588,rk3566,rv1126等 # target_platform="rv1126", float_dtype = "float16", # 表示RKNN模型的浮点数的类型,目前只支持float16的格式。如果不进行量化操作,则会将原始的float32格式默认转为float16格式。 optimization_level = 3, # 表示优化等级,默认为3级,表示打开全部优化选项。如果设置为0则表示关闭所有优化选项。1,2代表中间值,表示打开部分优化选项。会对最后的精度值产生影响 custom_string = "this is my rknn model!", # 表示向RKNN模型中添加的自定义字符串信息,可以在CAPI中通过查询接口,查询到添加的自定义字符串信息 remove_weight = False, # 表示生成一个去除权重的从模型,可以使用CAPI与另一个完整的模型共享权重,从而减小内存的消耗 一般用在rv109和rv106上 compress_weight = False, # 压缩权重,可以减少模型的体积 inputs_yuv_fmt = None, # 表示RKNN模型输入数据的yuv格式 single_core_mode = False, # 表示构建的RKNN模型运行在核心模式,只适用于RK3588 ) # 添加load_xxx接口,进行常用深度学习模型的导入 将深度学习模型导入 rknn.load_pytorch( model = "resnet18.pt", # model表示加载模型的地址 input_size_list = [[1,3,224,224]], # 表示模型输入节点对应图片的尺寸和通道数 ) # 使用build接口来构建RKNN模型 rknn.build( do_quantization=True, # 表示是否对生成的rknn模型进行量化操作 dataset = "dataset.txt", # 此参数只有上面的do_quantization为True时才生效,表示RKNN模型量化时采用的量化校正数据集 dataset.txt中填写的就是要量化的图片(正常情况下有20-100张量化图片) rknn_batch_size = -1, # 调整输入的batch数量,可以提高推理的效率 ) # 调用export_rknn接口导出RKNN模型 rknn.export_rknn( export_path="resnet18.rknn" # 表示导出的RKNN模型路径和名称 ) rknn.release() # 释放
3.4 运行结果
运行脚步后的输出结果如下:
3.5 转换得到的RKNN模型
转换后得到的RKNN模型如下:
四、总结
以上就是使用rknn-toolkit将Pytorch模型转为RKNN模型的详细过程,希望能帮到你!
总结不易,多多支持,谢谢!