[PYTHON] Ich habe ein Bildklassifizierungsmodell erstellt und versucht, es auf dem Handy zu verschieben

Einführung

Erstellen Sie ein Klassifizierungsmodell aus Ihrem eigenen Bilddatensatz und teilen Sie mit, wie Sie es mit Ihrer iOS- oder Android-Kamera in Echtzeit verschieben können.

Umgebung

--go colaboratory (Laufzeit: GPU) (TensorFlow 1.15) (Google Chrome)

1. Erstellen Sie Ihren eigenen Datensatz und Ihr eigenes Modell

In diesem Artikel erstellen wir ein Bildklassifizierungsmodell mit retrain.py [^ 1]. [^ 1]: retrain.py wird nach [make_image_classifier] migriert (https://github.com/tensorflow/hub/tree/master/tensorflow_hub/tools/make_image_classifier). Wenn Sie make_image_classifier verwenden, können Sie es gleichzeitig mit dem Lernen in tflite konvertieren, und es scheint, dass Sie Swift 224 bis 299 nicht neu schreiben müssen.

Da Sie mit retrain.py ein Modell erstellen können, können Sie mit dem Befehl curl eine Umgebung erstellen. Sie müssen nicht "git clone".

retrain.Wenn du nur py bekommen willst


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

1.1 Sammeln Sie Bilddaten, um Ihren eigenen Datensatz zu erstellen

Bilddaten können relativ einfach mithilfe von Scraping- und Bilderfassungswerkzeugen erfasst werden. Ich habe google-images-download verwendet, um Bilddaten zu sammeln [^ 2]. [^ 2]: Ab dem 03.03.2020 funktioniert der Download von Google-Bildern in einigen Umgebungen nicht mehr. Es wird angenommen, dass die Ursache darin besteht, dass sich der Google-Suchalgorithmus geändert hat. Verwendung von Google-Images-Download viele Artikel Da es getan wurde, werde ich es hier weglassen.    Um ein Modell mit retrain.py zu erstellen, erstellen Sie die Verzeichnisstruktur wie folgt.

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

```
## 1.2 Modellierung
 Nachdem Sie retrain.py und Bilddaten vorbereitet haben, trainieren und erstellen wir ein Modell.
 Wenn Sie ein Modell mit retrain.py erstellen, müssen Sie das Dataset angeben. Geben Sie es daher nach "--image_dir" an.

```
python retrain.py --image_dir dataset
```
 Darüber hinaus können Sie Argumente angeben, z. B. das Ausgabeziel des Modells und die Anzahl der Schulungen [^ 3].
 [^ 3]: Wenn Sie im Argument `--tfhub_module https: // tfhub.dev / google / imagenet / mobilet_v2_100_224 / feature_vector / 1` angeben, wird es als mobilet ausgegeben. mobilet ist ein relativ leichtes Modell, das entwickelt wurde, um die Ergebnisse des maschinellen Lernens auf mobilen Endgeräten zu nutzen.
 Wenn Sie es ausführen, ohne das Ausgabeziel anzugeben, werden ** output_graph.pb ** und ** output_labels.txt ** an ** / tmp ** ausgegeben.

## 1.3 (Bonus) Lassen Sie das Modell tatsächlich schließen
 Sie können das Inferenzergebnis des Modells mit [label_image.py] überprüfen (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image/label_image.py).

# 2. Konvertieren Sie das erstellte Modell in das Flite-Format
 Konvertieren Sie die Ausgabedatei ** output_graph.pb ** in das tflite-Format (TensorFlow Lite).
## 2.1 Konvertierung für iOS
 Da iOS ein quantisiertes Modell verwendet, geben Sie "QUANTIZED_UINT8" für "--inference_type" und "--inference_input_type" an.

```
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 Konvertierung für Android
 Mein Android hat das quantisierte Modell der GPU nicht unterstützt, daher werde ich das Modell für FLOAT verwenden. Geben Sie "FLOAT" für "--inference_type" und "--inference_input_type" an. Ändern Sie `--output_file` in` 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 Probleme bei der Konvertierung in tflite
 - Der Befehl zum Konvertieren in tflite unterscheidet sich je nach Version von TensorFlow.
 --TensorFlow 1. Das von der X-Serie erstellte Modell konnte vom Skript der 2.X-Serie nicht konvertiert werden.
 - Ich wusste nicht, was ich für `--input_array` oder` --output_array` angeben sollte.

 Erstellen Sie das folgende Skript, um zu wissen, was für `--input_array` und` --output_array` angegeben werden muss.

```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())
```
 Das Ausführungsergebnis sieht so aus.

```
Output name = 
final_result

Input name = 
Placeholder
```
# 3. Probieren Sie es auf dem Handy aus
 Verwenden Sie den Quellcode in [tensorflow / examples](https://github.com/tensorflow/examples).

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

3.1 iOS
 1. Öffnen Sie das Projekt gemäß [README.md](https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/ios).
 2. Wählen Sie ImageClassification / ImageClassification / Model cmd ⌘ + klicken Sie auf-> `Dateien zu" ImageClassification "hinzufügen ...`, um ** quant_graph.tflite ** und ** output_labels.txt ** hinzuzufügen
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425587/04212b56-0ad9-3939-93ad-cca1cac7e67b.png)
 3. Schreiben Sie ImageClassification / ImageClassification / ModelDataHandler / ModelDataHandler.swift neu
 4. Ändern Sie "mobilet_quant_v1_224" in Zeile 37 in ** "quant_graph" **
 5. Ändern Sie "Labels" in Zeile 38 in ** "output_labels" **
 6. Ändern Sie den Wert von inputWidth in Zeile 58 in ** 299 **
 7. Ändern Sie den Wert von inputHeight in Zeile 59 in ** 299 **


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

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

         ~Abkürzung~

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


3.2 Android
 1. Öffnen Sie in Android Studio "\ examples \ lite \ examples \ image_classification \ android"
 2. Platzieren Sie ** float_graph.tflite ** und ** output_labels.txt ** in `\ app \ src \ main \ assets`
 3. Schreiben Sie die App \ src \ main \ java \ org \ tensorflow \ lite \ examples \ klassification \ tflite \ ClassifierFloatMobileNet.java neu
 4. Zeile 55 von "mobilet_v1_1.0_224.tflite" in ** "float_graph.tflite" ** geändert
 5. Zeile 60 wurde von "label.txt" in ** "output_labels.txt" ** geändert

```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

Ich habe ein Bildklassifizierungsmodell erstellt und versucht, es auf dem Handy zu verschieben
[Ich bin ein IT-Anfänger] Ich habe mein Bestes versucht, Linux unter Windows zu implementieren
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich habe versucht, Scrapy auf Anaconda zu installieren und konnte es nicht
Ich habe die Bildklassifizierung von AutoGluon ausprobiert
Erstellen Sie mit Azure Custom Vision explosionsartig ein Bildklassifizierungsmodell und implementieren Sie es mit Flask
[Einführung in das Modell der Infektionskrankheiten] Ich habe versucht, zu passen und zu spielen ♬
Ich habe ein Anomalieerkennungsmodell erstellt, das unter iOS funktioniert
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, eine Umgebung von MkDocs unter Amazon Linux zu erstellen
Nehmen Sie ein Bild mit Pepper auf und zeigen Sie es auf Ihrem Tablet an
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich versuchte zusammenzufassen, bis ich die Bank verließ und Ingenieur wurde
Ich habe versucht, das Bild durch Klicken mit der rechten und linken Maustaste in den angegebenen Ordner zu verschieben
Ich habe DSX Desktop installiert und ausprobiert
Ich habe eine KI gemacht, um zu beurteilen, ob es Alkohol ist oder nicht!
Ich möchte ein Bild auf Jupyter Notebook mit OpenCV (Mac) anzeigen.
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
Passende Karaoke-Tasten ~ Ich habe versucht, es auf Laravel zu setzen ~ <auf dem Weg>
Ich habe versucht, Sphinx-Dokumente an BitBucket zu senden und sie automatisch auf dem Webserver wiederzugeben
[kotlin] Bilder auf Android sortieren (Pytorch Mobile)
Ich habe versucht, Docker unter Windows 10 Home zu installieren, aber es hat nicht funktioniert
Ich habe das VGG16-Modell mit Keras implementiert und versucht, CIFAR10 zu identifizieren
Erstellt ein Bildunterscheidungsmodell (cifar10) unter Verwendung eines Faltungs-Neuronalen Netzwerks
[Python] Ich habe ein Skript erstellt, das Dateien auf dem lokalen PC automatisch ausschneidet und auf eine externe SSD einfügt.
Ich habe ein Tool erstellt, um Slack über Connpass-Ereignisse zu informieren, und es zu Terraform gemacht
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.
Ich habe versucht, Flask auf Raspberry Pi 3 Model B + mit Nginx und uWSGI auszuführen
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich möchte horizontalen Text in vertikalen Text konvertieren und auf Twitter usw. veröffentlichen.
Ich habe mit Yocto ein Bild für Qemu gemacht, aber ich habe versagt und von vorne angefangen
Ich habe mein Bestes versucht, um eine Optimierungsfunktion zu erstellen, aber es hat nicht funktioniert.
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe DCGAN implementiert und versucht, Äpfel zu generieren
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
[Einführung in PID] Ich habe versucht, ♬ zu steuern und zu spielen
Ich habe ein Docker-Image erstellt, das RSS liest und automatisch regelmäßig twittert, und es veröffentlicht.
[Rails] v1.0 kam auf Google-Cloud-Vision von Gem heraus, also habe ich versucht, es zu unterstützen
Sphinx-Schnellstart wurde zu einem Problem und ich versuchte, einen alternativen Befehl zu erstellen, und der Stress verschwand
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Memo Ein Anfänger hat versucht, eine Java-Umgebung zu erstellen und unter Ubuntu 18.04.2 LTS ins Japanische zu übersetzen.
Ich habe versucht, es einfach zu machen, die Einstellung des authentifizierten Proxys auf Jupyter zu ändern
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Es ist schwierig, einen grünen Bildschirm zu installieren, daher habe ich nur das Gesicht ausgeschnitten und es dem Hintergrundbild überlagert
Ich habe versucht, Faster R-CNN mit Pytorch auszuführen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, CPython ein Post-Inkrement hinzuzufügen. Übersicht und Zusammenfassung
Ich möchte Android-Apps auf Android entwickeln (Debug)