当前位置:   article > 正文

rk3588推理pytorch模型_pth模型转rknn模型

pth模型转rknn模型

本文记录pytorch模型在rk3588上的推理过程。

预备条件:

  • pc端为ubuntu20.04
  • 搭建resnet18网络并训练出一个.pth的模型

总体步骤:

  1. 在pc端安装工具rknn-toolkit2,然后将.pth转为.rknn模型
  2. 在板端安装rknn-toolkit2-lite工具,编写python脚本进行推理

目录

一、pth转rknn(PC端)

1. 安装rknn-toolkit2

2. pth转onnx

3. onnx转rknn

二、板端进行推理

1. 安装miniconda

2. 安装rknn_toolkit_lite2

3. 运行自己的推理代码

一、pth转rknn(PC端)

1. 安装rknn-toolkit2

下载源代码

git clone https://github.com/rockchip-linux/rknn-toolkit2.git

创建一个新环境,这里选用了官方教程中的python3.6版本

conda create -n deploy python=3.6

安装rknn-toolkit2依赖:

  1. sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc
  2. cd /rknn-toolkit2-master/doc
  3. pip install -r requirements_cp36-1.5.2.txt #根据python版本和下载的rknn-toolkit2版本而定

安装rknn-toolkit2

  1. cd rknn-toolkit2-master/packages
  2. pip install rknn_toolkit2-1.5.2+b642f30c-cp36-cp36m-linux_x86_64.whl #根据自己版本来

检查是否安装成功

  1. conda activate deploy
  2. python
  3. from rknn.api import RKNN

没报错则为成功

2. pth转onnx

安装onnx

pip install onnx

参考下述代码,运行成功后会在当前路径下生成一个model.onnx

  1. import torch.onnx
  2. model_path = "" #这里填写pth模型的路径
  3. model = torch.load(model_path, map_location=torch.device('cpu'))
  4. model.eval()
  5. input_names = ['input']
  6. output_names = ['output']
  7. x = torch.randn(1, 3, 224, 224, requires_grad=True)
  8. torch.onnx.export(model, x, 'model.onnx', verbose=True, input_names=input_names, output_names=output_names)

检查onnx模型,安装onnxruntime

pip install onnxruntime

运行下述代码,查看onnx模型和pth模型输出的推理结果是否一致

  1. import onnxruntime
  2. from onnxruntime.datasets import get_example
  3. import torch
  4. def to_numpy(tensor):
  5. return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()
  6. dummy_input = torch.randn(1, 3, 224, 224, device='cpu')
  7. onnx_model = get_example("") # 注意这里要写onnx模型的绝对路径
  8. sess = onnxruntime.InferenceSession(onnx_model)
  9. onnx_result = sess.run(None, {'input': to_numpy(dummy_input)})
  10. print(onnx_result)
  11. model_path = '' #这里写pth模型的路径
  12. model = torch.load(model_path, map_location=torch.device('cpu'))
  13. model.eval()
  14. pytorch_result = model(dummy_input)
  15. print(pytorch_result)

3. onnx转rknn

代码如下:

  1. from rknn.api import RKNN
  2. import os
  3. if __name__ == '__main__':
  4. platform = 'rk3588'
  5. '''step 1: create RKNN object'''
  6. rknn = RKNN()
  7. '''step 2: load the .onnx model'''
  8. rknn.config(target_platform='rk3588')
  9. print('--> Loading model')
  10. ret = rknn.load_onnx('') # 这里填写onnx模型的路径
  11. if ret != 0:
  12. print('load model failed')
  13. exit(ret)
  14. print('done')
  15. '''step 3: building model'''
  16. print('-->Building model')
  17. ret = rknn.build(do_quantization=False)
  18. if ret != 0:
  19. print('build model failed')
  20. exit()
  21. print('done')
  22. '''step 4: export and save the .rknn model'''
  23. RKNN_MODEL_PATH = 'out.rknn' # 这里填写rknn模型的名称
  24. ret = rknn.export_rknn(RKNN_MODEL_PATH)
  25. if ret != 0:
  26. print('Export rknn model failed.')
  27. exit(ret)
  28. print('done')
  29. '''step 5: release the model'''
  30. rknn.release()

运行上述代码,记得先进入deploy环境

  1. conda activate deploy
  2. python onnx2rknn.py

运行成功后会在当前路径下生成rknn模型

二、板端进行推理

将pc上下载的rknn-toolkit2/rknn_toolkit_lite2拷到板端

将上一步转出的rknn模型拷到板端

1. 安装miniconda

下载地址:Miniconda — miniconda documentation

在下载目录下打开终端,输入下述命令进行安装

bash Miniconda3-latest-Linux-aarch64.sh

然后一路回车+yes(需要输入两次),完成后可以查看一下conda版本,确认是否安装成功

conda --version
2. 安装rknn_toolkit_lite2

新建并激活环境(python=3.8)

  1. conda create -n rknnlite python=3.8
  2. conda activate rknnlite

安装rknn_toolkit_lite2

  1. cd rknn_toolkit_lite2/packages
  2. pip install rknn_toolkit_lite2-1.5.2-cp38-cp38-linux_aarch64.whl # 根据实际版本

检查是否安装成功,如果没有报错则安装成功

  1. python
  2. from rknnlite.api import RKNNLite

使用官方例子测试

  1. cd rknn_toolkit_lite2/examples/inference_with_lite
  2. python test.py

如果遇到下述错误,解决方案见:rk3588初始化模型出错的解决方案

3. 运行自己的推理代码

示例代码:

  1. import cv2
  2. import numpy as np
  3. import platform
  4. from rknnlite.api import RKNNLite
  5. # decice tree for rk356x/rk3588
  6. DEVICE_COMPATIBLE_NODE = '/proc/device-tree/compatible'
  7. INPUT_SIZE = 224
  8. RK3588_RKNN_MODEL = 'yourmodel.rknn' # 这里修改为前面转换得到的rknn
  9. if __name__ == '__main__':
  10. rknn_model = RK3588_RKNN_MODEL
  11. rknn_lite = RKNNLite()
  12. # load RKNN model
  13. print('--> Load RKNN model')
  14. ret = rknn_lite.load_rknn(rknn_model)
  15. if ret != 0:
  16. print('Load RKNN model failed')
  17. exit(ret)
  18. print('done')
  19. ori_img = cv2.imread('./pic/0/t0101d9da1203312457.jpg')
  20. resized_img = cv2.resize(ori_img, (224, 224))
  21. img = np.float32(resized_img)
  22. cv2.normalize(img, img, 1, 0, cv2.NORM_MINMAX)
  23. # init runtime environment
  24. print('--> Init runtime environment')
  25. ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
  26. if ret != 0:
  27. print('Init runtime environment failed')
  28. exit(ret)
  29. print('done')
  30. # Inference
  31. print('--> Running model')
  32. outputs = rknn_lite.inference(inputs=[img])
  33. print(outputs)
  34. print('done')
  35. rknn_lite.release()

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号