当前位置:   article > 正文

rk3588网络部署_rk3588 模型部署

rk3588 模型部署

所有代码见:https://github.com/hehehe-449/Quantization-and-Deployment-of-Deep-Neural-Networks-on-rknn3588

模型准备

model.py
utils.py
main.py
generate_patches_rgb.py
训练得到.cpkt模型

模型转换(最容易出问题)

  1. cpkt→.pb()
				ckpt_path = ".\checkpoint2\CDnCNN-B-tensorflow-51150"
                tf.train.write_graph(sess.graph_def, './pb_model', 'model_deBN.pb')  # 通过write_graph生成模型文件
                freeze_graph.freeze_graph(
                    input_graph='./pb_model/model_deBN.pb',  # 传入write_graph生成的模型文件
                    input_saver='',
                    input_binary=False,
                    input_checkpoint=ckpt_path,  # 传入训练生成的checkpoint文件
                    output_node_names='CDnCNN/output',  # 与定义的推理网络输出节点保持一致
                    output_graph='./pb_model/CDnCNN_deBN.pb',  # 改为需要生成的推理网络的名称
                    restore_op_name='save/restore_all',
                    filename_tensor_name='save/Const:0',
                    clear_devices=True,
                    initializer_nodes='')
**
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

ps:
.pb模型有两种,注意区分。

  1. .pb→.rknn
    # Pre-process config
    print('--> Config model')
    rknn.config(mean_values=[0, 0, 0],
                std_values=[255, 255, 255],
                target_platform='rk3588')

    # Load model
    print('--> Loading model')
    ret = rknn.load_tensorflow(tf_pb=PB_FILE,
                               inputs=INPUTS,
                               outputs=OUTPUTS,
                               input_size_list=[[1, INPUT_SIZE_H, INPUT_SIZE_W, 3]])
                               
    # Build Model
    print('--> Building model')
    # ret = rknn.build(do_quantization=False)
    ret = rknn.build(do_quantization=True, dataset='./dataset.txt')

    # Export rknn model
    print('--> Export rknn model')
    ret = rknn.export_rknn(RKNN_MODEL_PATH)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

其中模型的各种参数包括是否量化都参考官方文档。

模型部署测试

测试结果:

   # load RKNN model
    print('--> Load RKNN model')
    ret = rknn_lite.load_rknn(rknn_model)
    if ret != 0:
        print('Load RKNN model failed')
        exit(ret)
    print('done')

    # init runtime environment
    print('--> Init runtime environment')
    # run on RK356x/RK3588 with Debian OS, do not need specify target.
    if host_name == 'RK3588':
        ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
    else:
        ret = rknn_lite.init_runtime()

    # Inference
    print('--> Running model')
    outputs = rknn_lite.inference(inputs=[img])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

图片尺寸:
在这里插入图片描述

测试模型:
在这里插入图片描述

平均速度:
在这里插入图片描述

还测了一下不量化模型的单张推理速度:

在这里插入图片描述

模型转换过程涉及的一些问题:

1.tensorflow的几种模型保存格式(checkpoint格式和SavedModel格式和protobuf格式)之间的区别和转换。
https://blog.csdn.net/qq_43802016/article/details/132188780?spm=1001.2014.3001.5502

2.tensorflow中计算图节点和张量的命名
https://blog.csdn.net/qq_43802016/article/details/132188548?spm=1001.2014.3001.5502

3.模型可视化操作。
可视化模型很重要!后面转换的时候需要明确输入输出节点的名称,包括转换的时候如果有算子报错也可以直接定位位置。

4.明确官方支持的算子。
转成rknn的时候出错去检查一下是不是有不支持的算子,我做的时候还不支持tensorflow的BN,后面是把BN直接去掉重新训练的。

5.开发环境部署(虚拟机,samba,mnt,miniconda…)
主要是虚拟机,主机,开发板之间的通信以及各种驱动和包的配置,多看文档多看帖子多试试。前期很多东西没概念可以把《鸟哥的LINUX私房菜》当工具书翻一翻。

总结+碎碎念:

主要流程就是先GPU训练得到待转换的.cpkt模型,再frezze得到可部署的.pb模型,以上步骤都是在自己跑模型的环境里完成的。接下来在配好环境的虚拟机里将.pb模型转换为NPU可推断的.rknn格式,最后将.rknn模型推上板子测试。

其中花时间最多的是将.cpkt格式freeze保存成.pb格式,一开始对tensorflow模型保存格式也不熟悉,搞清楚不同格式的区别以后转换过程也有很多问题,同样的转换函数,不同的训练方式也有差别,一开始只是拿现成的训练代码跑,后来对接的时候各种问题,干脆就自己重构了一遍,果然流畅多了,自己写的代码看着就是顺眼hhhh

很多东西都是第一次上手,嵌入式神经网络的部署网上资料也不太多,一开始做的时候也迷茫的,整个流程跑通以后发现人家的工具已经做的很完善了,模型转换也好量化也好,封装的都很好,主要是在学习使用工具罢了。当然前期转换的时候还是需要对模型足够了解,转换出错追踪到的可能很底层的算子,不熟悉模型都不知道从哪里开始debug。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/229570
推荐阅读
  

闽ICP备14008679号