Я пытаюсь выяснить рабочий процесс для обучения и развертывания модели Tensorflow на Android. Я знаю другие вопросы, подобные этому в StackOverflow, но ни один из них, похоже, не справляется с проблемами, с которыми я столкнулся.Запуск модели Tensorflow на Android
После изучения Android пример из хранилища Tensorflow, это то, что я думаю, что рабочий процесс должен быть:
- Создание и обучение Tensorflow модели в Python.
- Создайте новый граф и переместите все соответствующие узлы (т. Е. Узлы, ответственные за обучение) на этот новый график. Измененные переменные веса импортируются как константы, так что C++ API может их читать.
- Разработка графического интерфейса Android на Java с использованием родного ключевого слова для прерывания вызова модели Tensorflow.
- Запустите javah, чтобы сгенерировать код заглушки C/C++ для родного вызова Tensorflow.
- Заполните заглушку, используя API Tensorflow C++ для чтения и доступа к обученной/сериализованной модели.
- Используйте Bazel для создания ОБА приложения Java, собственного интерфейса Tensorflow (как .so-файл) и сгенерируйте APK.
Используйте adb для развертывания APK.
Этап 6 - проблема. Bazel с радостью скомпилирует родной (OSX) .dylib, который я могу вызывать из Java через JNI. Android Studio также будет генерировать целую кучу XML-кода, который сделает GUI, который я хочу. Тем не менее, Bazel хочет, чтобы весь код приложения java находился в директории верхнего уровня WORKSPACE (в репозитории Tensorflow), а Android Studio сразу же ссылается во всех видах внешних библиотек из SDK для создания GUI (я знаю, потому что мой Сбой компиляции Bazel не удается, если он не может найти эти ресурсы). Единственный способ, которым я могу найти, чтобы заставить Bazel перекрестно скомпилировать файл .so, делает его зависимым от правила Android. Непосредственная кросс-компиляция родного lib - это то, что я предпочел бы портировать мой A.S. кода в проект Bazel.
Как это сделать? Bazel предположительно компилирует код Android, но Android Studio генерирует код, который Bazel не может скомпилировать. Все примеры из Google просто дают вам код из репо без каких-либо подсказок о том, как он был сгенерирован. Насколько мне известно, XML, который является частью приложения Android Studio, должен быть сгенерирован, а не сделан вручную. Если это можно сделать вручную, как мне избежать необходимости во всех этих внешних библиотеках?
Возможно, у меня неправильный рабочий процесс, или есть какой-то аспект Bazel/Android Studio, который я не понимаю. Любая помощь оценивается.
Спасибо!
Edit:
Существовали несколько вещей, которые я в конечном итоге делает, что, возможно, внесли свой вклад в здание библиотеки успешно:
- Я модернизированные до последней Базеле.
- I rebuilt TensorFlow из источника.
Я реализовал рекомендуемую Базэл BUILD файла ниже, с некоторыми добавлениями (взято из примера Android):
cc_binary( name = "libName.so", srcs = ["org_tensorflowtest_MyActivity.cc", "org_tensorflowtest_MyActivity.h", "jni.h", "jni_md.h", ":libpthread.so"], deps = ["//tensorflow/core:android_tensorflow_lib", ], copts = [ "-std=c++11", "-mfpu=neon", "-O2", ], linkopts = ["-llog -landroid -lm"], linkstatic = 1, linkshared = 1, ) cc_binary( name = "libpthread.so", srcs = [], linkopts = ["-shared"], tags = [ "manual", "notap", ], )
Я не проверил, что эта библиотека может быть загружена и использована в Android все же; Android Studio 1.5, по-видимому, очень тонко заявляет о наличии родных библиотек.
Создание .dylib вообще не поможет, поскольку Android не является OSX-dylib - это формат только OSX. Это Linux, вам нужно создать .so (что в значительной степени похоже на ту же вещь, но в другом формате). Кроме того, XML в Android все делается вручную НЕ сгенерированным. В значительной степени ничего в любом из примеров Google не генерируется. Тот факт, что вы ожидаете этого, вероятно, является частью вашей проблемы. –
Кроме того, если вашему программному обеспечению Tensorflow не нужно использовать Bazel, я никогда не слышал, чтобы он использовался для работы в Android. Gradle - новый стандарт, а Ant - устаревший стандарт. Если вы используете Bazel, у вас есть либо кровоточащий край, либо полностью твоя собственная вещь. –
@amm Вы могли запустить его на android, какой размер приложения вы создали? – sau