这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » RK3568开发板使用RKNNToolkit2转换Pytorch模型

共1条 1/1 1 跳转至

RK3568开发板使用RKNNToolkit2转换Pytorch模型

高工
2026-05-13 20:20:00     打赏
一、RKNN-Toolkit2的安装RKNN-Toolkit2 是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、 推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成以下功能:1) 模型转换: 支持 Caffe、 TensorFlow、TensorFlow Lite、 ONNX、 DarkNet、 PyTorch 等模型转为 RKNN 模型, 并支持 RKNN 模型导入导出, RKNN 模型能够在 Rockchip NPU 平台上加载使用。2) 量化功能: 支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化(asymmetric_quantized-8) , 并 支 持 混 合 量 化 功 能 。3) 模型推理: 能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果; 或将 RKNN模型分发到指定的 NPU 设备上进行推理并获取推理结果。4) 性能评估: 将 RKNN 模型分发到指定 NPU 设备上运行, 以评估模型在实际设备上运行时的性能。5) 内存评估: 评估模型运行时的内存的占用情况。使用该功能时, 必须将 RKNN 模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息。6) 量化精度分析:该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离, 以便于分析量化误差是如何出现的, 为提高量化模型的精度提供思路。


飞凌嵌入式在产品资料中提供了RKNNToolkit2的1.1版本,这个版本必须和Ubuntu18.04一起使用。如果在Ubuntu 20.04下安装Python3.6,虽然可以安装RKNN Toolkit2 1.1,但是只能进行模型加载和分析,在模型转换时会因为库文件不兼容报错。我参加尝试从瑞芯微官方网站上下载最新版本的工具:https://github.com/rockchip-linux/rknn-toolkit2。最新的版本是1.4,可以支持Ubuntu 20.04( x64)和Python 3.8,也能够正常生成.rknn文件。但是不同版本的.rknn文件格式不同,在OK3568运行时会报告非法格式错误。曾经尝试更新板子上的rknn_server和librknnrt.so,但是运行时报Bus error错误,估计还有内核模块需要更新。所以最简单的办法还是在Ubuntu 18.04下使用厂商提供的版本。安装步骤如下:1) 安装Python3及相关库文件。安装命令如下:sudoapt-get install python3 python3-dev python3-pip
sudo apt-get install libxslt1-dev zlib1g zlib1g-devlibglib2.0-0

libsm6 libgl1-mesa-glx libprotobuf-dev gcc

2) 安装依赖的Python库,命令如下:

  • pip3 install -r doc/requirements-1.1.0.txt

RKNN-Toolkit2依赖的文件很多,而且很多文件的版本是有严格要求的。最好使用清华源和百度源进行安装,因为有些pip源不一定有特定版本。这个文件中的bfloat最好先注释掉,然后手工安装,因为这个库安装过程中需要numpy,而如果之前没有安装过numpy,在安装过程中会失败。3) 安装RKNN-Toolkit2工具包命令如下:

pip3 install package/rknn_toolkit2-1.1.0_5c458c6-cp36-cp36m-linux_x86_64.whl

工具包并不大,安装也很快。主要耗时的地方在前面安装依赖库。


二、Pytorch模型的转换

RKNN-Toolkit2对于非RKNN模型的处理流程如下:


