繁体   English   中英

TensorFlow,Android Studio和Bazel:建立新项目

[英]TensorFlow, Android Studio and Bazel: Setting up a New Project

我正在尝试在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
我将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中。 但是我似乎无济于事。

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

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

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

并且在debugCompilereleaseCompile代替tensorflow_inference使用TensorFlow-Android-Inference

这对我有用。

最近,将预训练的TensorFlow模型嵌入到Android应用程序变得容易得多。 在这里查看我的博客文章:
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. org.tensorflow:tensorflow-android:+包括编译org.tensorflow:tensorflow-android:+依赖项。
  2. 使用Java TensorFlowInferenceInterface类与模型进行交互(无需修改任何本机代码)。

仅供参考,TensorFlow Android演示应用程序已更新为使用此新方法。 请参阅TensorFlowImageClassifier.recognizeImage以了解使用TensorFlowInferenceInterface

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM