TensorFlow,Android Studio和Bazel:设置新项目

时间:2016-12-16 02:18:10

标签: android c++ android-studio tensorflow bazel

我正在尝试在Android移动应用中使用TensorFlow来推断模型。首先,我已经构建并测试了TensorFlow图;它被保存为protobuf文件。接下来,我有工具链设置,我已经构建并运行Inception Android demo。我的下一步是在Android tutorial之后在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
   我使用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:带入张量流库(.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中。但我所做的一切似乎都没有帮助。

选项3:使用CMakeList.txt编译张量流 我没有花太多时间在这上面。我认为CMakeList.txt无法调用Bazel或导入.so文件。我认为它需要一个.a文件。

那么,其他人如何将Tensorflow纳入Android项目? 最好的问候。

2 个答案:

答案 0 :(得分:0)

看看这个: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android/cmake

debugCompilereleaseCompile而不是tensorflow_inference使用TensorFlow-Android-Inference

这对我有用。

答案 1 :(得分:0)

最近在您的Android应用中嵌入预先训练的TensorFlow模型变得更加容易。在这里查看我的博客文章:
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部分)

我的博客文章详细介绍,但总的来说,您需要做的就是:

  1. 在build.gradle中包含编译org.tensorflow:tensorflow-android:+依赖项。
  2. 使用Java TensorFlowInferenceInterface类与您的模型进行交互(无需修改任何本机代码)。
  3. 仅供参考,TensorFlow Android演示应用已更新为使用此新方法。有关TensorFlowInferenceInterface的使用位置,请参见TensorFlowImageClassifier.recognizeImage

    您仍然需要指定一些配置,例如图中输入和输出节点的名称以及输入的大小,但是由于您构建了自己的TensorFlow图,您可能知道这些信息。 : - )

相关问题