[PYTHON] À propos de l'itinéraire le plus court pour créer un modèle de reconnaissance d'image par apprentissage automatique et mettre en œuvre une application Android

Objectif de cet article

Environnement d'exécution

--google colaboratory (runtime: GPU) (tensorflow 2.0) (Google Chrome)

Quoi écrire dans cet article

Comment créer un jeu de données pour un modèle de reconnaissance d'image

Suivez les étapes suivantes

  1. Créez plusieurs classes que vous souhaitez reconnaître. (Ici, classes A, B, C)
  2. Collectez des images de classe A, B, C
  3. Divisez les images des classes A, B, C pour la formation et les tests

Collectez des images des classes A, B, C

Ignorer si vous avez déjà collecté des images Si vous ne l'avez pas encore collecté, google_image_download (URL de référence) est pratique. Il télécharge des images en spécifiant des mots-clés, des extensions, des tailles, le nombre de feuilles, etc.

Divisez les images de classe A, B, C pour la formation et les tests

Divisez les images en bons sentiments pour l'entraînement et les tests (80% d'entraînement: environ 20% de test?) Plus précisément, créez un dossier avec la structure suivante images ├train │└A │ └a01.jpg │ └aslfdjk.png │ ... │└B │ └ba.jpg │ └dskrup.png │ ... │└C │ └ba.jpg │ └sdddrrd.png │ ... │ ├validation │└A │ └fwwqd.jpg │ └qiita.png │ ... │└B │ └sddd.jpg │ └reag.png │ ... │└C │ └vtet.jpg │ └fhyr.png │ ...

Comment créer un modèle de reconnaissance d'image

Créez le modèle en suivant les étapes suivantes

  1. Utilisez le tutoriel tensorflow
    1. Remplacez les données qui forment le modèle par les vôtres
  2. Entraînez le modèle en modifiant légèrement la forme du modèle compte tenu de l'implémentation dans Android Studio
  3. Comment enregistrer le modèle entraîné

Utiliser le didacticiel d'apprentissage du transfert tensorflow

Axé sur la simplicité, le code qui a détourné le tutoriel fourni par tensorflow est [(URL de référence) * google colaboratory s'ouvre soudainement lorsque vous appuyez sur l'URL](https://colab.research.google.com/drive/ 1p-MY8C_H238TWffWrRjC8cc20alZACSD) Pour savoir comment utiliser google colaboratory, reportez-vous à Official HP.

Remplacez les données qui forment le modèle par les vôtres

Cette partie du code source

from google.colab import drive
drive.mount('/content/drive')
PATH = '/content/drive/'+'Chemin d'accès à votre ensemble de données sur Google Drive'

Si vous entrez ceci, voulez-vous autoriser l'accès à Google Drive? Il vous sera demandé de le certifier. Personnellement, je m'en fiche, donc je m'authentifie sans y penser, mais si cela vous intéresse, vous devriez arrêter de charger votre propre ensemble de données avec google colaboraotry.

Entraînez le modèle avec des modifications mineures de la forme du modèle pour l'implémentation dans Android Studio

Cette partie du code source

Après cela, vous pouvez entraîner le modèle en exécutant les cellules de code suivantes dans l'ordre.


history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=total_train // batch_size,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=total_val // batch_size
)

Comment enregistrer un modèle entraîné

seulement ça

saved_model_dir = base_dir+'Où vous voulez économiser'
tf.saved_model.save(model, saved_model_dir)

Comment charger et déplacer le modèle de reconnaissance d'image créé dans Android Studio

Suivez les étapes suivantes

  1. Convertissez le modèle enregistré en modèle TensorFlow Lite et enregistrez
  2. Créez un projet de studio Android
  3. Chargez le modèle enregistré dans le studio Android et exécutez l'application

Convertissez le modèle enregistré en modèle TensorFlow Lite et enregistrez-le

seulement ça

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

with open(base_dir+'Nom du modèle.tflite', 'wb') as f:
  f.write(tflite_model)

Téléchargez le modèle enregistré et enregistrez-le localement.

Créer un projet de studio Android

