2016-12-16 4 views
0

Я пытаюсь использовать TensorFlow в мобильном приложении Android для вывода на модель. Во-первых, я уже построил и протестировал график TensorFlow; он сохраняется как файл protobuf. Затем у меня есть настройка toolchain, и я создал и запустил Inception Android demo. Мой следующий шаг - создать новый Android-проект в Android Studio (с включенным C++) после Android tutorial. Я создал приложение JNI Hello World, оно компилируется и работает на Nexus. Но когда я попытался импортировать «org.tensorflow», я не могу заставить Android Studio (AS) распознать его. Итак, мой основной вопрос: как привести TensorFlow в мое демо-приложение.
Например, я создал простой класс, чтобы начать с:TensorFlow, Android Studio и Bazel: создание нового проекта

package com.foobar.tfdemo; 

import org.tensorflow.contrib.android.TensorFlowInferenceInterface; 

public class TensorFlowClassifier implements Classifier { 
// do something 
} 

Но Android-студия не может решить 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, \ 
     '[email protected]_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 [email protected]_tools//tools/cpp:toolchain 

и поместили его в обоих ~ проекта/ЛИЭС и ~ проекта/SRC/приложение/SRC/основные/jniLibs. Но мне ничего не помогает.

Вариант 3: Используйте CMakeList.txt для компиляции тензорного потока.
Я не потратил много времени на это. Я не думаю, что CMakeList.txt сможет вызывать Bazel или импортировать файл .so. Я думаю, что ему нужен файл .a.

Итак, как другим удалось включить Tensorflow в проекты Android? С уважением.

ответ

0

В последнее время стало намного проще встроить предварительно подготовленную модель 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:+ зависимости в вашем build.gradle.
  2. Используйте класс Java TensorFlowInferenceInterface для взаимодействия с вашей моделью (нет необходимости изменять какой-либо собственный код).

FYI, демо-приложение TensorFlow Android обновлено, чтобы использовать этот новый подход. См. TensorFlowImageClassifier.recognizeImage, где используется TensorFlowInferenceInterface.

Вам по-прежнему необходимо указать какую-либо конфигурацию, такую ​​как имена входных и выходных узлов в графике, а также размер ввода, но поскольку вы построили собственный график TensorFlow, вы, вероятно, знаете эту информацию. :-)

Смежные вопросы