一般,我们会调用export_tknn接口转换为.rknn的模型文件,再在PC环境下进行仿真测试。如果仿真测试结果正常,就可以将其移植到板子上运行了。下面是我们将RESNET18的Pytorch模型转换为RKNN模型并进行仿真测试的程序。import numpy as npimport cv2from rknn.api import RKNNimporttorchvision.models as modelsimport torchimport osdef export_pytorch_model():    net =models.resnet18(pretrained=True)   net.eval()   trace_model = torch.jit.trace(net, torch.Tensor(1, 3, 224, 224))   trace_model.save('./resnet18.pt')def show_outputs(output):   output_sorted = sorted(output, reverse=True)   top5_str = 'n-----TOP 5-----n'    for i in range(5):       value = output_sorted       index = np.where(output == value)       for j in range(len(index)):           if (i + j) >= 5:               break           if value > 0:               topi = '{}: {}n'.format(index[j],value)           else:               topi = '-1: 0.0n'           top5_str += topi   print(top5_str)defshow_perfs(perfs):    perfs= 'perfs: {}n'.format(perfs)   print(perfs)def softmax(x):   return np.exp(x)/sum(np.exp(x))if __name__ =='__main__':    model= './resnet18.pt'    ifnot os.path.exists(model):       export_pytorch_model()   input_size_list = [[1, 3, 224, 224]]    #Create RKNN object    rknn= RKNN()    #pre-process config   print('--> config model')   rknn.config(mean_values=[123.675, 116.28, 103.53], std_values=[58.395, 58.395,58.395], target_platform='rk3568')   print('done')    #Load pytorch model   print('--> Loading model')    ret =rknn.load_pytorch(model=model, input_size_list=input_size_list)    ifret != 0:       print('Load pytorch model failed!')       exit(ret)   print('done')    #Build model   print('--> Building model')    ret =rknn.build(do_quantization=True, dataset='./dataset.txt')    ifret != 0:       print('Build pytorch failed!')       exit(ret)   print('done')    #Export rknn model   print('--> Export RKNN model')    ret =rknn.export_rknn('./resnet_18.rknn')    ifret != 0:       print('Export resnet_18.rknn failed!')       exit(ret)   print('done')    ret =rknn.load_rknn('./resnet_18.rknn')    # Set inputs    img =cv2.imread('./space_shuttle_224.jpg')    img =cv2.cvtColor(img, cv2.COLOR_BGR2RGB)    # init runtimeenvironment    print('--> Initruntime environment')    ret =rknn.init_runtime()    if ret != 0:       print('Init runtime environment failed')       exit(ret)    print('done')    # Inference    print('--> Runningmodel')   outputs = rknn.inference(inputs=[img])   np.save('./pytorch_resnet18_0.npy', outputs[0])   show_outputs(softmax(np.array(outputs[0][0])))    print('done')   rknn.release()

执行运行这个测试程序,可以得到如下结果:

Downloading:"https://download.pytorch.org/models/resnet18-5c106cde.pth" to/home/armdev/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth
100%|██████████████████████████████████████|44.7M/44.7M [00:04<00:00, 10.6MB/s]
--> configmodel
done
--> Loadingmodel
/home/armdev/.local/lib/python3.6/site-packages/torch/onnx/utils.py:243:UserWarning: `add_node_names' can be set to True only when'operator_export_type' is `ONNX`. Since 'operator_export_type' is not set to'ONNX', `add_node_names` argument will be ignored.
  "`{}` argument will beignored.".format(arg_name, arg_name))
/home/armdev/.local/lib/python3.6/site-packages/torch/onnx/utils.py:243:UserWarning: `do_constant_folding' can be set to True only when 'operator_export_type'is `ONNX`. Since 'operator_export_type' is not set to 'ONNX',`do_constant_folding` argument will be ignored.
  "`{}` argument will beignored.".format(arg_name, arg_name))
