Я пытаюсь использовать 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? С уважением.