Tout d'abord, installez Android studio (URL de référence), Comme d'habitude, le démarrage rapide fourni par tensorflow est utilisé. URL de référence Si vous suivez les étapes, un dossier nommé example sera créé dans l'environnement local, alors ouvrez le projet Android dans le chemin suivant. \examples\lite\examples\image_classification\android

Chargez le modèle enregistré dans le studio Android et exécutez l'application

Suivez les étapes ci-dessous

  1. Placez le fichier .tflite enregistré localement dans le dossier des ressources
  2. Placez le fichier .txt contenant la classe dans le dossier des ressources
  3. Réécrivez partiellement le fichier .ja

Placez le fichier .tflite enregistré localement dans le dossier des ressources

Placez-le dans le dossier suivant. \examples\lite\examples\image_classification\android\app\src\main\assets Il y a des .tflite au même endroit.

Placez le fichier .txt avec la classe dans le dossier des ressources

Dans ce cas, écrivez les classes A, B et C comme suit et enregistrez-les au même emplacement que le fichier .tflite.

mylabel.text


A
B
C

Réécrire partiellement le fichier .java

Premier, \examples\lite\examples\image_classification\android\app\src\main\java\org\tensorflow\lite\examples\classification\tflite\ClassifierFloatMobileNet.java 56e ligne

return "mobilenet_v1_1.0_224.tflite";

Est réécrit comme suit

return "Nom du modèle.tflite";

prochain, \examples\lite\examples\image_classification\android\app\src\main\java\org\tensorflow\lite\examples\classification\tflite\Classifier.java 110e ligne

  public static Classifier create(Activity activity, Model model, Device device, int numThreads)
      throws IOException {
    if (model == Model.QUANTIZED) {
      return new ClassifierQuantizedMobileNet(activity, device, numThreads);
    } else {
      return new ClassifierFloatMobileNet(activity, device, numThreads);
    }
  }

Est réécrit comme suit

  public static Classifier create(Activity activity, Model model, Device device, int numThreads)
      throws IOException {
    //if (model == Model.QUANTIZED) {
      //return new ClassifierQuantizedMobileNet(activity, device, numThreads);
    //} else {
      return new ClassifierFloatMobileNet(activity, device, numThreads);
    //}
  }

Enfin, exécutez un projet de création dans Android Studio. Après cela, connectez le smartphone au PC et exécutez Run'app '. Ensuite, une application nommée TFL Classify est installée et exécutée sur le smartphone. Au bas de l'écran, la confiance de A, B et C (indiquant la probabilité de la classe en%) est affichée.

Histoire d'échec de l'écrivain

Je vais partager quelques-unes des histoires d'échec (?) Sur lesquelles l'auteur est tombé et qui peuvent être utiles.

Échec (?) 1

J'ai essayé de convertir le modèle pytorch en modèle tensorflow LITE et j'ai fini par être frustré. J'ai principalement fait référence à ces deux sites Web, mais URL1, URL2 -keras-models-to-android-avec-tensorflow-mobile-a16a1fb83f2) J'ai eu une erreur peu claire dans les deux cas et je me suis arrêté. Quand j'y pense maintenant, cela peut être dû à l'existence à la fois de keras et de tf.keras. Pouvons-nous le vérifier la prochaine fois?

Cette fois, je voulais déplacer mon propre modèle avec l'application Android dès que possible.J'ai donc fini par créer un modèle à l'aide du tutoriel tensorflow et j'ai converti le modèle keras en modèle tensorflow LITE comme décrit ci-dessus.