done
--> Buildingmodel
Analysing :   0%|                                                            | 0Analysing: 90%|████████████████████████████████████████████▉     | 44/49 [00:0Analysing : 100%|██████████████████████████████████████████████████|49/49 [00:00<00:00, 331.41it/s]
Quantizating:   0%|                                                         |0Quantizating :   2%|▉                                               | 1/49 [00:Quantizating : 73%|███████████████████████████████████▎            | 36/49 [00:Quantizating :100%|███████████████████████████████████████████████| 49/49 [00:00<00:00,157.27it/s]
I RKNN: librknncversion: 1.1.0 (8a9d6f66@2021-08-19T15:07:14)
D RKNN:[20:33:13.562] RKNN is invoked
D RKNN:[20:33:13.749] >>>>>> start: N4rknn16RKNNAddFirstConvE
D RKNN:[20:33:13.749] <<<<<<<< end: N4rknn16RKNNAddFirstConvE
D RKNN:[20:33:13.749] >>>>>> start: N4rknn17RKNNTileGroupConvE
D RKNN:[20:33:13.749] <<<<<<<< end: N4rknn17RKNNTileGroupConvE
D RKNN:[20:33:13.749] >>>>>> start: N4rknn15RKNNAddConvBiasE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn15RKNNAddConvBiasE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn15RKNNTileChannelE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn15RKNNTileChannelE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn18RKNNPerChannelPrepE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn18RKNNPerChannelPrepE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn21RKNNFuseOptimizerPassE
D RKNN:[20:33:13.750] <<<<<<<< end:N4rknn21RKNNFuseOptimizerPassE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn11RKNNBnQuantE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn11RKNNBnQuantE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn15RKNNTurnAutoPadE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn15RKNNTurnAutoPadE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn16RKNNInitRNNConstE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn16RKNNInitRNNConstE
D RKNN:[20:33:13.750] >>>>>> start: N4rknn17RKNNInitCastConstE
D RKNN:[20:33:13.750] <<<<<<<< end: N4rknn17RKNNInitCastConstE
D RKNN:[20:33:13.750] >>>>>> start: OpEmit
D RKNN:[20:33:13.753] Tile idx -> 0 : input_h_idx : -3 output_split_height : 63 input_w_idx : -3output_split_width : 112 output_channel_idx : 0
D RKNN:[20:33:13.753] Tile idx -> 1 : input_h_idx : 123 output_split_height : 49 input_w_idx : -3output_split_width : 112 output_channel_idx : 0
D RKNN:[20:33:13.759] Tile idx -> 0 :  input_h_idx: -1 output_split_height : 56 input_w_idx : -1 output_split_width : 56output_channel_idx : 0
D RKNN:[20:33:13.759] Tile idx -> 0 : input_h_idx : -1 output_split_height : 56 input_w_idx : -1output_split_width : 56 output_channel_idx : 0
D RKNN: [20:33:13.762]Tile idx -> 0 :  input_h_idx : -1output_split_height : 56 input_w_idx : -1 output_split_width : 56output_channel_idx : 0
D RKNN:[20:33:13.762] Tile idx -> 0 : input_h_idx : -1 output_split_height : 56 input_w_idx : -1output_split_width : 56 output_channel_idx : 0
D RKNN:[20:33:13.762] Tile idx -> 0 : input_h_idx : 0 output_split_height : 28 input_w_idx : 0output_split_width : 28 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 28 input_w_idx : -1output_split_width : 28 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 28 input_w_idx : -1output_split_width : 28 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 28 input_w_idx : -1output_split_width : 28 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 28 input_w_idx : -1output_split_width : 28 output_channel_idx : 0
D RKNN: [20:33:13.763]Tile idx -> 0 :  input_h_idx : 0output_split_height : 14 input_w_idx : 0 output_split_width : 14output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 14 input_w_idx : -1output_split_width : 14 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 14 input_w_idx : -1output_split_width : 14 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 14 input_w_idx : -1output_split_width : 14 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 14 input_w_idx : -1output_split_width : 14 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : 0 output_split_height : 7 input_w_idx : 0output_split_width : 7 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 7 input_w_idx : -1output_split_width : 7 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 7 input_w_idx : -1output_split_width : 7 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 7 input_w_idx : -1output_split_width : 7 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : -1 output_split_height : 7 input_w_idx : -1output_split_width : 7 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : 0 output_split_height : 1 input_w_idx : 0 output_split_width: 1 output_channel_idx : 0
D RKNN:[20:33:13.763] Tile idx -> 0 : input_h_idx : 0 output_split_height : 1 input_w_idx : 0output_split_width : 1 output_channel_idx : 0
D RKNN:[20:33:13.764] <<<<<<<< end: OpEmit
D RKNN:[20:33:13.764] >>>>>> start: N4rknn21RKNNOperatorIdGenPassE
D RKNN:[20:33:13.764] <<<<<<<< end:N4rknn21RKNNOperatorIdGenPassE
D RKNN:[20:33:13.764] >>>>>> start: N4rknn23RKNNWeightTransposePassE
D RKNN:[20:33:14.132] <<<<<<<< end: N4rknn23RKNNWeightTransposePassE
D RKNN:[20:33:14.132] >>>>>> start: N4rknn21RKNNMemStatisticsPassE
D RKNN:[20:33:14.132] ----------------------------+---------------------------------
D RKNN:[20:33:14.132] ID  User           Tensor   |   [offset       )end       size
D RKNN:[20:33:14.132] ----------------------------+---------------------------------
D RKNN:[20:33:14.132] 1   ConvRelu       input.11 | 0x00000000 0x00024c000x00024c00
D RKNN:[20:33:14.132] 2   MaxPool        105     | 0x00024c00 0x00119c00 0x000f5000
D RKNN:[20:33:14.132] 5   Add            106      | 0x00119c00*0x0014ac00 0x00031000
D RKNN:[20:33:14.132] 3   ConvRelu       106     | 0x00119c00*0x0014ac00 0x00031000
D RKNN:[20:33:14.132] 5   Add            106      | 0x00119c00*0x0014ac00 0x00031000
D RKNN:[20:33:14.132] 3   ConvRelu       106     | 0x00119c00*0x0014ac00 0x00031000
D RKNN:[20:33:14.132] 4   Conv           109      | 0x00000000 0x0003d400 0x0003d400
D RKNN:[20:33:14.132] 5   Add            111      | 0x0003d400 0x0007a800 0x0003d400
D RKNN:[20:33:14.132] 6   Relu           112      | 0x00000000 0x00031000 0x00031000
D RKNN:[20:33:14.132] 9   Add            113      | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 7   ConvRelu       113     | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 9   Add            113      | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 7   ConvRelu       113     | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 8   Conv           116      | 0x00062000 0x0009f400 0x0003d400
D RKNN:[20:33:14.132] 9   Add            118      | 0x0009f400 0x000dc800 0x0003d400
D RKNN:[20:33:14.132] 10  Relu           119      | 0x00000000 0x00031000 0x00031000
D RKNN:[20:33:14.132] 11  Conv           120      | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 12  ConvRelu       120     | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 11  Conv           120      | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 12  ConvRelu       120     | 0x00031000 0x00062000 0x00031000
D RKNN:[20:33:14.132] 14  Add            127      | 0x00000000 0x0001b900 0x0001b900
D RKNN:[20:33:14.132] 13  Conv           123      | 0x00062000 0x0007d900 0x0001b900
D RKNN:[20:33:14.132] 14  Add            125      | 0x0001b900 0x00037200 0x0001b900
D RKNN:[20:33:14.133] 15  Relu           128      | 0x00037200 0x0004fa00 0x00018800
D RKNN:[20:33:14.133] 18  Add            129      | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 16  ConvRelu       129     | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 18  Add            129      | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 16  ConvRelu       129     | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 17  Conv           132      | 0x00018800 0x00034100 0x0001b900
D RKNN:[20:33:14.133] 18  Add            134      | 0x00034100 0x0004fa00 0x0001b900
D RKNN:[20:33:14.133] 19  Relu           135      | 0x00018800 0x00031000 0x00018800
D RKNN:[20:33:14.133] 20  Conv           136      | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 21  ConvRelu       136     | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 20  Conv           136      | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 21  ConvRelu       136     | 0x00000000 0x00018800 0x00018800
D RKNN:[20:33:14.133] 23  Add            143      | 0x00018800 0x00025840 0x0000d040
D RKNN:[20:33:14.133] 22  Conv           139      | 0x00025840 0x00032880 0x0000d040
D RKNN:[20:33:14.133] 23  Add            141      | 0x00000000 0x0000d040 0x0000d040
D RKNN:[20:33:14.133] 24  Relu           144      | 0x00025840 0x00031c40 0x0000c400
D RKNN:[20:33:14.133] 27  Add            145      | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 25  ConvRelu       145     | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 27  Add            145      | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 25  ConvRelu       145     | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 26  Conv           148      | 0x0000c400 0x00019440 0x0000d040
D RKNN:[20:33:14.133] 27  Add            150      | 0x00019440 0x00026480 0x0000d040
D RKNN:[20:33:14.133] 28  Relu           151      | 0x0000c400 0x00018800 0x0000c400
D RKNN:[20:33:14.133] 29  Conv           152      | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 30  ConvRelu       152     | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 29  Conv           152      | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 30  ConvRelu       152     | 0x00000000 0x0000c400 0x0000c400
D RKNN:[20:33:14.133] 32  Add            159      | 0x0000c400 0x00012f40 0x00006b40
D RKNN:[20:33:14.133] 31  Conv           155      | 0x00012f40 0x00019a80 0x00006b40
D RKNN:[20:33:14.133] 32  Add            157      | 0x00000000 0x00006b40 0x00006b40
D RKNN:[20:33:14.133] 33  Relu           160      | 0x00012f40 0x00019740 0x00006800
D RKNN:[20:33:14.133] 36  Add            161      | 0x00000000 0x00006800 0x00006800
D RKNN:[20:33:14.133] 34  ConvRelu       161     | 0x00000000 0x00006800 0x00006800
D RKNN:[20:33:14.133] 36  Add            161      | 0x00000000 0x00006800 0x00006800
D RKNN:[20:33:14.133] 34  ConvRelu       161     | 0x00000000 0x00006800 0x00006800
D RKNN:[20:33:14.134] 35  Conv           164      | 0x00006800 0x0000d340 0x00006b40
D RKNN:[20:33:14.134] 36  Add            166      | 0x0000d340 0x00013e80 0x00006b40
D RKNN:[20:33:14.134] 37  Relu           167      | 0x00006800 0x0000d000 0x00006800
D RKNN:[20:33:14.134] 38  Conv           168      | 0x00000000 0x00006800 0x00006800
D RKNN:[20:33:14.134] 39  Conv           169      | 0x00006800 0x00006a10 0x00000210
D RKNN:[20:33:14.134] 40  Reshape        171_conv | 0x00000000 0x000004100x00000410
D RKNN:[20:33:14.134] 41  OutputOperator171      | 0x00000440 0x000008400x00000400
D RKNN:[20:33:14.134] ----------------------------+---------------------------------
D RKNN:[20:33:14.134]-------------------------------------------------------------------------------+---------------------------------
D RKNN:[20:33:14.134] ID  User                               Tensor                                  |    [offset       )end       size
D RKNN:[20:33:14.134]-------------------------------------------------------------------------------+---------------------------------
D RKNN:[20:33:14.134] 1   ConvRelu                           1                                       | 0x00000000 0x00006200 0x00006200
D RKNN:[20:33:14.134] 3   ConvRelu                           6                                       |0x00006200 0x0000f200 0x00009000
D RKNN:[20:33:14.134] 4   Conv                               11                                      | 0x0000f2000x00018200 0x00009000
D RKNN:[20:33:14.134] 7   ConvRelu                           16                                      |0x00018200 0x00021200 0x00009000
D RKNN:[20:33:14.134] 8   Conv                               21                                      |0x00021200 0x0002a200 0x00009000
D RKNN:[20:33:14.134] 12  ConvRelu                           26                                      |0x0002a200 0x0003c200 0x00012000
D RKNN:[20:33:14.134] 13  Conv                               31                                      |0x0003c200 0x00060200 0x00024000
D RKNN:[20:33:14.134] 11  Conv                               36                                      |0x00060200 0x00062200 0x00002000
D RKNN:[20:33:14.134] 16  ConvRelu                           41                                      |0x00062200 0x00086200 0x00024000
D RKNN:[20:33:14.134] 17  Conv                               46                                      |0x00086200 0x000aa200 0x00024000
D RKNN:[20:33:14.134] 21  ConvRelu                           51                                      |0x000aa200 0x000f2200 0x00048000
D RKNN:[20:33:14.134] 22  Conv                               56                                      |0x000f2200 0x00182200 0x00090000
D RKNN:[20:33:14.134] 20  Conv                               61                                      |0x00182200 0x0018a200 0x00008000
D RKNN:[20:33:14.134] 25  ConvRelu                           66                                      | 0x0018a200 0x0021a200 0x00090000
D RKNN:[20:33:14.134] 26  Conv                               71                                      |0x0021a200 0x002aa200 0x00090000
D RKNN:[20:33:14.134] 30  ConvRelu                           76                                      | 0x002aa200 0x003ca2000x00120000
D RKNN:[20:33:14.134] 31  Conv                               81                                      |0x003ca200 0x0060a200 0x00240000
D RKNN:[20:33:14.134] 29  Conv                               86                                      |0x0060a200 0x0062a200 0x00020000
D RKNN:[20:33:14.134] 34  ConvRelu                           91                                      |0x0062a200 0x0086a200 0x00240000
D RKNN:[20:33:14.134] 35  Conv                               96                                      |0x0086a200 0x00aaa200 0x00240000
D RKNN:[20:33:14.134] 39  Conv                               101                                     |0x00aaa200 0x00b27200 0x0007d000
D RKNN:[20:33:14.134] 39  Conv                               102                                     |0x00b27200 0x00b28200 0x00001000
D RKNN:[20:33:14.134] 1   ConvRelu                          BatchNormalization_104_bias            | 0x00b28200 0x00b28300 0x00000100
D RKNN: [20:33:14.134]3   ConvRelu                          BatchNormalization_108_bias            | 0x00b28300 0x00b28400 0x00000100
D RKNN:[20:33:14.134] 4   Conv                              BatchNormalization_111_bias            | 0x00b28400 0x00b28500 0x00000100
D RKNN:[20:33:14.134] 7   ConvRelu                          BatchNormalization_115_bias            | 0x00b28500 0x00b28600 0x00000100
D RKNN:[20:33:14.135] 8   Conv                              BatchNormalization_118_bias            | 0x00b28600 0x00b28700 0x00000100
D RKNN:[20:33:14.135] 12  ConvRelu                          BatchNormalization_122_bias            | 0x00b28700 0x00b28900 0x00000200
D RKNN:[20:33:14.135] 13  Conv                              BatchNormalization_125_bias             | 0x00b28900 0x00b28b00 0x00000200
D RKNN:[20:33:14.135] 16  ConvRelu                          BatchNormalization_131_bias            | 0x00b28b00 0x00b28d00 0x00000200
D RKNN:[20:33:14.135] 17  Conv                               BatchNormalization_134_bias             | 0x00b28d00 0x00b28f00 0x00000200
D RKNN:[20:33:14.135] 21  ConvRelu                          BatchNormalization_138_bias            | 0x00b28f00 0x00b29300 0x00000400
D RKNN:[20:33:14.135] 22  Conv                               BatchNormalization_141_bias             | 0x00b29300 0x00b29700 0x00000400
D RKNN:[20:33:14.135] 25  ConvRelu                          BatchNormalization_147_bias            | 0x00b29700 0x00b29b00 0x00000400
D RKNN:[20:33:14.135] 26  Conv                               BatchNormalization_150_bias             | 0x00b29b00 0x00b29f00 0x00000400
D RKNN:[20:33:14.135] 30  ConvRelu                          BatchNormalization_154_bias            | 0x00b29f00 0x00b2a700 0x00000800
D RKNN:[20:33:14.135] 31  Conv                              BatchNormalization_157_bias            | 0x00b2a700 0x00b2af00 0x00000800
D RKNN:[20:33:14.135] 34  ConvRelu                          BatchNormalization_163_bias            | 0x00b2af00 0x00b2b700 0x00000800
D RKNN:[20:33:14.135] 35  Conv                              BatchNormalization_166_bias            | 0x00b2b700 0x00b2bf00 0x00000800
D RKNN:[20:33:14.135] 38  Conv                              GlobalAveragePool_169_2conv_weight     | 0x00b2bf00 0x00b32100 0x00006200
D RKNN:[20:33:14.135] 40  Reshape                           Gemm_171_2conv_reshape2_shape          | 0x00b32100 0x00b32110 0x00000010
D RKNN:[20:33:14.135] 11  Conv                              BatchNormalization_127_bias            | 0x00b32140 0x00b323400x00000200
D RKNN:[20:33:14.135] 20  Conv                              BatchNormalization_143_bias            | 0x00b32340 0x00b32740 0x00000400
D RKNN:[20:33:14.135] 29  Conv                              BatchNormalization_159_bias            | 0x00b32740 0x00b32f40 0x00000800
D RKNN:[20:33:14.135] 38  Conv                              GlobalAveragePool_169_2conv_weight_bias | 0x00b32f40*0x00b337400x00000800
D RKNN:[20:33:14.135] -------------------------------------------------------------------------------+---------------------------------
D RKNN:[20:33:14.135] Total Weight Memory  :11745088
D RKNN:[20:33:14.135] Total Internal Memory: 1354752
D RKNN:[20:33:14.135] Total Memory: 13099840
D RKNN:[20:33:14.135] <<<<<<<< end:N4rknn21RKNNMemStatisticsPassE
D RKNN:[20:33:14.135] >>>>>> start: N4rknn18RKNNModelBuildPassE
D RKNN:[20:33:14.137] <<<<<<<< end:N4rknn18RKNNModelBuildPassE
done
--> ExportRKNN model
done
--> Initruntime environment
Preparing :   0%|                                                           |0Preparing : 78%|██████████████████████████████████████▊           | 38/49 [00:0Preparing :100%|███████████████████████████████████████████████████| 49/49[00:00<00:00, 93.31it/s]
W init_runtime:target is None, use simulator!
done
--> Runningmodel
-----TOP 5-----
[812]:0.9997096061706543
[404]:0.0002214169508079067
[657]:1.449792762286961e-05
[833]:1.0159761586692184e-05
[895]:9.024212886288296e-06
done

测试程序运行后会生成resnet_18.rknn模型,这个就是我们要在开发板上部署的模型了。RKNN模型通常比其他模型的大小要小一些,比如测试程序用到的预训练RESNET18的pt文件是45MB,而RKNN文件是11MB。


三、转换后的模型在OK3568开发板上的运行我们直接使用fltest_opencv_rknn_mobilenet进行的测试,因为它的处理方法和我们的模型比较接近。在板子上的运行结果如下所示,由于归一化的方法和Python程序不一样,所以输出的数值有区别,前两位仍然是812和404。[root@ok3568:/home]#fltest_opencv_rknn_mobilenet resnet_18.rknn space_shuttle_224.jpg[  269.055461] cma: cma_alloc: alloc failed,req-size: 331 pages, ret: -12[  269.055490] RKNPU fde40000.npu: RKNPU: try tofallback to allocate non-contiguous 1355776 bufmodel input num: 1, output num:1input tensors:fer.index=0name=input.11 n_dims=4 dims=[1 224 224 3] n_elems=150528 size=150528 fmt=0type=3 qnt_type=2 fl=0 zp=-13 scale=0.018478output tensors:index=0 name=171n_dims=2 dims=[1 1000 0 0] n_elems=1000 size=4000 fmt=0 type=0 qnt_type=2 fl=0zp=-70 scale=0.118524rknn_run--- Top5 ---812: 19.911957404: 11.970879833: 9.955978657: 9.600408744: 9.481884





关键词: RK3568     Toolkit2     Pytorch    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]