[PYTHON] J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile

introduction

Créez un modèle de classification à partir de votre propre jeu de données d'image et partagez comment le déplacer en temps réel à l'aide de votre caméra iOS ou Android.

environnement

--google colaboratory (exécution: GPU) (TensorFlow 1.15) (Google Chrome)

1. Créez votre propre jeu de données et modèle

Dans cet article, nous allons créer un modèle de classification d'images à l'aide de retrain.py [^ 1]. [^ 1]: retrain.py migre vers make_image_classifier. Si vous utilisez make_image_classifier, vous pouvez le convertir en tflite en même temps que l'apprentissage, et il semble que vous n'ayez pas besoin de réécrire swift 224 en 299.

Puisque vous pouvez créer un modèle avec retrain.py, vous pouvez créer un environnement avec la commande curl. Vous n'êtes pas obligé de git clone.

retrain.Si tu veux avoir seulement py


curl -LO https://github.com/tensorflow/hub/raw/master/examples/image_retraining/retrain.py

1.1 Collectez des données d'image pour créer votre propre ensemble de données

Les données d'image peuvent être collectées relativement facilement à l'aide d'outils de grattage et de collecte d'images. J'ai utilisé google-images-download pour collecter des données d'image [^ 2]. [^ 2]: Depuis le 07/03/2020, google-images-download ne fonctionne pas dans certains environnements. On pense que la cause en est que l'algorithme de recherche Google a changé. Comment utiliser google-images-download [nombreux articles](https://www.google.com/search?sxsrf=ALeKk02U-SqEjAhMNjmpl4-sUbwkSaevTQ:1583514716818&q=google_images_download&spell=1&sa=XKved=2MSBahU Puisque cela a été fait, je vais l'omettre ici.    Pour créer un modèle à l'aide de retrain.py, créez la structure de répertoires suivante.

retrain.py
dataset
 |--label_A
 |     └─ aaa.jpg
 |     └─ bbb.png
 |     └─ ccc.jpg
 |       ⋮
 |-- label_B
 |     └─ ddd.png
 |     └─ eee.jpg
 |     └─ fff.png
   ⋮       ⋮

```
## 1.2 Modélisation
 Après avoir préparé retrain.py et les données d'image, laissez-les s'entraîner et créer un modèle.
 Lors de la création d'un modèle à l'aide de retrain.py, il est nécessaire de spécifier le jeu de données, alors spécifiez-le après `--image_dir`.

```
python retrain.py --image_dir dataset
```
 De plus, vous pouvez spécifier des arguments, tels que la destination de sortie du modèle et le nombre de formations [^ 3].
 [^ 3]: Si vous spécifiez `--tfhub_module https: // tfhub.dev / google / imagenet / mobilenet_v2_100_224 / feature_vector / 1` dans l'argument, il sera affiché comme mobilenet. mobilenet est un modèle relativement léger créé dans le but d'utiliser les résultats de l'apprentissage automatique sur des terminaux mobiles.
 Si vous l'exécutez sans spécifier la destination de sortie, ** output_graph.pb ** et ** output_labels.txt ** seront générés dans ** / tmp **.

## 1.3 (Bonus) Faire déduire le modèle
 Vous pouvez vérifier le résultat de l'inférence du modèle à l'aide de [label_image.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image/label_image.py).

# 2. Convertir le modèle créé au format tflite
 Convertissez le fichier de sortie ** output_graph.pb ** au format tflite (TensorFlow Lite).
## 2.1 Conversion pour iOS
 Comme iOS utilise un modèle quantifié, spécifiez `QUANTIZED_UINT8` pour` --inference_type` et` --inference_input_type`.

```
tflite_convert \
  --graph_def_file=/tmp/output_graph.pb \
  --output_file=./quant_graph.tflite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --input_shape=1,299,299,3 \
  --input_array=Placeholder \
  --output_array=final_result \
  --input_data_type=FLOAT \
  --default_ranges_min=0  \
  --default_ranges_max=6  \
  --inference_type=QUANTIZED_UINT8  \
  --inference_input_type=QUANTIZED_UINT8  \
  --mean_values=128 \
  --std_dev_values=128 \
```

## 2.2 Conversion pour Android
 Mon Android ne prend pas en charge le modèle quantifié de GPU, je vais donc utiliser le modèle pour FLOAT. Spécifiez `FLOAT` pour` --inference_type` et` --inference_input_type`. Remplacez `--output_file` par` float_graph.tflite`.


```
tflite_convert \
  --graph_def_file=/tmp/output_graph.pb \
  --output_file=./float_graph.tflite \
           ⋮
  --inference_type=FLOAT  \
  --inference_input_type=FLOAT  \
          ⋮
```
## 2.3 Problèmes lors de la conversion en tflite
 - La commande de conversion en tflite diffère selon la version de TensorFlow.
 --TensorFlow 1. Le modèle créé par la série X n'a pas pu être converti par le script de la série 2.X.
 --Je ne savais pas quoi spécifier pour `--input_array` ou` --output_array`.

 Créez le script suivant pour savoir ce qu'il faut spécifier pour `--input_array` et` --output_array`.

```python
import tensorflow as tf
gf = tf.GraphDef()   
m_file = open('/tmp/output_graph.pb','rb')
gf.ParseFromString(m_file.read())

with open('somefile.txt', 'a') as the_file:
    for n in gf.node:
        the_file.write(n.name+'\n')

file = open('somefile.txt','r')
data = file.readlines()
print ("Output name = ")
print (data[len(data)-1])

print ("Input name = ")
file.seek ( 0 )
print (file.readline())
```
 Le résultat de l'exécution ressemble à ceci.

