TensorFlowトレーニングのモデルをAndroid携帯電話に移植する方法について詳しく説明します.


前言
本論文に登場するTFはいずれもTensorFlowの略称である.
まず余談を言いましょう.TensorFlowは先日、公式版を発表しました.0,しかし自分がやっと手に入れたばかりのような気がしますr 0.12、この時代は発展が速すぎて、足どりは一刻も止まらないだろう.
しかし、TensorFlowの下向き互換性にはあまり友好的ではなく、バージョンを更新するたびに、以前のコードが走れなくなり、使用する関数が存在しなくなったとツッコミを入れなければなりません.の
コードの蓄積はますます多くなって、すべて新しいバージョンに対して1回繰り返して、工事は本当に大きいです.しかし、新しいことが好きで、古いことが嫌いで、手が私のように卑しくて、毎回我慢できずに更新を注文しました.でも今回は忍の方がまだ更新されていないので、我慢し続けます
以前の記事では、TensorFlow公式サイトのMobileチュートリアルをどのように実現するかを紹介しました.「Tensorflowをアンドロイド携帯電話に移植し、物体認識、歩行者検出、画像スタイルの移行を実現する」.しかし、そのチュートリアルでは、TensorFlowは完全で、すでに構築されたAndroidプロジェクトを提供しています.私たちがしなければならないのは3つのステップだけです.1、環境を構築します.2、コンパイル;3、携帯電話にインストール
これはもちろん足りません.私たちの最終目的はもちろん私のために使うことです.だから、どのようにして自分が訓練したTFモデルをアンドロイド携帯電話に移植することができますか?言い換えれば、訓練したモデルをAndroidプロジェクトに入れてコンパイルに成功するにはどうすればいいのでしょうか.また、自分のAndroid Tensorflowプロジェクトをどのように作成しますか?
PS:これまでアンドロイド開発の経験はなく、TFモデルを携帯電話に移植するために手をつけ始めただけで、現在は入門級のシロに属しています.間違いがあれば、批判を歓迎します.
携帯電話がTFモデルを呼び出す過程の概要:
1、トレーニング済みのTFモデルを保存する2、AndroidプロジェクトにTFモデルを導入する3、Androidプラットフォームに導入してTFモデルを呼び出すために必要なjarパッケージとsoファイル(TFモデルの解析と演算を担当する)を呼び出す3、変数を定義し、データを格納し、jarパッケージが提供するインタフェースを通じてモデルの呼び出しを行う
環境
TensorFlowバージョン:r 0.12 pythonバージョン:2.7 Python IDE:Spyder Android IDE:Android Studio
移植プロセス
mnistデータセット上で自分で訓練した画像認識モデルを例に説明する
一、pythonコードを使用して作成されたTFモデル定義において、モデルの入力層と出力層Tensor Variableにそれぞれ名前を指定する(「name」参照)
X = tf.placeholder(tf.float32, shape = […], name=‘input’)  //     
Y = tf.nn.softmax(tf.matmul(f, out_weights) + out_biases, name=’output’)  //     

名前は勝手につけることができて、便利で覚えやすいことを主として、後でまた繰り返し使います.私が起きたのはinputとoutputです.
二、TensorFlowで訓練したモデルを保存する.pbファイル
モデルトレーニング終了後のコード位置に、以下の2つのコードを追加する、モデルを保存することができる.pbファイル
output_graph_def = tf.graph_until.convert_variables_to_constants(session, session.graph_def, output_node_names=[‘output’])
//  output_node_names           

説明ドキュメントを貼って、この関数をさらに理解するのに役立ちます.
with tf.gfile.FastGFile(model\mnist.pb, mode = ’wb’) as f:
    f.write(output_graph_def.SerializeToString())

