赞
踩
所有代码见: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模型
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='')
**
ps:
.pb模型有两种,注意区分。
# 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)
其中模型的各种参数包括是否量化都参考官方文档。
测试结果:
# 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.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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。