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**
一、了解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的安裝、使用及碰到的坑(血淚史)
如果你沒有安裝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.在輸入建構目标時:
出現如下問題:
1.
解決方法。改成輸入:
問題解決。
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=,,, input_array=input output_array=MobilenetV1/Predictions/Reshape_1
一直出現如下錯誤
-- ::: W tensorflow/contrib/lite/toco/toco_cmdline_flags.cc:] --input_type is deprecated. Use --inference_input_type.
-- ::: F tensorflow/contrib/lite/toco/toco.cc:] Check failed: parsed_toco_flags.input_file.specified() Missing required flag: input_file
已放棄 (核心已轉儲)
最後将輸入的順序進行了調整(根據官方文檔進行輸入:https://fossies.org/linux/tensorflow/tensorflow/contrib/lite/README.md)
則最終.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