[JAVA] So erstellen Sie eine App mit Tensorflow mit Android Studio

Nachtrag 3: Ich habe eine Korrekturanfrage bezüglich der Notation von @ 84d010m08 erhalten und zusammengeführt. Vielen Dank. Derzeit scheint es zwei Methoden zu geben: Tensor Flow Mobile und Lite. Weitere Informationen finden Sie in diesem Artikel.

Nachtrag 2: Eine korrekte Erklärung finden Sie in der offiziellen Erklärung. https://www.tensorflow.org/mobile/android_build

Nachtrag: Der Inhalt dieses Artikels ist veraltet. Um die aktuelle Methode sehr einfach zu erklären, schreiben Sie den folgenden Inhalt in build.gradle.

build.gradle


allprojects {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'org.tensorflow:tensorflow-android:+'
}

Auf diese Weise können Sie das TensorFlowInferenceInterface verwenden. (Siehe den alten Artikel unten für TensorFlowInferenceInterface) Die Namen der Methoden haben sich stark geändert, daher ist es eine gute Idee, sie im offiziellen Repository zu suchen. Zum Zeitpunkt der Hinzufügung ・ Mit Feed eingeben () ・ Lerne mit run () -Fetch-Ausgabe mit fetch () ist. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java

Artikel vor Hinzufügung unten


Obwohl es einige Artikel gab, in denen Tensorflow auf Android ausgeführt wurde, http://qiita.com/tomoima525/items/99a2df5cb0559c41647a http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/miyosuda/items/e53ad2efeed0ff040606 Da es kein japanisches Dokument zur einfachen Ausführung mit der TensorFlowInferenceInterface-Klasse gab, war es nur ein Memo. Mit der Methode in diesem Artikel können Sie eine App nur mit dem trainierten Modell und Android Studio erstellen. Es gibt viele gute Artikel zur Verwendung von Deep Learning und zur Verwendung von Tensorflow. Suchen Sie daher nach diesen Artikeln.

Ich schreibe viel, also werde ich es eins nach dem anderen reparieren, wenn ich Zeit habe.

Offizielle Dokumentation

Die folgenden drei. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/ https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android

Vorbereitung

Aus der Erstellung von .jar- und .so-Dateien. Entspricht dem Inhalt des folgenden offiziellen Dokuments. https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android

Wenn Sie nicht Bazel setzen wollen https://ci.tensorflow.org/view/Nightly/job/nightly-android/ Es scheint, dass Sie eine vorgefertigte Datei von (unbestätigt) erhalten können

Als allererstes

git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git

Laden Sie die Tensorflow-Quelle unter herunter

Nächster

tensorflow/WORKSPACE

Innen wechseln Kommentieren Sie den folgenden Teil aus und geben Sie den Pfad entsprechend an

\# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "25.0.1",
    \# Replace with path to Android SDK on your system
    path = "/home/user/Android/Sdk",
)

\#Android NDK r12b is recommended (higher may cause issues with Bazel)
android_ndk_repository(
    name="androidndk",
    path="/home/user/Android/Sdk/ndk-bundle",
    api_level=14) \# This needs to be 14 or higher to compile TensorFlow.

Als nächstes werden wir bauen.

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
   --crosstool_top=//external:android/crosstool \
   --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
   --cpu=armeabi-v7a

Bauen Sie mit Bazel.

--cpu=armeabi-v7a

Der Teil von

arm64-v8a x86 x86_64

Bitte wechseln Sie zu einem geeigneten.

bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

Wurde generiert.

Nächster

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

damit

bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

Eine JAR-Datei wird in erstellt.

Android Studio-Einstellungen

▽libs   libandroid_tensorflow_inference_java.jar   ▽armeabi-v7a     libtensorflow_inference.so Ordnen Sie die Dateien so an in app / build.gradle

app/build.gradle


sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

Hinzugefügt

Wie schreibe ich Code?

Importieren-> Instanz erstellen-> Eingabe-> Ausführen-> Ausgabe extrahieren Es ist ein Verfahren von.

importieren

import org.tensorflow.contrib.android.TensorFlowInferenceInterface;

Wann

static {
    System.loadLibrary("tensorflow_inference");
}

Sie können es durch Schreiben verwenden.

Instanzgenerierung

public TensorFlowInferenceInterface inferenceInterface;
inferenceInterface = new TensorFlowInferenceInterface();

Erstellen Sie eine Instanz mit usw.

inferenceInterface.initializeTensorFlow(getAssets(), "PATH_TO_MODEL");

Laden Sie das Modell aus app / src / main / assets / model.pb mit. Ändern Sie model.pb und "PATH_TO_MODEL" entsprechend Ihrer eigenen Umgebung.

Daten eingeben

inferenceInterface.fillNodeFloat("NAME_OF_INPUT", int[] shape = {1,784},float[] input);

Geben Sie Daten in das trainierte Modell mit ein "NAME_OF_INPUT" ist der Name des Platzhalters im Eingabeteil Tensorflows MNIST-Tutorial

x = tf.placeholder(tf.float32, [None, 784],name="input")

