[JAVA] Comment créer une application à l'aide de Tensorflow avec Android Studio

Addendum 3: J'ai reçu une demande de correction concernant la notation de @ 84d010m08 et je l'ai fusionnée. Merci beaucoup. Actuellement, il semble y avoir deux méthodes, Tensor Flow mobile et lite. Veuillez vous référer à cet article.

Addendum 2: Veuillez vous référer à l'explication officielle pour une explication appropriée. https://www.tensorflow.org/mobile/android_build

Post-scriptum: Le contenu de cet article est obsolète. Pour expliquer très simplement la méthode actuelle, écrivez le contenu suivant dans build.gradle.

build.gradle


allprojects {
    repositories {
        jcenter()
    }
}

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

Ce faisant, vous pouvez utiliser TensorFlowInferenceInterface. (Voir l'ancien article ci-dessous pour TensorFlowInferenceInterface) Les noms des méthodes ont beaucoup changé, c'est donc une bonne idée de les rechercher dans le référentiel officiel. Au moment de l'ajout, ・ Entrez avec alimentation () ・ Apprenez avec run () -Fetch sortie avec fetch () est. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java

Article avant ajout ci-dessous


Bien que certains articles aient exécuté Tensorflow sur Android, http://qiita.com/tomoima525/items/99a2df5cb0559c41647a http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/ornew/items/cf7e4478936fbf28b271 http://qiita.com/miyosuda/items/e53ad2efeed0ff040606 Puisqu'il n'y avait pas de document japonais sur la façon d'exécuter simplement à l'aide de la classe TensorFlowInferenceInterface, c'était juste un mémo. La méthode de cet article vous permet de créer une application avec uniquement le modèle entraîné et Android Studio. Il existe de nombreux bons articles sur l'utilisation du Deep Learning et sur l'utilisation de Tensorflow, veuillez donc les rechercher.

J'écris beaucoup, donc je réglerai ça un par un quand j'aurai le temps.

Documentation officielle

Les trois suivants. 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

Préparation

De la préparation des fichiers .jar et .so. Identique au contenu du document officiel ci-dessous. https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android

Si tu ne veux pas mettre bazel https://ci.tensorflow.org/view/Nightly/job/nightly-android/ Il semble que vous puissiez obtenir un fichier pré-construit à partir de (non confirmé)

Tout d'abord

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

Téléchargez la source Tensorflow sur

prochain

tensorflow/WORKSPACE

Changer à l'intérieur Décommentez la partie suivante et spécifiez le chemin de manière appropriée

\# 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.

Ensuite, nous allons construire.

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

Construisez avec bazel.

--cpu=armeabi-v7a

La partie de

arm64-v8a x86 x86_64

Veuillez changer pour un approprié.

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

A été généré.

prochain

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

alors

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

Un fichier jar sera créé au format.

Paramètres d'Android Studio

▽libs   libandroid_tensorflow_inference_java.jar   ▽armeabi-v7a     libtensorflow_inference.so Organisez les fichiers comme ceci dans app / build.gradle

app/build.gradle


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

Ajoutée

Comment écrire du code

Importer-> Créer une instance-> Entrée-> Exécuter-> Extraire la sortie C'est une procédure de.

importer

import org.tensorflow.contrib.android.TensorFlowInferenceInterface;

Quand

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

Vous pouvez l'utiliser en écrivant.

Génération d'instance

public TensorFlowInferenceInterface inferenceInterface;
inferenceInterface = new TensorFlowInferenceInterface();

Créez une instance avec, etc.

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

Chargez le modèle depuis app / src / main / assets / model.pb avec. Modifiez model.pb et "PATH_TO_MODEL" en fonction de votre propre environnement.

Entrer des données

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

Entrez les données dans le modèle entraîné avec "NAME_OF_INPUT" est le nom de l'espace réservé dans la partie d'entrée Tutoriel MNIST de Tensorflow

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

C'est "entrée". De même, int [] shape = {1,784} fait partie de [None, 784]. En outre, l'entrée float [] est la chaîne vectorielle que vous souhaitez saisir, ou dans MNIST, la chaîne vectorielle de caractères manuscrits. Veuillez le modifier en fonction de votre propre environnement.

En plus de Float pour le tableau d'entrée inferenceInterface.fillNodeInt() inferenceInterface.fillNodeByte() Etc. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/android/java/org/tensorflow/contrib/android/TensorFlowInferenceInterface.java Veuillez le trouver d'ici.

Courir

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

Calculez la sortie de l'entrée avec. «NAME_OF_OUTPUT» est Tensorflow

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

C'est un nom donné par tel que. Puisqu'il peut y avoir plusieurs couches de sortie, il s'agit de String [].

Extraire la sortie

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

Reçoit la sortie à l'emplacement spécifié par "NAME_OF_OUTPUT" dans la sortie float []. C'est le même que l'entrée, et Int et Double peuvent également être sortis.

en conclusion

L'explication est assez grossière et il n'y a pas d'exemple de code, donc je ne sais pas pourquoi, donc je vais le corriger un par un quand j'aurai le temps. J'ai préparé un exemple de code, mais comme il y a de nombreuses parties telles que la partie d'entrée que j'ai créée en copiant et collant, je l'ajouterai après l'avoir corrigée afin qu'il n'y ait pas de problème de copyright.

Il y a trop peu d'explications officielles au moment de la mise en œuvre sur Android, et je pense qu'il y a des parties que j'ai mal comprises, donc s'il y a des erreurs, veuillez commenter.

Recommended Posts

Comment créer une application à l'aide de Tensorflow avec Android Studio
[Version 2020] Comment envoyer un e-mail à l'aide d'Android Studio Javamail
Créer un fichier exécutable avec Android Studio
Comment créer un lecteur de musique Android imposant
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Créez une application Android. (Jour 5)
Comment pousser une application développée avec Rails vers Github
Comment faire un générateur d'oléore en utilisant Swagger Codegen
Un débutant en développement d'applications a essayé de créer une application de calculatrice Android
Je crée une application Android et elle est bloquée par des erreurs et comment la résoudre
Comment faire une capture d'écran avec l'émulateur Android Studio
Créez une application Android. (Premier jour)
Comment spécifier la base de données lors de la création d'une application avec des rails
[Android] Comment créer un fragment de dialogue
J'ai essayé de créer une application Android avec MVC maintenant (Java)
Comment recadrer une image avec libGDX
[Android] Comment gérer les thèmes sombres
Application de reconnaissance faciale avec OpenCV + Android Studio
Comment utiliser ExpandableListView dans Android Studio
Rétrograder une application existante créée avec les rails 5.2.4 vers 5.1.6
Comment créer un plug-in natif Unity (version Android)
[Rails] Comment créer un environnement avec Docker
Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC
Comment faire un pot ombré
Comment rendre une image partiellement transparente avec le traitement
[Android Studio] Comment changer TextView en n'importe quelle police [Java]
Comment faire un test unitaire avec JVM sur une source à l'aide de RxAndroid
Comment créer une fonction de messagerie LINE avec Ruby
[Android Studio] [Java] Comment réparer l'écran verticalement
Comment sortir le standard d'un tableau avec for Each
Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Comment mettre en œuvre facilement les achats intégrés à l'aide d'itemsstore <Implémentation: Android>
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Créer une application de clonage Instagram ④
Java - Comment créer JTable
Je veux pousser une application créée avec Rails 6 vers GitHub
Comment créer un projet d'application Wear OS by Google sur Android Studio 3.0 ou supérieur
Utilisez Java inclus avec Android Studio pour créer React Native
Créer une application de clonage Instagram ②
Comment obtenir des valeurs en temps réel avec TextWatcher (Android)
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Comment déployer jQuery dans les applications Rails à l'aide de Webpacker
[swift5] Essayez de créer un client API avec différentes méthodes
Créer une application de clonage Instagram ③
Comment gérer les instances
Comment se débarrasser des applications Android qui plantent avec l'erreur mystère RenderThread
Comment développer une application avec l'API Jersey Java RESTful sur une instance Alibaba Cloud ECS
Créer une application de clonage Instagram ①
[Rails] Comment faire des graines
Qu'est-ce qu'un objet immuable? [Explication comment faire]