TensorFlow1.0.0をGitからClone

TensorFlow 1.0をGitでCloneする。

$ git clone -b r1.0 --recurse-submodules https://github.com/tensorflow/tensorflow.git

BREWのインストール

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Java 8.xのインストール

$ brew cask install java

Bazelのインストール

$ brew install bazel
$ brew update bazel

WORKSPACEの編集

パス Defaultの場所
ANDROID_HOME /Users/username/Library/Android/sdk/
NDK_ROOT ${ANDROID_HOME}/ndk-bundle

tensorflow/WORKSPACE を編集する。android_sdk_repositoryとandroid_ndk_repositoryを自分の環境に合わせて設定する。android sdkのフォルダの下にndk-bundleというフォルダがない場合は、Android StudioのManager for Android SDK and ToolsのAndroid ToolsからNDKをインストールしておく。

tensorflow/WORKSPACE

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "23.0.1",
    # Replace with path to Android SDK on your system
    path = "/Users/sasakiakira/Library/Android/sdk/",
)

android_ndk_repository(
    name="androidndk",
    path="/Users/sasakiakira/Library/Android/sdk/ndk-bundle/",
    api_level=21)

Bazelでlibtensorflow_inference.soをBuild

$ bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
   --crosstool_top=//external:android/crosstool \
   --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
   --cpu=armeabi-v7a

libtensorflow_inference.soが生成されたか確認する。

$ ls bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

生成したlibtensorflow_inference.so を任意の場所にコピーしておく。

Bazelでlibandroid_tensorflow_inference_java.jarをBuild

$ bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

libandroid_tensorflow_inference_java.jarが生成されたか確認する。

$ bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

生成したlibtensorflow_inference.jar を任意の場所にコピーしておく。

Android Studioのプロジェクトへの取り込み

libtensorflow_inference.solibtensorflow_inference.jarをそれぞれ、libs/armedabi-v7alibsに新規フォルダを作成してコピーする。

また、Modelデータは、aseetsフォイルにコピーする。

今回は、モデルデータの保存と読込で作成したmodel.pb を使用する。

また、build.gradleを下記のように書き直し、TensorFlowのライブラリをアプリ内で使用できるようにする。

# Gradle Scripts
# build.gradle(Module:app)
android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            assets.srcDirs = ['assets']
        }
    }
}
...
dependencies {
    ...
    compile files('libs/libandroid_tensorflow_interface_java.jar')
}

Androidアプリ

package io.fabo.helloandroid;

import android.content.res.AssetManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.tensorflow.contrib.android.TensorFlowInferenceInterface;

public class MainActivity extends AppCompatActivity {

    private final static String TAG = "TF_LOG";

    static {
        System.loadLibrary("tensorflow_inference");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TensorFlowInferenceInterface mTensorFlowIF = new TensorFlowInferenceInterface();
        AssetManager mAssetManager = getAssets();
        int result = mTensorFlowIF.initializeTensorFlow(mAssetManager, "file:///android_asset/model.pb");

        mTensorFlowIF.enableStatLogging(true);
        Log.i(TAG, "result:" + result);

        int[] a_value = new int[1];
        a_value[0] = 3;
        int[] b_value = new int[1];
        b_value[0] = 4;

        mTensorFlowIF.fillNodeInt("input_a",new int[] {1}, a_value);
        mTensorFlowIF.fillNodeInt("input_b",new int[] {1}, b_value);

        int[] result_value = new int[1];
        mTensorFlowIF.runInference(new String[] {"add_op"});
        mTensorFlowIF.readNodeInt("add_op", result_value);

        Log.i(TAG, "result_value:" + result_value[0]);
    }
}

参考