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.
--go colaboratory (Laufzeit: GPU) (TensorFlow 1.15) (Google Chrome)
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
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