Tensorflow Lite安卓端移植【更新中】

TF Lite移植大致就是三步走!

1、TensorFlow模型准备

用tf.save.Saver()将你的网络保存下来,会形成4个文件,包含checkpoint,meta图,和变量的值
这里想提一点就是尽量使用tf.contrib.slim里封装好的层来搭建模型,这样适配的可能会好一些,如果有错可以指正
在这里插入图片描述

2、checkpoint模型的固化

这一步往往是最关键的一步。
首先明确配置上的要求:确保你的tensorflow版本为1.12.0或更高,亲测1.9.0的toco工具会爆bug,这一点也是官方给出的解释
如果模型固化爆bug了可以看看这两个:https://github.com/tensorflow/tensorflow/issues/24128#issuecomment-458252184
https://github.com/tensorflow/tensorflow/issues/20886

freeze_graph工具

网上普遍是采用bazel编译然后用bazel build,但是我亲测好像不行,因为这样你需要从源码编译tensorflow,对我来说太麻烦了
在这里安利一下我改的freeze_graph.py,【点击这里,在线收获资源
真的肥肠好用!!
用法:

python freeze_graph.py -c ./output/VGG16 -o ./output/VGG16_freeze.pb -n predictions/Softmax
#首先键入.meta文件的保存路径,注意不要.meta的后缀
#第二键入输出路径和文件名
#第三键入输出节点名称
#可用python freeze_graph.py -h查看

在这里插入图片描述
因为我的网络是多任务,有三个输出,就有三个output_nodes,用逗号分隔开即可
查找nodes的名字
这也是很重要的一点,因为output_nodes的名字写不对是没办法运行的
方法一:

net = VGG16() #模型定义
config = net.get_config()
print config

这样会输出所有nodes的名字,然后就从输出中找就行,像下图密密麻麻的…………虽然复杂,但是操作起来简单,一般不会出错
在这里插入图片描述
方法二:
用tensorboard查看,这种方法需要在程序中修改,tensorboard的具体实现这里不赘述,但是我觉得并不能看懂啊…………比如conv4_1我需要的输出节点叫conv4_1/Softmax,可是tensorboard并没有直观体现,所以不推荐
在这里插入图片描述
方法三:【推荐使用】
模型中打印出来,函数如下
在这里插入图片描述
每一层结束后调用该函数
在这里插入图片描述
输出如下,shape是我另外打印的,这样就得到了节点名称
在这里插入图片描述
当freeze_graph运行结束后会生成.pb文件!

TOCO转化工具

输入.pb文件,对应的输出节点,输入array,输出函数名就ok
我出现了一点小错误,分享出来
(1)不能只输入input_shapes,需要输入input_array的名字,这个名字我实在tensorboard上看到的,就叫input_image

$ toco --graph_def_file PNet.pb --output_file PNet.tflite --output_arrays conv4_1/Softmax,conv4_2/BiasAdd,conv4_3/BiasAdd --input_shapes 1,224,224,3
usage: toco [-h] --output_file OUTPUT_FILE
            (--graph_def_file GRAPH_DEF_FILE | --saved_model_dir SAVED_MODEL_DIR | --keras_model_file KERAS_MODEL_FILE)
            [--output_format {TFLITE,GRAPHVIZ_DOT}]
            [--inference_type {FLOAT,QUANTIZED_UINT8}]
            [--inference_input_type {FLOAT,QUANTIZED_UINT8}]
            [--input_arrays INPUT_ARRAYS] [--input_shapes INPUT_SHAPES]
            [--output_arrays OUTPUT_ARRAYS]
            [--saved_model_tag_set SAVED_MODEL_TAG_SET]
            [--saved_model_signature_key SAVED_MODEL_SIGNATURE_KEY]
            [--std_dev_values STD_DEV_VALUES] [--mean_values MEAN_VALUES]
            [--default_ranges_min DEFAULT_RANGES_MIN]
            [--default_ranges_max DEFAULT_RANGES_MAX]
            [--post_training_quantize] [--drop_control_dependency]
            [--reorder_across_fake_quant]
            [--change_concat_input_ranges {TRUE,FALSE}] [--allow_custom_ops]
            [--converter_mode {DEFAULT,TOCO_FLEX,TOCO_FLEX_ALL}]
            [--dump_graphviz_dir DUMP_GRAPHVIZ_DIR] [--dump_graphviz_video]
toco: error: --input_arrays and --output_arrays are required with --graph_def_file

(2)input_shapes的值有错误,删掉这个量,只给input_arrays就行

$ toco --graph_def_file PNet.pb --output_file PNet.tflite --output_arrays conv4_1/Softmax,conv4_2/BiasAdd,conv4_3/BiasAdd --input_shapes 1,12,12,3 --input_arrays input_image
Traceback (most recent call last):
  File "/usr/local/bin/toco", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 412, in main
    app.run(main=run_main, argv=sys.argv[:1])
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 125, in run
    _sys.exit(main(argv))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 408, in run_main
    _convert_model(tflite_flags)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 100, in _convert_model
    converter = _get_toco_converter(flags)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 87, in _get_toco_converter
    return converter_fn(**converter_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/lite/python/lite.py", line 286, in from_frozen_graph
    _set_tensor_shapes(input_tensors, input_shapes)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/lite/python/convert_saved_model.py", line 205, in set_tensor_shapes
    tensor.set_shape(shape)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 561, in set_shape
    raise ValueError(str(e))
ValueError: Dimension 0 in both shapes must be equal, but are 256 and 1. Shapes are [256,12,12,3] and [1,12,12,3].

然后我还出现了这个问题
在这里插入图片描述
根据提示加上allow_custom_ops就行~~

$ toco --graph_def_file PNet.pb --output_file PNet.tflite --output_arrays conv4_1/Softmax,conv4_2/BiasAdd,conv4_3/BiasAdd --input_arrays input_image --allow_custom_ops
2019-03-01 13:31:44.106931: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA
2019-03-01 13:31:44.902880: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties: 
name: GeForce GTX 1080 major: 6 minor: 1 memoryClockRate(GHz): 1.835
pciBusID: 0000:17:00.0
totalMemory: 7.93GiB freeMemory: 7.81GiB
2019-03-01 13:31:45.030399: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 1 with properties: 
name: GeForce GTX 1080 major: 6 minor: 1 memoryClockRate(GHz): 1.835
pciBusID: 0000:65:00.0
totalMemory: 7.93GiB freeMemory: 7.81GiB
2019-03-01 13:31:45.031405: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1
2019-03-01 13:31:45.520888: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-03-01 13:31:45.520929: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0 1 
2019-03-01 13:31:45.520934: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N Y 
2019-03-01 13:31:45.520938: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1:   Y N 
2019-03-01 13:31:45.521176: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7537 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080, pci bus id: 0000:17:00.0, compute capability: 6.1)
2019-03-01 13:31:45.521475: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:1 with 7536 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080, pci bus id: 0000:65:00.0, compute capability: 6.1)

最终就会生成.tflite文件啦!
在这里插入图片描述

3、安卓端移植

发布了46 篇原创文章 · 获赞 34 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览