TensorFlow、Android Studio 和 Bazel:设置新项目
TensorFlow, Android Studio and Bazel: Setting up a New Project
我正在尝试在 Android 移动应用程序中使用 TensorFlow 来推断模型。首先,我已经构建并测试了一个 TensorFlow 图;它被保存为一个 protobuf 文件。接下来,我设置了工具链并构建了 运行 Inception Android demo. My next step is to create a fresh Android project in Android Studio (with C++ enabled) following the Android tutorial。我创建了 JNI Hello World 应用程序,它在 Nexus 上编译和 运行s。但是当我尝试导入 'org.tensorflow' 时,我无法让 Android Studio (AS) 识别它。所以,我的主要问题是:如何将 TensorFlow 引入我的演示应用程序。
例如,我创建了一个简单的 class 开头:
package com.foobar.tfdemo;
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;
public class TensorFlowClassifier implements Classifier {
// do something
}
但是 Android Studio 无法解析 org.tensorflow
。
可能的选择:
1)修改build.gradle
将TF编译到项目中(使用Bazel)
2)外部编译一个TF库(.so)并导入,或者
3) 使用CMakeList.txt导入一个TF库
详细:
选项 1) 修改 build.gradle
.
我使用 Inception build.gradle
作为模型并复制了其中的大部分内容。同样的 import org.tensorflow
仍然没有解决,即使没有其他错误。这是 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, \
'--host_crosstool_top=@bazel_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) 文件。
我在这上面花了很多时间。我在命令行使用 Bazel 生成了 libtensorflow_demo.so
:
bazel build //tensorflow/examples/android:tensorflow_native_libs --crosstool_top=//external:android/crosstool --cpu=$CPU --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
并将其放在 ~project/libs 和 ~project/src/app/src/main/jniLibs 中。但我所做的一切似乎都无济于事。
方案三:使用CMakeList.txt编译tensorflow
我没有花太多时间在这上面。我认为 CMakeList.txt
将无法调用 Bazel 或导入 .so 文件。我认为它需要一个 .a 文件。
那么,其他人是如何将 Tensorflow 整合到 Android 项目中的?
最好的问候。
看看这个:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android/cmake
并且在 debugCompile
和 releaseCompile
中使用 TensorFlow-Android-Inference
.
而不是 tensorflow_inference
这对我有用。
最近,在您的 Android 应用中嵌入预训练的 TensorFlow 模型变得容易多了。在此处查看我的博客 post:
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 部分)
我的博客post有更详细的介绍,但总的来说,您需要做的就是:
- 在 build.gradle 中包含编译
org.tensorflow:tensorflow-android:+
依赖项。
- 使用 Java
TensorFlowInferenceInterface
class 与您的模型交互(无需修改任何本机代码)。
仅供参考,TensorFlow Android 演示应用已更新为使用这种新方法。请参阅 TensorFlowImageClassifier.recognizeImage 以了解它在何处使用 TensorFlowInferenceInterface
。
您仍然需要指定一些配置,例如图中输入和输出节点的名称,以及输入的大小,但由于您构建了自己的 TensorFlow 图,您可能知道这些信息。 :-)
我正在尝试在 Android 移动应用程序中使用 TensorFlow 来推断模型。首先,我已经构建并测试了一个 TensorFlow 图;它被保存为一个 protobuf 文件。接下来,我设置了工具链并构建了 运行 Inception Android demo. My next step is to create a fresh Android project in Android Studio (with C++ enabled) following the Android tutorial。我创建了 JNI Hello World 应用程序,它在 Nexus 上编译和 运行s。但是当我尝试导入 'org.tensorflow' 时,我无法让 Android Studio (AS) 识别它。所以,我的主要问题是:如何将 TensorFlow 引入我的演示应用程序。
例如,我创建了一个简单的 class 开头:
package com.foobar.tfdemo;
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;
public class TensorFlowClassifier implements Classifier {
// do something
}
但是 Android Studio 无法解析 org.tensorflow
。
可能的选择:
1)修改build.gradle
将TF编译到项目中(使用Bazel)
2)外部编译一个TF库(.so)并导入,或者
3) 使用CMakeList.txt导入一个TF库
详细:
选项 1) 修改 build.gradle
.
我使用 Inception build.gradle
作为模型并复制了其中的大部分内容。同样的 import org.tensorflow
仍然没有解决,即使没有其他错误。这是 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, \
'--host_crosstool_top=@bazel_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) 文件。
我在这上面花了很多时间。我在命令行使用 Bazel 生成了 libtensorflow_demo.so
:
bazel build //tensorflow/examples/android:tensorflow_native_libs --crosstool_top=//external:android/crosstool --cpu=$CPU --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
并将其放在 ~project/libs 和 ~project/src/app/src/main/jniLibs 中。但我所做的一切似乎都无济于事。
方案三:使用CMakeList.txt编译tensorflow
我没有花太多时间在这上面。我认为 CMakeList.txt
将无法调用 Bazel 或导入 .so 文件。我认为它需要一个 .a 文件。
那么,其他人是如何将 Tensorflow 整合到 Android 项目中的? 最好的问候。
看看这个: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android/cmake
并且在 debugCompile
和 releaseCompile
中使用 TensorFlow-Android-Inference
.
tensorflow_inference
这对我有用。
最近,在您的 Android 应用中嵌入预训练的 TensorFlow 模型变得容易多了。在此处查看我的博客 post:
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 部分)
我的博客post有更详细的介绍,但总的来说,您需要做的就是:
- 在 build.gradle 中包含编译
org.tensorflow:tensorflow-android:+
依赖项。 - 使用 Java
TensorFlowInferenceInterface
class 与您的模型交互(无需修改任何本机代码)。
仅供参考,TensorFlow Android 演示应用已更新为使用这种新方法。请参阅 TensorFlowImageClassifier.recognizeImage 以了解它在何处使用 TensorFlowInferenceInterface
。
您仍然需要指定一些配置,例如图中输入和输出节点的名称,以及输入的大小,但由于您构建了自己的 TensorFlow 图,您可能知道这些信息。 :-)