-
Notifications
You must be signed in to change notification settings - Fork 66
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Import the original TensorFlow Android sample
- Loading branch information
Showing
96 changed files
with
14,671 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!-- | ||
Copyright 2016 The TensorFlow Authors. All Rights Reserved. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
--> | ||
|
||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
package="org.tensorflow.demo"> | ||
|
||
<uses-permission android:name="android.permission.CAMERA" /> | ||
<uses-feature android:name="android.hardware.camera" /> | ||
<uses-feature android:name="android.hardware.camera.autofocus" /> | ||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | ||
|
||
<uses-sdk | ||
android:minSdkVersion="21" | ||
android:targetSdkVersion="23" /> | ||
|
||
<application android:allowBackup="true" | ||
android:debuggable="true" | ||
android:label="@string/app_name" | ||
android:icon="@drawable/ic_launcher" | ||
android:theme="@style/MaterialTheme"> | ||
|
||
<activity android:name="org.tensorflow.demo.ClassifierActivity" | ||
android:screenOrientation="portrait" | ||
android:label="@string/activity_name_classification"> | ||
<intent-filter> | ||
<action android:name="android.intent.action.MAIN" /> | ||
<category android:name="android.intent.category.LAUNCHER" /> | ||
</intent-filter> | ||
</activity> | ||
|
||
<activity android:name="org.tensorflow.demo.DetectorActivity" | ||
android:screenOrientation="portrait" | ||
android:label="@string/activity_name_detection"> | ||
<intent-filter> | ||
<action android:name="android.intent.action.MAIN" /> | ||
<category android:name="android.intent.category.LAUNCHER" /> | ||
</intent-filter> | ||
</activity> | ||
|
||
<activity android:name="org.tensorflow.demo.StylizeActivity" | ||
android:screenOrientation="portrait" | ||
android:label="@string/activity_name_stylize"> | ||
<intent-filter> | ||
<action android:name="android.intent.action.MAIN" /> | ||
<category android:name="android.intent.category.LAUNCHER" /> | ||
</intent-filter> | ||
</activity> | ||
</application> | ||
|
||
</manifest> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
# Description: | ||
# TensorFlow camera demo app for Android. | ||
|
||
package(default_visibility = ["//visibility:public"]) | ||
|
||
licenses(["notice"]) # Apache 2.0 | ||
|
||
load( | ||
"//tensorflow:tensorflow.bzl", | ||
"tf_copts", | ||
"tf_opts_nortti_if_android", | ||
) | ||
|
||
exports_files(["LICENSE"]) | ||
|
||
LINKER_SCRIPT = "//tensorflow/contrib/android:jni/version_script.lds" | ||
|
||
# libtensorflow_demo.so contains the native code for image colorspace conversion | ||
# and object tracking used by the demo. It does not require TF as a dependency | ||
# to build if STANDALONE_DEMO_LIB is defined. | ||
# TF support for the demo is provided separately by libtensorflow_inference.so. | ||
cc_binary( | ||
name = "libtensorflow_demo.so", | ||
srcs = glob([ | ||
"jni/**/*.cc", | ||
"jni/**/*.h", | ||
]), | ||
copts = tf_copts(), | ||
defines = ["STANDALONE_DEMO_LIB"], | ||
linkopts = [ | ||
"-landroid", | ||
"-ljnigraphics", | ||
"-llog", | ||
"-lm", | ||
"-z defs", | ||
"-s", | ||
"-Wl,--version-script", # This line must be directly followed by LINKER_SCRIPT. | ||
LINKER_SCRIPT, | ||
], | ||
linkshared = 1, | ||
linkstatic = 1, | ||
tags = [ | ||
"manual", | ||
"notap", | ||
], | ||
deps = [ | ||
LINKER_SCRIPT, | ||
], | ||
) | ||
|
||
cc_library( | ||
name = "tensorflow_native_libs", | ||
srcs = [ | ||
":libtensorflow_demo.so", | ||
"//tensorflow/contrib/android:libtensorflow_inference.so", | ||
], | ||
tags = [ | ||
"manual", | ||
"notap", | ||
], | ||
) | ||
|
||
android_binary( | ||
name = "tensorflow_demo", | ||
srcs = glob([ | ||
"src/**/*.java", | ||
]), | ||
# Package assets from assets dir as well as all model targets. Remove undesired models | ||
# (and corresponding Activities in source) to reduce APK size. | ||
assets = [ | ||
"//tensorflow/examples/android/assets:asset_files", | ||
":external_assets", | ||
], | ||
assets_dir = "", | ||
custom_package = "org.tensorflow.demo", | ||
inline_constants = 1, | ||
manifest = "AndroidManifest.xml", | ||
resource_files = glob(["res/**"]), | ||
tags = [ | ||
"manual", | ||
"notap", | ||
], | ||
deps = [ | ||
":tensorflow_native_libs", | ||
"//tensorflow/contrib/android:android_tensorflow_inference_java", | ||
], | ||
) | ||
|
||
filegroup( | ||
name = "external_assets", | ||
srcs = [ | ||
"@inception5h//:model_files", | ||
"@mobile_multibox//:model_files", | ||
"@stylize//:model_files", | ||
], | ||
) | ||
|
||
filegroup( | ||
name = "all_files", | ||
srcs = glob( | ||
["**/*"], | ||
exclude = [ | ||
"**/METADATA", | ||
"**/OWNERS", | ||
"bin/**", | ||
"gen/**", | ||
"gradleBuild/**", | ||
"libs/**", | ||
], | ||
), | ||
visibility = ["//tensorflow:__subpackages__"], | ||
) | ||
|
||
filegroup( | ||
name = "java_files", | ||
srcs = glob(["src/**/*.java"]), | ||
) | ||
|
||
filegroup( | ||
name = "jni_files", | ||
srcs = glob([ | ||
"jni/**/*.cc", | ||
"jni/**/*.h", | ||
]), | ||
) | ||
|
||
filegroup( | ||
name = "resource_files", | ||
srcs = glob(["res/**"]), | ||
) | ||
|
||
exports_files(["AndroidManifest.xml"]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
# TensorFlow Android Camera Demo | ||
|
||
This folder contains an example application utilizing TensorFlow for Android | ||
devices. | ||
|
||
## Description | ||
|
||
The demos in this folder are designed to give straightforward samples of using | ||
TensorFlow in mobile applications. | ||
|
||
Inference is done using the [TensorFlow Android Inference Interface](../../../tensorflow/contrib/android), | ||
which may be built separately if you want a standalone library to drop into your | ||
existing application. Object tracking and YUV -> RGB conversion is handled by | ||
libtensorflow_demo.so. | ||
|
||
A device running Android 5.0 (API 21) or higher is required to run the demo due | ||
to the use of the camera2 API, although the native libraries themselves can run | ||
on API >= 14 devices. | ||
|
||
## Current samples: | ||
|
||
1. [TF Classify](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java): | ||
Uses the [Google Inception](https://arxiv.org/abs/1409.4842) | ||
model to classify camera frames in real-time, displaying the top results | ||
in an overlay on the camera image. | ||
2. [TF Detect](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java): | ||
Demonstrates a model based on [Scalable Object Detection | ||
using Deep Neural Networks](https://arxiv.org/abs/1312.2249) to | ||
localize and track people in the camera preview in real-time. | ||
3. [TF Stylize](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/src/org/tensorflow/demo/StylizeActivity.java): | ||
Uses a model based on [A Learned Representation For Artistic Style] | ||
(https://arxiv.org/abs/1610.07629) to restyle the camera preview image | ||
to that of a number of different artists. | ||
|
||
<img src="sample_images/classify1.jpg" width="30%"> | ||
<img src="sample_images/stylize1.jpg" width="30%"> | ||
<img src="sample_images/detect1.jpg" width="30%"> | ||
|
||
## Prebuilt APK: | ||
|
||
If you just want the fastest path to trying the demo, you may download the | ||
nightly build | ||
[here](https://ci.tensorflow.org/view/Nightly/job/nightly-android/). Expand the | ||
"View" and then the "out" folders under "Last Successful Artifacts" to find | ||
tensorflow_demo.apk. Also available are precompiled native libraries that you | ||
may drop into your own applications. See | ||
[tensorflow/contrib/android/README.md](../../../tensorflow/contrib/android/README.md) | ||
for more details. | ||
|
||
## Running the Demo | ||
|
||
Once the app is installed it can be started via the "TF Classify", "TF Detect" | ||
and "TF Stylize" icons, which have the orange TensorFlow logo as their icon. | ||
|
||
While running the activities, pressing the volume keys on your device will | ||
toggle debug visualizations on/off, rendering additional info to the screen | ||
that may be useful for development purposes. | ||
|
||
## Building the Demo from Source | ||
|
||
Pick your preferred approach below. At the moment, we have full support for | ||
Bazel, and partial support for gradle, cmake, make, and Android Studio. | ||
|
||
As a first step for all build types, clone the TensorFlow repo with: | ||
|
||
``` | ||
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git | ||
``` | ||
|
||
Note that `--recurse-submodules` is necessary to prevent some issues with | ||
protobuf compilation. | ||
|
||
### Bazel | ||
|
||
NOTE: Bazel does not currently support building for Android on Windows. Full | ||
support for gradle/cmake builds is coming soon, but in the meantime we suggest | ||
that Windows users download the | ||
[prebuilt binaries](https://ci.tensorflow.org/view/Nightly/job/nightly-android/) | ||
instead. | ||
|
||
##### Install Bazel and Android Prerequisites | ||
|
||
Bazel is the primary build system for TensorFlow. To build with Bazel, | ||
it and the Android NDK and SDK must be installed on your system. | ||
|
||
1. Get the recommended Bazel version listed in [os_setup.html](https://www.tensorflow.org/versions/master/get_started/os_setup.html#source) | ||
2. The Android NDK is required to build the native (C/C++) TensorFlow code. | ||
The current recommended version is 12b, which may be found | ||
[here](https://developer.android.com/ndk/downloads/older_releases.html#ndk-12b-downloads). | ||
3. The Android SDK and build tools may be obtained | ||
[here](https://developer.android.com/tools/revisions/build-tools.html), | ||
or alternatively as part of | ||
[Android Studio](https://developer.android.com/studio/index.html). Build | ||
tools API >= 23 is required to build the TF Android demo (though it will | ||
run on API >= 21 devices). | ||
|
||
##### Edit WORKSPACE | ||
|
||
The Android entries in [`<workspace_root>/WORKSPACE`](../../../WORKSPACE#L2-L13) | ||
must be uncommented with the paths filled in appropriately depending on where | ||
you installed the NDK and SDK. Otherwise an error such as: | ||
"The external label '//external:android/sdk' is not bound to anything" will | ||
be reported. | ||
|
||
Also edit the API levels for the SDK in WORKSPACE to the highest level you | ||
have installed in your SDK. This must be >= 23 (this is completely independent | ||
of the API level of the demo, which is defined in AndroidManifest.xml). | ||
The NDK API level may remain at 14. | ||
|
||
##### Install Model Files (optional) | ||
|
||
The TensorFlow `GraphDef`s that contain the model definitions and weights | ||
are not packaged in the repo because of their size. They are downloaded | ||
automatically and packaged with the APK by Bazel via a new_http_archive defined | ||
in `WORKSPACE` during the build process. | ||
|
||
**Optional**: If you wish to place the models in your assets manually (E.g. for | ||
non-Bazel builds), remove all of the `model_files` entries from the `assets` | ||
list in `tensorflow_demo` found in the `[BUILD](BUILD)` file. Then download | ||
and extract the archives yourself to the `assets` directory in the source tree: | ||
|
||
```bash | ||
BASE_URL=https://storage.googleapis.com/download.tensorflow.org/models | ||
for MODEL_ZIP in inception5h.zip mobile_multibox_v1a.zip stylize_v1.zip | ||
do | ||
curl -L ${BASE_URL}/${MODEL_ZIP} -o /tmp/${MODEL_ZIP} | ||
unzip /tmp/${MODEL_ZIP} -d tensorflow/examples/android/assets/ | ||
done | ||
``` | ||
|
||
This will extract the models and their associated metadata files to the local | ||
assets/ directory. | ||
|
||
##### Build | ||
|
||
After editing your WORKSPACE file to update the SDK/NDK configuration, | ||
you may build the APK. Run this from your workspace root: | ||
|
||
```bash | ||
bazel build -c opt //tensorflow/examples/android:tensorflow_demo | ||
``` | ||
|
||
If you get build errors about protocol buffers, run | ||
`git submodule update --init` and make sure that you've modified your WORKSPACE | ||
file as instructed, then try building again. | ||
|
||
##### Install | ||
|
||
Make sure that adb debugging is enabled on your Android 5.0 (API 21) or | ||
later device, then after building use the following command from your workspace | ||
root to install the APK: | ||
|
||
```bash | ||
adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk | ||
``` | ||
|
||
### Android Studio | ||
|
||
Android Studio may be used to build the demo in conjunction with Bazel. First, | ||
make sure that you can build with Bazel following the above directions. Then, | ||
look at [build.gradle](build.gradle) and make sure that the path to Bazel | ||
matches that of your system. | ||
|
||
At this point you can add the tensorflow/examples/android directory as a new | ||
Android Studio project. Click through installing all the Gradle extensions it | ||
requests, and you should be able to have Android Studio build the demo like any | ||
other application (it will call out to Bazel to build the native code with the | ||
NDK). | ||
|
||
### CMake | ||
|
||
Full CMake support for the demo is coming soon, but for now it is possible to | ||
build the TensorFlow Android Inference library using | ||
[tensorflow/contrib/android/cmake](../../../tensorflow/contrib/android/cmake). |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package(default_visibility = ["//visibility:public"]) | ||
|
||
licenses(["notice"]) # Apache 2.0 | ||
|
||
# It is necessary to use this filegroup rather than globbing the files in this | ||
# folder directly the examples/android:tensorflow_demo target due to the fact | ||
# that assets_dir is necessarily set to "" there (to allow using other | ||
# arbitrary targets as assets). | ||
filegroup( | ||
name = "asset_files", | ||
srcs = glob( | ||
["**/*"], | ||
exclude = ["BUILD"], | ||
), | ||
) |
Oops, something went wrong.