2016-12-16 4 views
0

私はAndroidのモバイルアプリケーションでTensorFlowを使用してモデルを推測しようとしています。まず、TensorFlowグラフを作成してテストしました。 protobufファイルとして保存されます。次に、私はツールチェインのセットアップを持っており、Inception Android demoをビルドして実行しています。私の次のステップは、Android tutorialに続いて、Androidスタジオ(C++を有効にする)で新しくAndroidプロジェクトを作成することです。私はJNI Hello Worldアプリケーションを作成しました。これはコンパイルされ、Nexus上で動作します。しかし、「org.tensorflow」をインポートしようとすると、Android Studio(AS)にそれを認識させることができません。だから私の主な質問は、私のデモアプリにTensorFlowをもたらす方法です。
は例えば、私はで開始する単純なクラスを作成しました:TensorFlow、Android StudioとBazel:新しいプロジェクトを設定する

package com.foobar.tfdemo; 

import org.tensorflow.contrib.android.TensorFlowInferenceInterface; 

public class TensorFlowClassifier implements Classifier { 
// do something 
} 

しかし、Androidのメーカーはorg.tensorflowを解決することはできません。 可能なオプション: 1)TFライブラリ

をインポートするために使用CMakeList.txt)外部TFライブラリをコンパイル(.soという)と、それをインポートし、または 3) 2)Bazelを使用して(プロジェクトにTFをコンパイルする build.gradleを変更

詳細:

オプション1)build.gradleを変更してください。
私はInception build.gradleをモデルとして使用し、そのほとんどをコピーしました。他のエラーがなくても同じ​​は解決しません。

apply plugin: 'com.android.application' 
def bazel_location = '/usr/local/bin/bazel' 
def cpuType = 'armeabi-v7a' 
def nativeDir = 'libs/' + cpuType 

android { 
    compileSdkVersion 24 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "com.algoint.tfdemo" 
     minSdkVersion 23 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

     externalNativeBuild { 
      cmake { 
       cppFlags "" 
      } 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    externalNativeBuild { 
     cmake { 
      path "CMakeLists.txt" 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:24.2.1' 
    testCompile 'junit:junit:4.12' 
} 

task buildNative(type:Exec) { 
    workingDir '../../..' 
    commandLine bazel_location, 'build', '-c', 'opt', \ 
     'tensorflow/examples/android:tensorflow_native_libs', \ 
     '--crosstool_top=//external:android/crosstool', \ 
     '--cpu=' + cpuType, \ 
     '[email protected]_tools//tools/cpp:toolchain' 
} 

task copyNativeLibs(type: Copy) { 
    from('../../../bazel-bin/tensorflow/examples/android') { include '**/*.so' } 
    into nativeDir 
    duplicatesStrategy = 'include' 
} 

copyNativeLibs.dependsOn buildNative 
assemble.dependsOn copyNativeLibs 
tasks.whenTaskAdded { task -> 
    if (task.name == 'assembleDebug') { 
     task.dependsOn 'copyNativelibs' 
    } 
} 

オプション2:tensorflowライブラリ(.soの)ファイルに持参ここbuild.gradleファイルです。
私はこれに多くの時間を費やしました。私は、コマンドラインでBazelを使用してlibtensorflow_demo.soを生成した:

bazel build //tensorflow/examples/android:tensorflow_native_libs --crosstool_top=//external:android/crosstool --cpu=$CPU [email protected]_tools//tools/cpp:toolchain 

と〜プロジェクト/ libsにと〜プロジェクト/ srcに/アプリ/ srcに/メイン/ jniLibsの両方でそれを置きます。しかし、私は何も助けてくれないようです。

オプション3:CMakeList.txtを使用してテンソルフローをコンパイルします。
私はこれに多くの時間を費やしていません。 CMakeList.txtはBazelを起動したり、.soファイルをインポートしたりすることはできません。代わりに.aファイルが必要だと思います。

他の人がTensorflowをAndroidプロジェクトに組み込む方法はありますか? よろしくお願いいたします。代わりにtensorflow_inference使用TensorFlow-Android-Inferencehttps://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android/cmake

そしてdebugCompilereleaseCompileで:

答えて

0

が、この中に見てください。

これは私のために働いた。

0

最近、訓練されたTensorFlowモデルをAndroidアプリに組み込むのがずっと簡単になりました。ここに私のブログの記事をチェックアウト:
https://medium.com/@daj/using-a-pre-trained-tensorflow-model-on-android-e747831a3d6(パート1) https://medium.com/@daj/using-a-pre-trained-tensorflow-model-on-android-part-2-153ebdd4c465(パート2)

私のブログの記事は、より詳細になりますが、要約すると、すべてを行う必要がある:

  1. を含めますbuild.gradleにコンパイルorg.tensorflow:tensorflow-android:+の依存関係があります。
  2. Java TensorFlowInferenceInterfaceクラスを使用してモデルとのインターフェイスを作成します(ネイティブコードを変更する必要はありません)。

FYI、TensorFlow Androidデモアプリがこの新しいアプローチを使用するように更新されました。 TensorFlowInferenceInterfaceを使用する場所はTensorFlowImageClassifier.recognizeImageを参照してください。

グラフの入力ノードと出力ノードの名前や入力のサイズなど、いくつかの設定を指定する必要がありますが、独自のTensorFlowグラフを作成しているので、おそらくこの情報を知っています。 :-)

関連する問題