我正在尝试在Android移动应用中使用TensorFlow推断模型。首先,我已经构建并测试了TensorFlow图;它保存为protobuf文件。接下来,我进行了工具链设置,并构建并运行了Inception Android演示。我的下一步是按照Android教程在Android Studio(启用C ++)中创建一个新的Android项目。我已经创建了JNI Hello World应用程序,它可以在Nexus上编译并运行。但是,当我尝试导入“ org.tensorflow”时,我无法让Android Studio(AS)识别它。所以,我的主要问题是:如何将TensorFlow引入我的演示应用程序。
例如,我创建了一个简单的类以以下内容开头:
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
。
我将“盗梦空间”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)文件。
我花了很多时间在这上面。我已经libtensorflow_demo.so
在命令行中使用Bazel生成了:
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中。但是我似乎无济于事。
选项3:使用CMakeList.txt编译tensorflow。
我没有花很多时间在这上面。我认为CMakeList.txt
无法调用Bazel或导入.so文件。我认为它需要一个.a文件来代替。
那么,其他人如何将Tensorflow集成到Android项目中呢?此致。
在您的Android应用中嵌入预训练的TensorFlow模型变得容易得多。在这里查看我的博客文章:
https : //medium.com/@daj/using-a-pre-trained-tensorflow-model-on-android-e747831a3d6(第1部分)https://medium.com/@daj/在Android上使用预先训练的Tensorflow模型第2部分-153ebdd4c465(第2部分)
我的博客文章更加详细,但总而言之,您需要做的是:
org.tensorflow:tensorflow-android:+
在build.gradle中包括编译依赖项。TensorFlowInferenceInterface
类与模型进行交互(无需修改任何本机代码)。仅供参考,TensorFlow Android演示应用程序已更新为使用此新方法。请参阅TensorFlowImageClassifier.recognizeImage以了解它在哪里使用TensorFlowInferenceInterface
。
您仍然需要指定一些配置,例如图中的输入和输出节点的名称以及输入的大小,但是由于您构建了自己的TensorFlow图,您可能知道此信息。:-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句