Tutorial on how to integrate Tensorflow (JAVA-API) into Android-Studio – from scratch

google-tensorflow-android

There are several ways, how one can integrate the powerful machine-learning framework of Google into an Android App, but most of the examples – at least the ones I found – only showed how the example build has to be built using the Bazel build tools. I wanted tot he „old-school“ way using just the Android Studio and use the Tensorflow Framework as a 3rd party dependency.


At first I followed this great library on GitHub: https://github.com/miyosuda/TensorFlowAndroidMNIST

But eventually I came to the point where some of the OPs (i.e. Dropout) were not implemented in the existing Library. Therefore I started to find a way to build the Libs. I know hardly anything about all these fancy software things, thus I was searching for the easiest solution and came up with the followin recipe which works on a Macbook OSX El Capitan. I’m pretty sure, that it’ll work on Linux as well if you’ve all the necessary libraries installed already. I’m using Anaconda 2 and istalled it from this source: https://www.continuum.io/downloads

 

Fort he first steps I refer to this great guide:

http://lukesleeman.com.au/building-the-tensorflow-android-example-app-on-mac-os/

 

Install BREW

(http://brew.sh/index_de.html)

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

 

Use brew to install bazel and swig

$ brew install bazel swig

 

Install python dependencies

$ sudo easy_install -U six
$ sudo easy_install -U numpy
$ sudo easy_install wheel

 

Download the TensorFlow git repo

$ git clone https://github.com/tensorflow/tensorflow

 

Configure TensorFlow Build

Type  ./configure in the Terminal and hit enter
$ ./configure

I used default inputs.

Once configure is complete, you need to edit the WORKSPACE file in in the TensorFlow root dir to setup your android SDK

$ nano WORKSPACE

Add the following lines (i.e. uncomment and edit the paths)

 

# Uncomment and update the paths in these entries to build the Android libraries:

android_sdk_repository(

name = „androidsdk“,

api_level = 23,

build_tools_version = „24.0.2“,

 

 

 

# Replace with path to Android SDK on your systempath = „/Users/USER/Library/Android/sdk/“,)

android_ndk_repository(name=“androidndk“,

path=“/Users/USER/Library/Android/sdk/ndk-bundle/“,api_level=21)

 

ctlr+x and yes for saving.

 

Then open the Terminal and in tensorflow-root type:

$ bazel build //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   file gets build and can be found in the following path:

 

This file has to be copied into you apps lib folder. In my case:

Mainapp/main/src/jniLibs/armeabi-v7a

 

Now start Android Studio and open an existing project. To add the tensorflow framework choose “import module” and direct to the path:

/Users/USER/tensorflow/tensorflow/contrib/android/cmake

 

Android Studio will ask you to integrate CMAKE plugin  – install it from the Package Manager. After a while of compiling heavy stuff, the module should be integrated in your App.

 

 

Then I did the following (I had to upgrade the XCODE Version! 8.1.2 or so):

$ build_all_android.sh

Add the dependencies to your project

Open the file settings.gradle and add the following lines

include ‚:TensorFlow-Android-Inference’findProject(„:TensorFlow-Android-Inference“).projectDir =             new File(„${/path/to/tensorflow_repo}/contrib/android/cmake“)

Open the file build.gradle of your main app and add the dependency:

debugCompile project(path: ‚: TensorFlow-Android-Inference, configuration: ‚debug‘)releaseCompile project(path: ‚: TensorFlow-Android-Inference ‚, configuration: ‚release‘)

 

Note: this makes native code in the lib traceable from your app.

Dependencies (see: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android/cmake)

TensorFlow-Android-Inference depends on the TensorFlow static libs already built in your local TensorFlow repo directory. For Linux/Mac OS, build_all_android.sh is used in build.gradle to build it. It DOES take time to build the core libs; so, by default, it is commented out to avoid confusion (otherwise Android Studio would appear to hang during opening the project). To enable it, refer to the comment in

  • build.gradle

Output

  • TensorFlow-Inference-debug.aar
  • TensorFlow-Inference-release.aar

File libtensorflow_inference.so should be packed under jni/${ANDROID_ABI}/ in the above aar, and it is transparent to the app as it will acccess them via equivalent java APIs.

 

 

The project can be found in my Github Repo:

https://github.com/beniroquai/Beamerscope

 

 

I hope that helps. In case something’s unclear, feel free to leave a comment 🙂

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s