最初のパラメータは、出力されるファイルの保存パス、ファイル名、フォーマットを指定します.コードと同じディレクトリのmodelファイルの下に置いてmnistと名付けました.pb
2番目のパラメータmodeは、ファイル操作のモードを指定するために使用され、’wb’のwは書き込みファイルを表し、bはデータをバイナリ方式でファイルに書き込むことを表す.
「b」が指定されていない場合、デフォルトではテキストtxtでファイルが書き込まれます.現在TFはテキストフォーマットをサポートしていない.pbファイルの解析では、呼び出し時にエラーが発生します.
注:1)、tfは使用できません.train.write_graph()は、モデルの構造を保存するだけなので、訓練済みのパラメータ値2は保存する、tfは使用できない.train.saver()は、ネットワーク内のパラメータ値を保存するだけで、モデルの構造を保存しないため、モデルを保存します.モデルの構造を保存するとともに、モデル内の各パラメータの値を保存する必要があることは明らかです.以上の両者は一致しない.
三、Androidプラットフォームでtensorflwモデルを呼び出すために必要なjarパッケージとsoファイル1)githubからTensorFlowをダウンロードするプロジェクトソースコードを生成する
2)Bazel Bazelのインストール手順については、別の記事でご紹介します.Ubuntu 14を参照してください.04ソースコードインストールTensorFlow r 0.12詳細チュートリアル
3)下記の公式チュートリアルを参考に、AndroidでTFモデルを呼び出すために必要なsoファイルとjarパッケージを生成する
四、Android Studioをインストールし、Androidプロジェクトを作成する
Android Studioのインストールが完了したら、環境を構築する必要があります.構築プロセスは、私の別の記事を参照してください.
Ubuntu Android Studioを使用してTensorFlow android demoをコンパイル
五、プロジェクトへのリソースの追加
1)ステップを生成する.pbファイルをプロジェクトに挿入してProjectview,app/src/main/assetsを開きます.assetsディレクトリが存在しない場合は、右クリックmain->new->folder->Assets Folder
2)(3)ステップで生成したjarパケットを追加してProject viewを開き、jarパケットをapp->libsにコピーしてjarファイルを選択し、add as libraryを右クリックする
3)生成されたsoファイルを追加してプロジェクトviewを開き、.soファイルはapp/src/main/jniLibsの下にコピーします(jniLibsフォルダがない場合は新規)
私の話がよくわからない場合は、自分でグーグルで「Android studioにjarファイルとsoファイルを参照する方法」を検索してください.
六、インタフェースの作成、呼び出しの実現
1)jarパッケージとsoファイルをインポートするモデルを呼び出す必要がある.JAvaファイルでjarパッケージをインポートします.
import org.tensorflow.contrib.android.TensorFlowInferenceInterface

Javaクラス定義の最初の行にsoファイルをインポートします.
{ System.loadLibrary(“tensorflow_inference”) }

2)変数およびオブジェクトの定義
private static final String MODEL_FILE = “file:///android_asset/mnist.pb” //      
private static final String INPUT_NODE = “input”;       //          
private static final String INPUT_NODE = “output”;  //          
private static final int NUM_CLASSES = 10;  //        ,mnist     10

private static final int HEIGHT = 24;       //        
private static final int WIDTH = 24;        //        
private static final int CHANNEL = 3;    //        :RGB

private floats inputs = new float[HEIGHT*WIDTH*CHANNEL];    //           
private floats outputs = new float[NUM_CLASSES];    //           

2)Tensorflowインタフェースの初期化
private TensorFlowInferenceInterface inferenceInterface = new TensorFlowInferenceInterface();   //    
inferenceInterface.initializeTensorFlow(getAssets(), MODEL_FILE);  //     

上記の2つのステップが完了すると、モデルを繰り返し呼び出すことができます.呼び出すたびに、入力するデータをinputs変数に順番に格納し、次の3つの文を実行します.
3)TFモデルの呼び出し
inferenceInterface.fillNodeFloat(INPUT_NODE, new int[]{1, HEIGHT, WIDTH, CHANNEL}, inputs);  //      
inferenceInterface.runInference(new String[]{OUTPUT_NODE});     //       
inferenceInterface.readNodeFloat(OUTPUT_NODE, outputs); //      

そして次の主な仕事は、アンドロイドプロジェクトのコンパイルと、コンパイルされたapkファイルを携帯電話にインストールすることです.この部分は、一般的なアンドロイドプロジェクトと変わらないです.これらの内容は私の別の文章でも言及されています.
Ubuntu Android Studioを使用してTensorFlow android demoをコンパイル
皆さんの理解を容易にするために、私が書いたコードはプロセスに向いています.もちろんjava環境では,オブジェクト向けの観点から合理的にカプセル化し,コードの多重性を向上させる必要がある.
私がCSDNで発表した文章は、公衆番号CVにも同期して発表されます.life.
興味のある学生の購読を歓迎します