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