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.
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
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.
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;
}
}
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'
...
}
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.
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
public class MainActivity extends AppCompatActivity {
....
static {
System.loadLibrary("tensorflow_inference");
}
....
}
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