[PYTHON] Eine süchtig machende Geschichte bei der Verwendung von Tensorflow unter Android

Überblick

Ich wollte das mit Python unter Android erstellte Tensorflow-Modell verwenden, also habe ich verschiedene Dinge ausprobiert, bin aber ziemlich viel gestolpert, um die Umstände aufzuzeichnen. Am Ende konnte ich Tensorflow unter Android sicher ausführen, aber die Ursache ist nicht behoben.

PC:mac Entwicklungsumgebung: Android Studio Tensorflow-Programm: Nur model.pb mit Parametern und LSTM.java mit Tensor.create (), session.runner () usw.

Erste Aktion

Ich wollte Bazel nicht verwenden, daher ging ich mit folgendem Verweis vor. Notieren Sie dann den Teil, an dem das Problem aufgetreten ist und der unten gestolpert ist. https://qiita.com/icchi_h/items/a1df9f27569714edfc5e

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

Problem

Ich hatte einige Probleme, deshalb habe ich sie individuell behandelt. Problem 1: Ich kann model.pb nicht lesen Problem 2: Tensorflow kann nicht importiert werden Problem 3: Die App gibt den folgenden Fehler aus und wird gewaltsam beendet 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.

Problem 1: model.pb kann nicht gelesen werden

Dies ist bei der Entwicklung von iOS-Apps recht unpraktisch, aber Android Studio liest jetzt lokale Dateien aus dem Assets-Ordner.

1: Hinzufügen eines Assets-Ordners zu app / src / main (Hinweis zum Hinzufügen) So fügen Sie hinzu: Klicken Sie mit der rechten Maustaste auf main → "Neu" → "Ordner" → "Assets-Ordner".

2: Legen Sie die Datei model.pb im Ordner für erstellte Assets ab

3: Rufen Sie den folgenden Code in onCreate von MainActivity.java auf   byte[] graphDef = readByteFile(String.valueOf("model.pb"))

readFileToByte ist eine selbst erstellte Funktion und wird wie folgt beschrieben.

   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;
        }
    }

Problem 2: Tensorflow kann nicht importiert werden

Der folgende Import wurde in LSTM.java beschrieben, der dieses Mal verwendet wurde.

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

Um dies zu lesen, habe ich die folgende Beschreibung zu "build.gradle" in der App hinzugefügt. Übrigens scheint es "1.2.0" und "1.2.0-Vorschau" zu geben, und "copyTo" unterstützt nur die Vorschau, also habe ich eine Vorschau geschrieben. Drücken Sie danach die Sync-Taste von Android Studio.

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

   ...
   
}

Problem 3: Wirf einen Fehler und töte

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.

Ich war jedoch in Schwierigkeiten, weil eine überraschende Lösung dafür nicht herauskam. (Obwohl mein Mangel an Studium)

Ich habe einige Dinge getan, daher werde ich sie unten beschreiben, aber es kann einige Operationen geben, die ich nicht benötige.

1. Fügen Sie so eine Datei hinzu

Laden Sie die Datei über den folgenden Link herunter, indem Sie auf "Neueste erfolgreiche Build-Artefakte -> out-> native-> (alle Dateien komprimieren)" klicken. http://ci.tensorflow.org/view/Nightly/job/nightly-android/

Fügen Sie den libs-Ordner direkt unter der App in Android Studio hinzu. Im libs-Ordner Fügen Sie alle Ordner in "libtensorflow_inference.so" in dem nativen Ordner hinzu, den Sie zuvor in den libs-Ordner heruntergeladen haben. Die Verzeichnisstruktur sollte folgendermaßen aussehen: -app --libs ---arm64-v8a ----libtensorflow_inference.so ---armeabi-v7a ----libtensorflow_inference.so ---x86 ----libtensorflow_inference.so ---x86_64 ----libtensorflow_inference.so

2. Fügen Sie loadAibrary zu MainAcitivity hinzu

public class MainActivity extends AppCompatActivity {

    ....

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

    ....

}

3. Ändern Sie die sourceSets von build.gradle in der App

android {
    
    ...

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

    ...

}

Vorerst hat es funktioniert. Ich weiß nicht, wie die richtige Antwort lautet, aber ich werde sie als Memorandum belassen.

