2018.03.12
由于要完成一个项目的原因,开始查找将tensorflow模型转换成lite格式,但是网上资料相对较少,又有一些细节没写,我作为一个新手实在是吃力,花了一个多星期,终于生成成功,以此记录总结一下,请多多指教。
我原先的模型是有tensorflow 的 /tensorflow-master/tensorflow/examples/image_retraining/retrain.py 生成的mobilenet的模型处理的分类问题。
**移动设备上使用谷歌开源的深度学习框架 Tensorflow Lite,最新源码位置:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite**
网上大致找了一下资料,具体说来,tflite文件的生成大致分为3步:
在算法训练的脚本中保存图模型文件(GraphDef)和变量文件(CheckPoint)。
利用freeze_graph工具生成frozen的graphdef文件。
利用toco工具,生成最终的tflite文件。
其相应的步骤,可参考:https://www.jianshu.com/p/fa204a54a956?from=singlemessage
如果是缺少某些文件即可根据代码生成。
当然也可以利用现有的模型文件(.pb)和变量文件(.ckpt),下载下来直接转换成lite模型格式。下载地址为:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md
当然也还有现有的lite模型文件,如果你想直接拿此lite模型到移动端上测试(这部分我接下来会完成,可能之后会更新相关操作以及碰到的问题),可从此地址下载:https://fossies.org/linux/tensorflow/tensorflow/contrib/lite/g3doc/models.md
重点内容:模型转换器的一些重要的命令的应用可查看链接:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/toco/g3doc/cmdline_examples.md(注意查看每个标题,可能你的问题就迎刃而解了)
还有!!!这个官方文档查了好久才看到,仔细看完觉得很容易理解,大家不妨花心思看看:https://fossies.org/linux/tensorflow/tensorflow/contrib/lite/README.md
如果你没有安装bazel,可从根据官方教程如下地址下载:https://docs.bazel.build/versions/master/install.html(但可能看的很蒙,请往下看)
我的系统:ubuntu 16.04
安装教程:
1、安装JDK8
2、从三种方法中任选一种进行安装,注意有些方法需要加环境变量,请仔细看
3、根据官方文档完成Getting bash completion和Getting zsh completion,参考地址为:
https://docs.bazel.build/versions/master/install.html#getting-bash-completion
http://blog.sina.com.cn/s/blog_15856a0240102x7jv.html
至此,bazel 安装好了,但是应该怎么用呢?
那些workspace和build又是什么东西,应该怎么理解呢?
这是个大问题,由于我们是针对移动端的,现在以安卓系统为例,参考以下内容:https://docs.bazel.build/versions/master/tutorial/android-app.html
但相信很多人都搞闷,给出以下链接,花点时间好好看看即可清楚bazel中workspace和build之间的关系:https://zhidao.baidu.com/question/1545352418081988987.html
如果你想自己生成workspace或是build的话,可用如下命令完成:
mkdir tensorflow
cd tensorflow
touch WORKSPACE (或touch BUILD)
参考:http://blog.csdn.net/hongxingabc/article/details/77017848
相信大家了解了bazel中workspace和build之间的关系之后再去执行bazel生成lite的命令的时候就轻松很多了,只剩最后的执行了。
以下列一些我在执行bazel命令是遇到的问题
问题一:BUILD file not found on package path
解决方法:
http://quabr.com/36070588/distributed-tensorflow-fails-with-build-file-not-found-on-package
https://stackoverflow.com/questions/1030169/easy-way-to-pull-latest-of-all-git-submodules
https://stackoverflow.com/questions/36070588/distributed-tensorflow-fails-with-build-file-not-found-on-package
问题二:ERROR: Error evaluating WORKSPACE file
问题三:TensorFlow fails to compile
解决方法:
https://stackoverflow.com/questions/47080760/tensorflow-fails-to-compile/47295278
问题四:FAILED: Build did NOT complete successfully (0 packages loaded)
解决办法:加入-c opt –copt=-msse4,变成
bazel build -c opt –copt=-mss4 …即可解决(原因我还不太了解,希望大神指出)
可参考:
https://stackoverflow.com/questions/41293077/how-to-compile-tensorflow-with-sse4-2-and-avx-instructions
问题五:BUILD:174:1: C++ compilation of rule
问题六:Target //tensorflow/contrib/lite/toco:toco failed to build
以上没解决的问题,相信大家在清楚bazel中workspace和build之间的关系:https://zhidao.baidu.com/question/1545352418081988987.html之后应该都能够解决,我就不再多说(其实主要是因为我没有截图,抱歉)
以下是有截图的部分:
1.在输入构建目标时:
bazel build //tensorflow/contrib/lite/toco:toco
bazel build -c opt --copt=-msse4 //tensorflow/contrib/lite/toco:toco
问题解决。
2.想要查看.pb文件的输入输出节点名称时,输入:
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=mobilenet_v1_1.0_224_frozen.pb
总是出现如下问题:
最后发现是因为“in_graph”后面应该是.pb的绝对路径,改完就可以了。
3.在构建执行最后的bazel-bin时,输入为:
bazel-bin/tensorflow/contrib/lite/toco/toco input_file=zhunbei/frozen_graph.pb output_file=zhunbei/mobilenet_v1_224.tflite input_format=TENSORFLOW_GRAPHDEF output_format=TFLITE inference_type=QUANTIZED_UINT8 input_shape=1,224,224,3 input_array=input output_array=MobilenetV1/Predictions/Reshape_1
一直出现如下错误
2018-03-12 21:22:10.971385: W tensorflow/contrib/lite/toco/toco_cmdline_flags.cc:177] --input_type is deprecated. Use --inference_input_type.
2018-03-12 21:22:10.971433: F tensorflow/contrib/lite/toco/toco.cc:46] Check failed: parsed_toco_flags.input_file.specified() Missing required flag: input_file
已放弃 (核心已转储)
最后将输入的顺序进行了调整(根据官方文档进行输入:https://fossies.org/linux/tensorflow/tensorflow/contrib/lite/README.md)
bazel-bin/tensorflow/contrib/lite/toco/toco --input_file=zhunbei/frozen_graph.pb --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --output_file=/tmp/mobilenet_v1_1.0_224.lite --inference_type=FLOAT --input_type=FLOAT --input_arrays=input --output_arrays=MobilenetV1/Predictions/Reshape_1 --input_shapes=1,224,224,3
则最终.lite文件生成成功!!!!总共历时了一个多星期!
不过还有个问题,我记得那个文件里说过float类型的的lite文件不能在移动端执行,只有quant类型的才可以,但是由于这几天查找的内容太多了目前找不到,等我确定了再与大家共享。
最后,若您想要试试在安卓上的检测,请查看:http://blog.csdn.net/leifengpeng/article/details/78559208
我将会在接下来的几天里也完成测试。
其余重要的参考文章:
http://blog.csdn.net/bhneo/article/details/78835224
http://www.jishux.com/plus/view-725615-1.html
http://www.gpu-computing.cn/?p=71
http://blog.csdn.net/u010700335/article/details/69422282
https://sonic.gitbooks.io/bazel/chapter1.html
http://blog.csdn.net/zhangweijiqn/article/details/53200081