[JAVA] Une histoire addictive lors de l'utilisation de tensorflow sur Android

Aperçu

Je voulais utiliser le modèle tensorflow réalisé avec Python sur Android, j'ai donc essayé diverses choses, mais j'ai pas mal trébuché, donc je vais enregistrer les circonstances. En fin de compte, j'ai pu exécuter tensorflow sur Android en toute sécurité, mais la cause n'est pas corrigée.

PC:mac Environnement de développement: Android Studio programme tensorflow: il n'y a que model.pb qui stocke les paramètres et LSTM.java qui contient Tensor.create (), session.runner (), etc.

Action initiale

Je ne voulais pas utiliser Bazel, j'ai donc procédé en faisant référence à ce qui suit. Ensuite, enregistrez la partie où le problème s'est produit et est tombé ci-dessous. https://qiita.com/icchi_h/items/a1df9f27569714edfc5e

https://qiita.com/tchkwkzk/items/aa481db14126b6abdaa1

problème

J'avais des problèmes, alors je les ai traités individuellement. Problème 1: je ne peux pas lire model.pb Problème 2: tensorflow ne peut pas être importé Problème 3: l'application crache l'erreur suivante et est interrompue de force No implementation found for native Lorg/tensorflow/TensorFlow;.version:()Ljava/lang/String; Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/tensorflow/TensorFlow; FATAL EXCEPTION: main java.lang.UnsatisfiedLinkError: Cannot find TensorFlow native library for OS: linux, architecture: i686.

Problème 1: model.pb ne peut pas être lu

C'est assez gênant lors du développement d'applications iOS, mais Android Studio lit désormais les fichiers locaux à partir du dossier des ressources.

1: Ajouter le dossier des actifs à app / src / main (notez comment ajouter) Comment ajouter: Faites un clic droit sur principal → "Nouveau" → "Dossier" → "Dossier d'actifs"

2: Placez le fichier model.pb dans le dossier des actifs créés

3: Appelez le code suivant dans onCreate de MainActivity.java   byte[] graphDef = readByteFile(String.valueOf("model.pb"))

readFileToByte est une fonction auto-créée et est décrite comme suit.

   byte[] readByteFile(String filePath) {
        try {
            byte[] b = new byte[1];
            InputStream fis = this.getAssets().open(filePath);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            while (fis.read(b) > 0) {
                baos.write(b);
            }
            baos.close();
            fis.close();
            b = baos.toByteArray();

            return b;
        }catch(Exception ex){
            System.out.println(ex.toString());
            return null;
        }
    }

Problème 2: tensorflow ne peut pas être importé

L'importation suivante a été décrite dans LSTM.java utilisé cette fois.

import org.tensorflow.Graph;
import org.tensorflow.Session;
import org.tensorflow.Tensor;

Pour lire ceci, j'ai ajouté la description suivante à "build.gradle" dans l'application. En passant, il semble qu'il y ait "1.2.0" et "1.2.0-preview", et "copyTo" ne supporte que l'aperçu, donc j'ai écrit un aperçu. Après cela, appuyez sur le bouton Sync d'Android Studio.

dependencies {
    
    ...
 
    compile 'org.tensorflow:tensorflow-android:1.2.0-preview'
    //compile 'org.tensorflow:tensorflow:1.2.0'

   ...
   
}

Problème 3: lancer une erreur et tuer

No implementation found for native Lorg/tensorflow/TensorFlow;.version:()Ljava/lang/String; Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/tensorflow/TensorFlow; FATAL EXCEPTION: main java.lang.UnsatisfiedLinkError: Cannot find TensorFlow native library for OS: linux, architecture: i686.