Recommended Posts

Eine süchtig machende Geschichte bei der Verwendung von Tensorflow unter Android
Warnung bei Verwendung von TensorFlow auf einem Mac
Eine Geschichte über einfaches maschinelles Lernen mit TensorFlow
Suchtpunkte beim Herunterladen von Dateien mit boto auf AWS Lambda
Ich habe ein VGG16-Modell mit TensorFlow gemacht (unterwegs)
Ein Memorandum bei der Verwendung von schöner Suppe
Erstellen Sie mit TensorFlow eine Gesichtserkennung
Verwenden einer seriellen Konsole unter Ubuntu 20.04
Führen Sie TensorFlow2 auf dem VPS-Server aus
Die Geschichte der Verwendung von Python reduziert
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Hinweise zur Verwendung der Tab-Vervollständigung beim interaktiven Ausführen von Python unter Windows
Richten Sie mit Tensorflow einen Knoten für MNIST auf ROS ein
Worauf ich bei der Verwendung von CodeIgniter auf einem Linux-Server gestoßen bin
Kenntnisse beim Erstellen eines Bots mit discord.py
Führen Sie TensorFlow auf einer GPU-Instanz in AWS aus
Versuchen Sie es mit Bash unter Windows 10 2 (TensorFlow-Installation)
Intel Atom (Hinweis) Bei Verwendung von Linux auf einem PC friert häufig Petit ein.
Versuchen Sie mit einem linearen Regressionsmodell auf Android [PyTorch Mobile] zu schließen
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ein Kampf bei der Installation von pyenv auf Cygwin
Ich habe eine TensorFlow-Umgebung mit Windows 10 erstellt
Bei Verwendung von Pygame unter Ubuntu 16.04 beträgt die CPU-Auslastung 100%
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Die Geschichte, Artikel-verknüpfte Anzeigen auf Jubatus anzeigen zu wollen
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Hinweise zur Verwendung von TensorFlow unter Bash unter Ubuntu unter Windows
TensorFlow: Führen Sie in Python gelernte Daten unter Android aus
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Die Geschichte, wenn ein Python-Benutzer eine JSON-Datei übergibt
Erstellen Sie eine GUI auf dem Terminal mit Flüchen
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Erstellen Sie eine maschinelle Lernumgebung mit PyCharm in einer Ubuntu-Umgebung (TensorFlow wird ebenfalls eingeführt!).
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Eine Geschichte, als ich IntelliJ unter Linux verwendete und kein Japanisch eingeben konnte
Eine kleine Geschichte, die beim Schreiben von Twilio-Anwendungen mit Python auf AWS Lambda süchtig macht
Eine Geschichte über einen Fehler beim Laden eines TensorFlow-Modells, das lokal mit Google Colab erstellt wurde
Berechnen Sie mit der gespiegelten Strategie von Tensorflow 2 auf mehreren GPUs
Geschichte der Verwendung von Resonas Software-Token mit 1Password
Erstellen einer Django-Entwicklungsumgebung mit pyenv-virtualenv auf einem Mac
Vorsichtsmaßnahmen bei Verwendung von sqlite3 von macOS Sierra (10.12) mit Multiprocessing
Richten Sie mit Samba einen Dateiserver unter Ubuntu 20.04 ein
Ich habe einen UnicodeDecodeError erhalten, als ich auf Ubuntu Pip installiert habe
Erstellen einer TensorFlow-Umgebung, die GPUs unter Windows 10 verwendet
Überprüfen Sie types_map, wenn Sie Mimetypen mit AWS Lambda (Python) verwenden.
Fehler in der GUI bei Verwendung von PyQt5 unter Ubuntu (WSL2)
Lösung, wenn Heroku bei Verwendung von Selen abstürzt
Erstellen Sie mit pyenv eine Python-Umgebung auf Ihrem Mac
Erstellen Sie eine Python-Entwicklungsumgebung mit pyenv unter MacOS
[kotlin] Erstelle eine Echtzeit-Bilderkennungs-App auf Android
Memo, als Django für VPS freigegeben wurde (Vorbereitung)
Eine Geschichte über einen Linux-Anfänger, der Linux auf ein Windows-Tablet bringt