pytorch模型转换为rknn模型,使用npu推理

Posted 振华OPPO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch模型转换为rknn模型,使用npu推理相关的知识,希望对你有一定的参考价值。

一、转换为onnx模型

在yolov5代码中运行export.py,转换为onnx模型,参数根据自己需要修改

二、创建转换目录

然后在rknn文件夹下,找到onnx2rknn.py、dataset.txt和coco2017数据集,将它们复制到新的文件夹中,作为rknn模型转换目录。将需要转换的onnx模型也放在该目录中。

我的目录结构如图所示,其中第一个文件夹是已经转换成功的生成目录。

三、转换为rknn模型

RKNN-Toolkit2 是为用户提供在 PC、 Rockchip NPU平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成以下功能:

  1. 🏆模型转换:支持Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等模型转为 RKNN模型,并支持 RKNN 模型导入导出,RKNN 模型能够在 Rockchip NPU 平台上加载使用。

  2. 🎽量 化 功 能 : 支 持将 浮 点 模 型 量 化 为 定 点 模 型 , 目 前 支 持 的 量 化 方 法 为 非 对 称 量 化 , 并 支 持 混 合 量化 功 能 。asymmetric_quantized-16 目前版本暂不支持。

  3. 🎯模型推理:能够在 PC 上模拟Rockchip NPU 运行 RKNN 模型并获取推理结果;或将 RKNN模型分发到指定的 NPU 设备上进行推理并获取推理结果。

  4. 🏋性能和内存评估:将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型在实际设备上运行时的性能和内存占用情况。

  5. 🎼量化精度分析:该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路。

进入我们之前配置安装有rknn-toolkit2的环境,输入命令进行转换。

python export.py

过程中的日志输出:

(py36) (base) dzh@dzh-Lenovo-Legion-Y7000:~/modelConvert/onnx2rknn$ python onnx2rknn.py 
W __init__: rknn-toolkit2 version: 1.3.0-11912b58
--> Loading model
W load_onnx: It is recommended onnx opset 12, but your onnx model opset is 10!
W load_onnx: Model converted from pytorch, 'opset_version' should be set 12 in torch.onnx.export for successful convert!
             More details can be found in examples/pytorch/torch2onnx
done
--> Building model
Analysing : 100%|███████████████████████████████████████████████| 168/168 [00:00<00:00, 3731.11it/s]
Quantizating : 100%|█████████████████████████████████████████████| 168/168 [00:00<00:00, 755.22it/s]
W build: The default input dtype of 'images' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of 'output' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of '335' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of '336' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
done
--> Export RKNN model: ./rknn_models/yolov5s-640-640_rm_transpose.rknn
done

然后在rknn_models下可以看到yolov5s-640-640_rm_transpose.rknn文件,重命名下,我们就可以拷贝到开发板上进行目标检测了。

四、问题记录

W __init__: rknn-toolkit2 version: 1.3.0-11912b58
--> Loading model
W load_onnx: It is recommended onnx opset 12, but your onnx model opset is 10!
W load_onnx: Model converted from pytorch, 'opset_version' should be set 12 in torch.onnx.export for successful convert!
             More details can be found in examples/pytorch/torch2onnx
E load_onnx: The len of mean_values ([0, 0, 0]) for input 0 is wrong, expect 12!
W load_onnx: ===================== WARN(3) =====================
E rknn-toolkit2 version: 1.3.0-11912b58
E load_onnx: Catch exception when loading onnx model: /home/dzh/modelConvert/onnx2rknn/yolov5s.onnx!
E load_onnx: Traceback (most recent call last):
E load_onnx:   File "rknn/api/rknn_base.py", line 1182, in rknn.api.rknn_base.RKNNBase.load_onnx
E load_onnx:   File "rknn/api/rknn_base.py", line 663, in rknn.api.rknn_base.RKNNBase._create_ir_and_inputs_meta
E load_onnx:   File "rknn/api/rknn_log.py", line 113, in rknn.api.rknn_log.RKNNLog.e
E load_onnx: ValueError: The len of mean_values ([0, 0, 0]) for input 0 is wrong, expect 12!
load model failed!

pt模型的输入图像的通道一定要和转换时的图像通道数相同,对于RGB图像肯定是3通道。

以上是关于pytorch模型转换为rknn模型,使用npu推理的主要内容,如果未能解决你的问题,请参考以下文章

yolov5pytorch模型导出为onnx模型

rk3588对npu的再探索,yolov5使用rknn模型推理教程

手把手教学YOLOV5在RK3568的部署应用及代码实现

全志V853 的NPU 转换部署 YOLO V5 模型

Pytorch RNN 模型没有学到任何东西

RK3399Pro人工智能开发板 RKNN支持Caffe/Tensorflow/Mxnet