Cependant, j'étais en difficulté car une solution surprenante pour cela n'est pas sortie. (Bien que mon manque d'étude)

J'ai fait certaines choses, je vais donc les décrire ci-dessous, mais il se peut que certaines opérations ne me soient pas nécessaires.

1. Ajouter un fichier so

À partir du lien ci-dessous, téléchargez le fichier en cliquant sur "Derniers artefacts de construction réussis-> out-> native-> (compresser tous les fichiers)". http://ci.tensorflow.org/view/Nightly/job/nightly-android/

Ajoutez le dossier libs directement sous l'application dans Android Studio. Dans le dossier libs Ajoutez tous les dossiers de "libtensorflow_inference.so" dans le dossier natif que vous avez téléchargé précédemment dans le dossier libs. La structure du répertoire devrait ressembler à ceci: -app --libs ---arm64-v8a ----libtensorflow_inference.so ---armeabi-v7a ----libtensorflow_inference.so ---x86 ----libtensorflow_inference.so ---x86_64 ----libtensorflow_inference.so

2. Ajoutez loadLibrary à MainAcitivity

public class MainActivity extends AppCompatActivity {

    ....

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

    ....

}

3. Modifiez les sourcesSets de build.gradle dans l'application

android {
    
    ...

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

    ...

}

Pour le moment, cela a fonctionné. Je ne sais pas quelle est la bonne réponse, mais je vais la laisser sous forme de mémoire.

Recommended Posts

Une histoire addictive lors de l'utilisation de tensorflow sur Android
Avertissement lors de l'utilisation de TensorFlow sur Mac
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Points addictifs lors du téléchargement de fichiers à l'aide de boto sur AWS Lambda
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
Un mémorandum lors de l'utilisation d'une belle soupe
Créer un outil de reconnaissance de visage à l'aide de TensorFlow
Utilisation d'une console série sur Ubuntu 20.04
Exécutez TensorFlow2 sur le serveur VPS
L'histoire de l'utilisation de la réduction de Python
L'histoire de l'erreur de hachage est apparue lors de l'utilisation de Pipenv
Remarques sur l'utilisation de la saisie semi-automatique lors de l'exécution interactive de Python sous Windows
Configurer un nœud pour faire MNIST sur ROS à l'aide de Tensorflow
Ce sur quoi je suis tombé lors de l'utilisation de CodeIgniter sur un serveur Linux
Connaissance lors de la création d'un bot en utilisant discord.py
Exécutez TensorFlow sur une instance GPU sur AWS
Essayez d'utiliser Bash sur Windows 10 2 (installation de TensorFlow)
intel Atom (Note) Petit gel fréquent lors de l'utilisation de Linux sur un PC.
Essayez de déduire à l'aide d'un modèle de régression linéaire sur Android [PyTorch Mobile]
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
Une difficulté lors de l'installation de pyenv sur Cygwin
J'ai construit un environnement TensorFlow avec windows10
Lors de l'utilisation de pygame sur Ubuntu 16.04, l'utilisation du processeur est de 100%
Essayez Tensorflow avec une instance GPU sur AWS
Essayez d'utiliser le code QR avec Raspberry Pi
L'histoire de vouloir afficher des annonces liées à des articles sur Jubatus
Une histoire sur l'exécution de Python sur PHP sur Heroku
Remarques sur l'utilisation de TensorFlow sur Bash sur Ubuntu sous Windows
TensorFlow: exécuter des données apprises en Python sur Android
J'ai créé un jeu ○ ✕ avec TensorFlow
L'histoire lorsqu'un utilisateur Python passe un fichier JSON
Créez une interface graphique sur le terminal à l'aide de curses
Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python
Créez un environnement d'apprentissage automatique à l'aide de PyCharm sur un environnement Ubuntu (TensorFlow sera également introduit!)
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
Une histoire lorsque j'utilisais IntelliJ sous Linux et que je ne pouvais pas saisir le japonais
Une petite histoire à savoir comme un point addictif lors de l'écriture d'applications Twilio à l'aide de Python sur AWS Lambda
Une histoire sur une erreur lors du chargement d'un modèle TensorFlow créé avec Google Colab localement
Calculez sur plusieurs GPU à l'aide de la stratégie en miroir de Tensorflow 2
Histoire de l'utilisation du jeton logiciel de Resona avec 1Password
Créer un environnement de développement Django à l'aide de pyenv-virtualenv sur Mac
Précautions lors de l'utilisation de sqlite3 de macOS Sierra (10.12) avec le multitraitement
Configurer un serveur de fichiers sur Ubuntu 20.04 à l'aide de Samba
J'ai un UnicodeDecodeError lorsque je pip installé sur ubuntu
Création d'un environnement TensorFlow qui utilise des GPU sous Windows 10
Vérifiez types_map lors de l'utilisation de mimetypes avec AWS Lambda (Python)
Erreur autour de l'interface graphique lors de l'utilisation de PyQt5 sur Ubuntu (WSL2)
Solution si heroku plante lors de l'utilisation de sélénium
Créez un environnement Python sur votre Mac en utilisant pyenv
Créer un environnement de développement Python à l'aide de pyenv sur MacOS
[kotlin] Créez une application de reconnaissance d'images en temps réel sur Android
Mémo quand Django est sorti sur VPS (préparation)
Une histoire sur un débutant Linux mettant Linux sur une tablette Windows