```
Output name = 
final_result

Input name = 
Placeholder
```
# 3. Essayez-le sur mobile
 Utilisez le code source trouvé dans [tensorflow / examples](https://github.com/tensorflow/examples).

```
git clone https://github.com/tensorflow/examples.git
```

3.1 iOS
 1. Ouvrez le projet selon [README.md](https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/ios)
 2. Sélectionnez ImageClassification / ImageClassification / Model cmd ⌘ + clic-> ʻAjouter des fichiers à "ImageClassification" ... `pour ajouter ** quant_graph.tflite ** et ** output_labels.txt **
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425587/04212b56-0ad9-3939-93ad-cca1cac7e67b.png)
 3. Réécrire ImageClassification / ImageClassification / ModelDataHandler / ModelDataHandler.swift
 4. Remplacez «mobilenet_quant_v1_224» à la ligne 37 par ** «quant_graph» **
 5. Remplacez "étiquettes" à la ligne 38 par ** "output_labels" **
 6. Modifiez la valeur de inputWidth à la ligne 58 en ** 299 **
 7. Modifiez la valeur de inputHeight à la ligne 59 en ** 299 **


#### **`.swift`**
```

  enum MobileNet {
  static let modelInfo: FileInfo = (name: "quant_graph", extension: "tflite")
  static let labelsInfo: FileInfo = (name: "output_labels", extension: "txt")
}

         ~Abréviation~

  // MARK: - Model Parameters
  let batchSize = 1
  let inputChannels = 3
  let inputWidth = 299
  let inputHeight = 299
```


3.2 Android
 1. Ouvrez `\ examples \ lite \ examples \ image_classification \ android` dans Android Studio
 2. Placez ** float_graph.tflite ** et ** output_labels.txt ** dans `\ app \ src \ main \ assets`
 3. Réécrivez app \ src \ main \ java \ org \ tensorflow \ lite \ examples \ classification \ tflite \ ClassifierFloatMobileNet.java
 4. Remplacez la ligne 55 de "mobilenet_v1_1.0_224.tflite" par ** "float_graph.tflite" **
 5. Modification de la ligne 60 de "labels.txt" à ** "output_labels.txt" **

```java
  @Override
  protected String getModelPath() {
    // you can download this file from
    // see build.gradle for where to obtain this file. It should be auto
    // downloaded into assets.
    return "float_graph.tflite";
  }

  @Override
  protected String getLabelPath() {
    return "output_labels.txt";
  }
```





  




Recommended Posts

J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile
[Je suis un débutant en informatique] J'ai fait de mon mieux pour implémenter Linux sur Windows
J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
J'ai essayé la classification d'image d'AutoGluon
Créez un modèle de classification d'images de manière explosive avec Azure Custom Vision et implémentez-le avec Flask
[Introduction au modèle de maladie infectieuse] J'ai essayé de m'adapter et de jouer
J'ai créé un modèle de détection d'anomalies qui fonctionne sur iOS
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai essayé de déplacer le ballon
J'ai essayé de créer un environnement de MkDocs sur Amazon Linux
Prenez une image avec Pepper et affichez-la sur votre tablette
[Apprentissage automatique] J'ai essayé de faire quelque chose comme passer des images
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de résumer jusqu'à ce que je quitte la banque et devienne ingénieur
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
J'ai installé DSX Desktop et l'ai essayé
J'ai fait une IA pour juger si c'est de l'alcool ou non!
Je souhaite afficher une image sur Jupyter Notebook à l'aide d'OpenCV (mac)
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Touches de karaoké assorties ~ J'ai essayé de le mettre sur Laravel ~ <en route>
J'ai essayé de pousser les documents Sphinx vers BitBucket et de les refléter automatiquement sur le serveur Web
[kotlin] Trier les images sur Android (Pytorch Mobile)
J'ai essayé d'installer Docker sur Windows10 Home mais cela n'a pas fonctionné
J'ai implémenté le modèle VGG16 avec Keras et essayé d'identifier CIFAR10
Création d'un modèle de discrimination d'image (cifar10) à l'aide d'un réseau neuronal convolutif
[Python] J'ai créé un script qui coupe et colle automatiquement les fichiers du PC local sur un SSD externe.
J'ai créé un outil pour informer Slack des événements Connpass et en ai fait Terraform
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
J'ai essayé d'exécuter Flask sur Raspberry Pi 3 Model B + en utilisant Nginx et uWSGI
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
Je souhaite convertir du texte horizontal en texte vertical et le publier sur Twitter, etc.
J'ai fait une image pour qemu avec Yocto, mais j'ai échoué et j'ai recommencé
J'ai fait de mon mieux pour créer une fonction d'optimisation, mais cela n'a pas fonctionné.
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de déplacer GAN (mnist) avec keras
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé de détecter un objet avec M2Det!
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai créé et publié une image Docker qui lit RSS et tweete automatiquement régulièrement.
[Rails] v1.0 est sorti sur google-cloud-vision de gem, j'ai donc essayé de le soutenir
sphinx-quickstart est devenu un problème et j'ai essayé de créer une commande alternative et le stress a disparu
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Mémo Un débutant a essayé de créer un environnement Java et de le traduire en japonais sur Ubuntu 18.04.2 LTS.
J'ai essayé de faciliter la modification du paramètre du proxy authentifié sur Jupyter
Je veux convertir une image en WebP avec sucette
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
Il est difficile d'installer un écran vert, je n'ai donc découpé que le visage et l'ai superposé sur l'image de fond
J'ai essayé de déplacer Faster R-CNN rapidement avec pytorch
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'ajouter un post-incrément à CPython. Présentation et résumé
Je souhaite développer des applications Android sur Android (débogage)