Es ist "Eingabe". In ähnlicher Weise ist int [] shape = {1,784} Teil von [None, 784]. Die Eingabe float [] ist auch die Vektorzeichenfolge, die Sie eingeben möchten, oder in MNIST die Vektorzeichenfolge handgeschriebener Zeichen. Bitte ändern Sie es entsprechend Ihrer eigenen Umgebung.

Zusätzlich zu Float für das Eingabearray inferenceInterface.fillNodeInt() inferenceInterface.fillNodeByte() Und so weiter. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java Bitte finden Sie es von hier.

Lauf

inferenceInterface.runInference(String[] {"NAME_OF_OUTPUT"});

Berechnen Sie die Ausgabe aus der Eingabe mit. "NAME_OF_OUTPUT" ist Tensorflow

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2,name="output")

Es ist ein Name wie. Da es mehrere Ausgabeebenen geben kann, ist es String [].

Ausgabe extrahieren

inferenceInterface.readNodeFloat("NAME_OF_OUTPUT", float[] output);

Empfängt die Ausgabe an der durch "NAME_OF_OUTPUT" in der float [] -Ausgabe angegebenen Position. Dies ist dasselbe wie die Eingabe, und Int und Double können auch ausgegeben werden.

abschließend

Die Erklärung ist ziemlich grob und es gibt keinen Beispielcode, daher weiß ich nicht warum, also werde ich ihn nacheinander korrigieren, wenn ich Zeit habe. Ich habe Beispielcode vorbereitet, aber da es viele Teile wie den Eingabeteil gibt, den ich durch Kopieren und Einfügen erstellt habe, werde ich ihn nach der Korrektur hinzufügen, damit kein Urheberrechtsproblem auftritt.

Zum Zeitpunkt der Implementierung auf Android gibt es zu wenige offizielle Erklärungen, und ich denke, dass es Teile gibt, die ich missverstanden habe. Wenn es also Fehler gibt, kommentieren Sie diese bitte.

Recommended Posts

So erstellen Sie eine App mit Tensorflow mit Android Studio
[Version 2020] So senden Sie eine E-Mail mit Android Studio Javamail
Erstellen Sie mit Android Studio eine ausführbare JAR-Datei
Wie man einen imposanten Android-Musikplayer macht
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
Erstelle eine Android App. (Tag 5)
So pushen Sie mit Rails entwickelte Apps an Github
Wie man einen Oleore-Generator mit Swagger Codegen herstellt
Anfänger in der App-Entwicklung haben versucht, eine Android-Rechner-App zu erstellen
Ich mache eine Android-App und sie steckt voller Fehler und wie man sie löst
So machen Sie einen Screenshot mit dem Android Studio-Emulator
Erstelle eine Android App. (Erster Tag)
So geben Sie db beim Erstellen einer App mit Rails an
[Android] So erstellen Sie ein Dialogfragment
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
So beschneiden Sie ein Bild in libGDX
[Android] Wie man mit dunklen Themen umgeht
Gesichtserkennungs-App mit OpenCV + Android Studio
Verwendung von ExpandableListView in Android Studio
Downgrade einer vorhandenen App, die mit Rails 5.2.4 erstellt wurde, auf 5.1.6
Wie erstelle ich Unity Native Plugin (Android-Version)
[Rails] So erstellen Sie eine Umgebung mit Docker
So erstellen Sie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC
Wie man ein schattiertes Glas macht
So machen Sie ein Bild mit Processing teilweise transparent
[Android Studio] So ändern Sie TextView in eine beliebige Schriftart [Java]
So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch
So erstellen Sie eine mit Ruby erstellte LINE-Messaging-Funktion
[Android Studio] [Java] So fixieren Sie den Bildschirm vertikal
So geben Sie einen Standard aus einem Array mit for Each aus
Lassen Sie uns schreiben, wie API mit SpringBoot + Docker von 0 erstellt wird
So implementieren Sie den In-App-Kauf einfach über den Itemstore <Implementierung: Android>
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
Erstellen Sie eine Instagram-Klon-App ④
Java - So erstellen Sie JTable
Ich möchte eine mit Rails 6 erstellte App an GitHub senden
So erstellen Sie ein Wear OS von Google App-Projekt unter Android Studio 3.0 oder höher
Verwenden Sie Java, das in Android Studio enthalten ist, um React Native zu erstellen
Erstellen Sie eine Instagram-Klon-App ②
So erhalten Sie Werte in Echtzeit mit TextWatcher (Android)
Ruby mit AtCoder lernen 13 So erstellen Sie ein zweidimensionales Array
So stellen Sie jQuery in Rails-Apps mit Webpacker bereit
[swift5] Versuchen Sie, einen API-Client auf verschiedene Arten zu erstellen
Erstellen Sie eine Instagram-Klon-App ③
Umgang mit Instanzen
So entfernen Sie Android-Apps, die mit dem RenderThread-Rätselfehler abstürzen
So entwickeln Sie eine App mit der Jersey Java RESTful API auf einer Alibaba Cloud ECS-Instanz
Erstellen Sie eine Instagram-Klon-App ①
[Schienen] Wie man Samen macht
Was ist ein unveränderliches Objekt? [Erklärung, wie man macht]