Comme décrit dans [URL1] ci-dessus (https://qiita.com/lain21/items/9f9f9707ebad4bbc627d)

Pendant ce temps, les avantages évidents de TensorFlow par rapport à PyTorch sont les suivants.

Peut apprendre en utilisant TPU Des API riches telles que TFLite et TensorFlow.js qui facilitent le déploiement sur le front-end

Actuellement, tensorflow semble avoir plus de support pour faciliter la conversion en applications.

Échec (?) 2

Lors de la collecte de divers codes, keras et tf.keras ont été mélangés. Du milieu, je l'ai réécrit sur tf.keras comme un homme qui efface absolument les keras.

Échec (?) 3

Je ne remarque pas que la sortie du modèle est celle du code du tutoriel par défaut, et il n'y a pas assez de sortie dans le studio Android! J'ai fait une erreur en disant. Je pensais que la cause de l'erreur était de créer un fichier .tflite à partir de keras en utilisant TFLiteConverter, alors j'y ai passé beaucoup de temps ... Après tout, sur cette URL, en essayant d'évaluer mon propre modèle, c'est devenu "quelque chose ne va pas avec la forme de la sortie?" J'ai remarqué que la forme de

Échec (?) 4

J'ai essayé de quantifier le modèle, mais j'ai abandonné car il ne pouvait pas être lu par le studio Android. Après tout, j'ai utilisé le modèle de flotteur. Je l'ai essayé car la taille du modèle serait plus petite et le traitement serait plus rapide s'il était quantifié, mais je ne pouvais pas. La cause de ceci est encore inconnue.

Échec (?) 5

Au début, je n'avais pas décidé quoi utiliser pour la reconnaissance d'objets, et je pensais utiliser yolo avec darknet, mais je ne savais pas comment utiliser mon propre modèle, alors j'ai abandonné parce que je ne savais pas comment le faire. D'une connaissance, pytorch est facile! Cela a conduit à l'échec 1. N'abandonnez pas dès que vous pensez de cette façon. .. ..

Échec (?) 6

Vous pouvez facilement collecter des images en utilisant google_image_download avec [Collecter des images de classe A, B, C](# Collecter des images de classe A, B, C)! J'ai écrit cela, mais c'est assez difficile. Bien sûr, des images inappropriées sont également téléchargées, il est donc difficile de les jeter ou de les rogner, puis le travail de classification attend. Je comprends pourquoi les annotations sont un travail dans le monde, mais je ne veux pas faire grand-chose parce que les vrais députés sont susceptibles de diminuer. .. .. Il existe un apprentissage actif en tant que mot associé, et il semble que ce soit une méthode qui sélectionne automatiquement une image qui augmente le taux de reconnaissance. Ce serait pratique si possible. Je me demande?

Échec (?) 7

Après avoir commencé à écrire cet article, j'ai remarqué que le contenu du didacticiel tensorflow avait changé. En fait, j'ai utilisé le didacticiel d'apprentissage par transfert, mais comme il était difficile de publier mon code, je n'avais pas d'autre choix que d'utiliser le didacticiel de classification d'images pour l'explication. Je pense que l'apprentissage par transfert, qui est censé améliorer la précision avec un petit nombre de données, est plus pratique que de créer un modèle par vous-même. Le didacticiel actuel d'apprentissage du transfert est conçu pour lire les données à partir de tf, et il est compliqué de les modifier et de les écrire, alors j'ai renoncé à l'utiliser pour expliquer. Je veux utiliser mes données pour l'apprentissage par transfert! S'il y a une demande, vous pouvez avoir envie de faire de votre mieux. .. ..

Recommended Posts

À propos de l'itinéraire le plus court pour créer un modèle de reconnaissance d'image par apprentissage automatique et mettre en œuvre une application Android
Créez une application de reconnaissance d'image qui discrimine les nombres écrits à l'écran avec Android (PyTorch Mobile) [implémentation Android]
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 2 [Génération de modèles par apprentissage automatique]
Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
Enregistrer le graphique dessiné par pyqtgraph dans une image
Intelligence artificielle, machine learning, deep learning pour mettre en œuvre et comprendre
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
Procédure de génération et d'enregistrement d'un modèle d'apprentissage par machine learning, en faisant un serveur API et en communiquant avec JSON depuis un navigateur
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Gestion des modèles d'apprentissage automatique pour éviter de se quereller avec le côté commercial
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
[Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images
Implémentation du modèle de reconnaissance d'images d'apprentissage en profondeur 2
[Python Kivy] Comment obtenir le chemin du fichier par glisser-déposer
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Créons un modèle de reconnaissance d'image avec vos propres données et jouons!
Prenons la version gratuite "Introduction à Python pour l'apprentissage automatique" en ligne jusqu'au 27/04
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ② (construction de modèles d'IA)
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
Créez une application qui reconnaît les images en écrivant des chiffres à l'écran sur Android (PyTorch Mobile) [création de réseau CNN]