天天看點

TensorFlow Lite模型生成以及bazel的安裝使用、出現的問題及解決方案整合

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步:

  1. 在算法訓練的腳本中儲存圖模型檔案(GraphDef)和變量檔案(CheckPoint)。
  2. 利用freeze_graph工具生成frozen的graphdef檔案。
  3. 利用toco工具,生成最終的tflite檔案。
TensorFlow Lite模型生成以及bazel的安裝使用、出現的問題及解決方案整合

其相應的步驟,可參考: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.

TensorFlow Lite模型生成以及bazel的安裝使用、出現的問題及解決方案整合

解決方法。改成輸入:

問題解決。

2.想要檢視.pb檔案的輸入輸出節點名稱時,輸入:

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=mobilenet_v1_1.0_224_frozen.pb

           

總是出現如下問題:

TensorFlow Lite模型生成以及bazel的安裝使用、出現的問題及解決方案整合

 最後發現是因為“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

繼續閱讀