[PYTHON] [Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden

Einführung

Dies ist Ichi Lab von RHEMS Giken.

Diesmal mit der Objekterkennungs-API von TensorFlow Erkennen Sie das Objekt, das Sie erkennen möchten Ich habe es endlich auf einem Android-Gerät versucht.

Viele hilfreiche Seiten haben mir geholfen, Trotzdem gab es so viele Dinge, die ich nicht mit nur ein oder zwei Seiten lösen konnte.

In diesem Artikel werde ich die Teile aufgreifen, über die ich gestolpert bin, und sie beschreiben. Ich hoffe, dass die Anzahl der Menschen mit ähnlichen Schwierigkeiten so weit wie möglich reduziert wird.

Umgebung

TensorFlow 1.15

  1. MacBook Pro OS : Catalina 10.15 CPU : Intel Core i5 2.3GHz Memory : 8GB 2133MHz

  2. MacBook Pro OS : Catalina 10.15 CPU : Intel Core i7 3.5GHz Memory : 16GB 2133MHz

Ich habe unterwegs aus irgendeinem Grund von 1 auf 2 gewechselt.

Umgebung

Grundsätzlich ist es wie in der folgenden Formel geschrieben.

TensorFlow Object Detection - Installation

Rufen Sie mit dem folgenden Befehl die neueste Quelle der Objekterkennungs-API ab.

$ git clone --depth 1 https://github.com/tensorflow/models.git

Wo PYTHONPATH eingestellt werden soll, wird in pwd erklärt, aber wenn es vollständig beschrieben ist, ist es wie folgt. (Es gibt einige Container, deren Stammverzeichnis "tf" anstelle von "tensorflow" lautet. Überprüfen Sie dies.)

$ export PYTHONPATH=$PYTHONPATH:/tensorflow/models/research:/tensorflow/models/research/slim

Vorsichtsmaßnahmen zum Aufbau einer Umgebung

Wenn Sie Docker verwenden, um es in einem Container auszuführen, gibt es verschiedene Typen, wie auf der offiziellen Seite unten gezeigt. Seien Sie vorsichtig, wenn Sie "neueste" (neueste Version) verwenden.

Tensorflow - Docker

Denn ab November 2019 zum Zeitpunkt des Schreibens ist ** Object Detection API Dies liegt daran, dass TensorFlow 2.0 ** nicht unterstützt wird.

Ebenso ist es bei der Installation mit dem Befehl pip wichtig, die Version von TensorFlow zu überprüfen. Wenn Sie dies überprüfen möchten, können Sie den folgenden Befehl eingeben.

$ pip list | grep tensor
tensorboard                        1.15.0     
tensorflow                         1.15.0rc3  
tensorflow-estimator               1.15.1 

Wenn Sie die Version von 2.0 auf 1.X ändern möchten, führen Sie den folgenden Befehl aus. (In diesem Beispiel auf 1,15 geändert)

$ pip install tensorflow==1.15.0rc3

Übrigens ist der Unterschied zwischen dieser Version ziemlich wichtig, also werde ich es hinzufügen, Der offizielle TensorFlow hat ein Skript vorbereitet, das automatisch konvertiert wird, selbst wenn die Version 2.0 ist. Es wird jedoch als "außer für Beiträge" (ohne Beiträge) beschrieben.

Migrate your TensorFlow 1 code to TensorFlow 2

Wenn Sie die Objekterkennungs-API model_builder_test.py in TensorFlow 2.0 ausführen, Es wird wie folgt fehlschlagen.

AttributeError: module 'tensorflow' has no attribute 'contrib'

Sie stecken mit einem Fehler bei Contrib fest. Dies bedeutet, dass derzeit keine automatischen Konvertierungsskripte verwendet werden können.

Haben Sie model_builder_test.py übrigens sicher ausgeführt und es wurde als OK angezeigt? model_builder_test.py führt im Verzeichnis models / research Folgendes aus:

$ python object_detection/builders/model_builder_test.py

Bei Erfolg wird OK wie unten gezeigt angezeigt. (Weil es lang ist, werden einige Teile weggelassen)

Running tests under Python 3.6.8: /usr/local/bin/python
[ RUN      ] ModelBuilderTest.test_create_faster_rcnn_model_from_config_with_example_miner  
...    

[ RUN      ] ModelBuilderTest.test_unknown_ssd_feature_extractor
[       OK ] ModelBuilderTest.test_unknown_ssd_feature_extractor
----------------------------------------------------------------------
Ran 16 tests in 0.313s

Übrigens, mit Ausnahme von TensorFlow </ b> hatte ich keine Wirkung, auch wenn mir die Version egal war Ich denke, Sie können die neueste installieren. Das ist alles für den Aufbau der Umwelt.

Vorbereitung der Lehrerdaten

Erstellen Sie Lehrerdaten, um die Objekte zu erkennen, die Sie erkennen möchten. Um Lehrerdaten zu erstellen, müssen Sie viele Bilder vorbereiten, die Sie erkennen möchten.

Wenn Sie Schwierigkeiten haben, selbst zu sammeln, gibt es auch ein praktisches Tool namens "google-images-download" Wenn Sie interessiert sind, überprüfen Sie es bitte und verwenden Sie es.

Lassen Sie uns nun die Lehrerdaten erklären. Die Lehrerdaten werden im von TensorFlow empfohlenen TFRecord-Format </ b> erstellt. TFRecord ist eine einfache Form zum Speichern einer Reihe von Binärdatensätzen. Die Daten werden serialisiert (als Array-Daten gespeichert) und können kontinuierlich gelesen werden. Es gibt ungefähr zwei Möglichkeiten, Daten im TFRecord-Format zu erstellen.

  1. Verwenden Sie das Anmerkungswerkzeug
  2. Machen Sie Ihre eigenen aus der Quelle

Anmerkungen sind sogenannte Tagging. Während der Anzeige von Fotos und Videos ist es eine Aufgabe zu lehren, "dieser Teil ist das". Ich habe dafür ein Tool von Microsoft namens VoTT </ b> verwendet. VoTT

Vorsichtsmaßnahmen bei der Verwendung von VoTT

  • Wählen Sie ** Tensorflow-Datensätze ** in den Exporteinstellungen
  • Im Asset-Status auf Nur besuchte Assets außer </ b> setzen
  • Aktives Lernen (wie ein Hut markieren) verschwindet möglicherweise, wenn Sie darauf drücken. Es wird daher nicht empfohlen, es häufig zu verwenden.
  • Wenn Sie eine große Anzahl von Bildern markieren, ist die Verarbeitung sehr umfangreich. In diesem Fall ist es besser, sie in mehrere Bilder zu schneiden.

Wie Sie sehen können, ist es ein Werkzeug, das verschiedene schwierige Punkte zu verwenden hat, aber Dies wird in dieser Hinsicht empfohlen, da der Aufwand für die Konvertierung in das TFRecord-Format entfällt.

Wenn Sie es selbst aus der Quelle machen

Mit der von TensorFlow bereitgestellten Bibliothek kann aus einem Bild eine Datei im TFRecord-Format generiert werden. Mit dem TFRecord, der im folgenden offiziellen Tutorial generiert wurde, Der von VoTT erzeugte TFRecord hatte leicht unterschiedliche Elementnamen und konnte nicht zusammen gemischt und trainiert werden. Verwendung von TFRecords und tf.Example

Dieses Dokument wird nützlicher sein. using_your_own_dataset.md

Die Geschichte hier wird lang sein, deshalb habe ich sie in einem anderen Artikel zusammengefasst. Schauen Sie also bitte nach, wenn Sie möchten. Hinweise zum Erstellen von TFRecord-Dateien zur Objekterkennung

Lernen

Die Erklärung hier basiert auf der Annahme, dass alle Verzeichnisse auf "Modellen / Forschung" basieren.

Sobald Sie die Datei im TFRecord-Format bereit haben, können Sie mit dem Lernen beginnen. Hier lernen wir Ihr eigenes Original basierend auf dem vorhandenen Lernmodell "Transferlernen". Wir werden mit der Methode zur Erstellung eines individuelleren Lernmodells fortfahren. Beim Transferlernen werden Gewichte verwendet, die im Voraus aus umfangreichen Daten gelernt wurden. Es wird erwartet, dass auch mit einer kleinen Menge von Trainingsdaten eine ausreichende Leistung erzielt werden kann.

Lernmodell herunterladen

Laden Sie zunächst das trainierte Modell für das Transferlernen herunter. Dieses Mal konnte ich es nicht in anderen japanischen Artikeln finden. Fahren wir mit dem neuen "MobileNet v3" fort.

Das trainierte Modell kann von der folgenden Seite heruntergeladen werden. Tensorflow detection model zoo
Laden Sie in diesem Fall den Namen "ssd_mobilenet_v3_large_coco" herunter. Bitte beachten Sie, dass dieses Modell nur mit den neuesten Quellen funktioniert, die Mitte Oktober 2019 aktualisiert wurden.

Platzieren Sie das heruntergeladene Modell im Verzeichnis object_detection. Wenn Sie es mit einem Befehl ausführen möchten, gehen Sie wie folgt vor:

$ wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v3_large_coco_2019_08_14.tar.gz  
$ tar zxvf ssd_mobilenet_v3_large_coco_2019_08_14.tar.gz

Struktur der Modelldatei lernen

Die Dateistruktur des Trainingsmodells ist grundsätzlich wie folgt.

  • checkpoint
  • frozen_inference_graph.pb
  • model.ckpt.data-00000-of-00001
  • model.ckpt.index
  • model.ckpt.meta
  • pipeline.config
  • saved_model /
    • saved_model.pb
    • variables /

Bearbeiten Sie zu Beginn des Übertragungslernens den Inhalt der Datei "pipeline.config" und verwenden Sie sie.

Verzeichnisstruktur und Dateiname für Schulung und Auswertung

Dieser Abschnitt beschreibt das vorbereitete TFRecord-Dateiverzeichnis. Die TFRecord-Datei enthält separate Verzeichnisse für die Schulung (Lehrer) und die Überprüfung. Im Allgemeinen beträgt das Verhältnis Training: Validierung 8: 2, dh 80% der Daten sind für Training und die restlichen 20% für Validierung. (Aus dem Buch "Praktisches maschinelles Lernen mit Scicit-Learn und TensorFlow" P30) Natürlich ist es möglich zu lernen, auch wenn Sie es nicht richtig teilen. Unten ist die Verzeichnisstruktur. (Zug steht für Training, val steht für Validierung)

  • test0001 / --label_map (.pbtxt) Beschriftungsdatei
    • train / --TFRecord-Datei (.tfrecord) Trainingsdatei
    • val / --TFRecord-Datei (.tfrecord) Überprüfungsdatei
    • save /
  • Ein Verzeichnis zum Speichern der gelernten Daten (zuerst leer)

Die TFRecord-Dateinamen sollten mit Seriennummern anstelle von separaten Nummern vereinheitlicht werden. Zum Beispiel nennen wir es hier wie folgt.

  • hoge0000.tfrecord
  • hoge0001.tfrecord
  • hoge0002.tfrecord
  • ... (und so weiter)

Wie die Datei hier benannt wird, hängt mit der Einstellung der folgenden Konfigurationsdatei zusammen.

Konfigurationsdatei bearbeiten

Öffnen Sie Pipeline.config in dem trainierten Modell, das Sie zuvor heruntergeladen haben. Hier können Sie verschiedene Parameter wie Stapelgröße, Gewichtung und Bilderweiterung anpassen. Wir werden jedoch die Elemente erläutern, die Sie häufig bearbeiten. (Auszug aus der aktuellen Konfiguration zur Erklärung)

pipeline.config


model {
    ssd {
        num_classes: 1

num_classes : Dies ist eine Einstellung der zu klassifizierenden Nummer. Es wird relativ oben in der Konfigurationsdatei geschrieben.

pipeline.config


train_config: {
    batch_size: 32
    num_steps: 10000
    optimizer {
        momentum_optimizer: {
            learning_rate: {
                cosine_decay_learning_rate {
                    total_steps: 10000
                    warmup_steps: 10000
    fine_tune_checkpoint: "./object_detection/ssd_mobilenet_v3_large_coco/model.ckpt"
}

batch_size : Bei Verwendung der probabilistischen Gradientenabstiegsmethode, um die Auswirkung von Ausreißern zu verringern Trainieren Sie den Datensatz in mehreren Teilmengen. Die Anzahl der in jeder Teilmenge enthaltenen Daten wird als Stapelgröße bezeichnet. Dieser Wert ist oft der Wert von 2 nach der n-ten Potenz, wie es im Bereich des maschinellen Lernens üblich ist. Und je größer dieser Wert ist, desto mehr Last wird während des Lernens aufgebracht, und je nach Umgebung kann der Prozess absterben und nicht lernen.

num_steps : Die Anzahl der zu lernenden Schritte. Die Anzahl der Schritte kann auch im Befehl beim Ausführen des Lernens angegeben werden. Soweit ich es versucht habe, hat die Befehlsspezifikation Vorrang.

total_steps und warmup_steps: Ich untersuche, weil es sich um ein Element handelt, das nicht in der Konfiguration anderer Modelle enthalten war. total_steps muss größer oder gleich warmup_steps sein. (Wenn diese Bedingung nicht erfüllt ist, tritt ein Fehler auf und das Lernen beginnt nicht.)

fine_tune_checkpoint : Gibt ein Modell für das Transferlernen an. Es ist in Ordnung, wenn Sie das Verzeichnis mit dem heruntergeladenen Lernmodell bis "~ .ckpt" schreiben. Dieser Artikel war nicht enthalten, als ssd_mobilenet_v3 heruntergeladen wurde. Deshalb habe ich es selbst hinzugefügt. Die meisten Modelle haben diesen Artikel bereits. Diese Zeile ist nicht erforderlich, wenn Sie kein Transferlernen durchführen.

pipeline.config


train_input_reader: {
    tf_record_input_reader {
        input_path: "./object_detection/test0001/train/hoge????.tfrecord"
    }
    label_map_path: "./object_detection/test0001/tf_label_map.pbtxt"
}
eval_input_reader: {
    tf_record_input_reader {
        input_path: "./object_detection/test0001/val/hoge????.tfrecord"
    }
    label_map_path: "./object_detection/test0001/tf_label_map.pbtxt"
}

input_path : Geben Sie das Verzeichnis der vorbereiteten TFRecord-Dateien für die Schulung und Überprüfung an. In diesem Fall haben wir es beispielsweise mit der Seriennummer "hoge0000.tfrecord" benannt. Schreiben Sie es also als "hoge ????. Tfrecord".

label_map_path : Geben Sie das vorbereitete Etikett an. Es gibt kein Problem mit der gleichen Spezifikation für Zug und Auswertung.

Fang an zu lernen

Nach dem Schreiben der Konfigurationsdatei ist es Zeit, mit dem Lernen zu beginnen. Verwenden Sie für das Training eine Datei mit dem Namen "model_main.py" im Verzeichnis "object_detection". Eine Beschreibung der Laufzeitargumente.

  • --model_dir: Geben Sie das Speicherziel der Trainingsdaten an. Während des Lernens wird im angegebenen Verzeichnis eine Datei mit dem Namen ".ckpt ~" erstellt.

  • --pipeline_config_path: Geben Sie die zu verwendende Konfigurationsdatei an. Geben Sie die Konfigurationsdatei an, die Sie zuvor bearbeitet haben.

  • --num_train_steps: Geben Sie die Anzahl der Lernvorgänge an. Diese Option wird nicht benötigt, wenn Sie die in config angegebene Nummer implementieren möchten. Wenn Sie anders als config trainieren möchten, hat die hier angegebene Anzahl Vorrang. (Ergebnis des tatsächlichen Versuchs)

Das Folgende ist ein Ausführungsbeispiel.

$ python object_detection/model_main.py \
--pipeline_config_path="object_detection/ssd_mobilenet_v3_large_coco/pipeline.config" \
--model_dir="./object_detection/test0001/save" \
--alsologtostderr

Da es viele Optionen gibt und die Eingabe jedes Mal schwierig ist, ist die Ausführung einfacher, wenn Sie ein Shell-Skript erstellen.

#! /bin/bash

PIPELINE_CONFIG_PATH="./object_detection/ssd_mobilenet_v3_large_coco.config"
MODEL_DIR="./object_detection/test0001/save"
NUM_TRAIN_STEPS=10000

cd '/tensorflow/models/research'

python object_detection/model_main.py \
    --pipeline_config_path=$PIPELINE_CONFIG_PATH \
    --model_dir=$MODEL_DIR \
#    --num_train_steps=$NUM_TRAIN_STEPS \
    --alsologtostderr

"Oh, ich kann die Shell, die ich gemacht habe, nicht laufen lassen ...?" Haben Sie vergessen, Ihre Berechtigungen zu ändern?

$ chmod 775 hoge.sh

Wenn Sie anfangen zu lernen, aber der Prozess in der Mitte stirbt

Wenn Sie glauben, dass das Lernen begonnen hat, kann dies wie folgt geschehen.

~ session_manager.py:500] Running local_init_op.
~ session_manager.py:502] Done running local_init_op.
~  basic_session_run_hooks.py:606] Saving checkpoints for 0 into {Prüfpunkt speichern Das angegebene Verzeichnis/Dateiname}.ckpt
Killed

Es gibt mehrere Gründe, warum der Prozess stirbt. In beiden Fällen ist es sehr wahrscheinlich, dass der Betriebsumgebung die Ressourcen ausgehen.

Hier werde ich die Mittel vorstellen, die ich gelöst habe, als ich dieses Phänomen erlebt habe.

~ Lösung Nr. 1. Versuchen Sie, die Docker Engine-Einstellungen ~ zu ändern

Dies ist eine Methode, die nützlich sein kann, wenn Sie sie in einem Docker-Container ausführen. Öffnen Sie zuerst die Einstellungen. Wählen Sie Einstellungen → Registerkarte Erweitert </ b>, um die Ressourcen zu erhöhen.

~ Lösung Nr. 2. Versuchen Sie, die Chargengröße ~ zu reduzieren

Dies wird durch Festlegen der Pipeline.config behoben.

Welche Art von Parameterkombination beendet den Prozess? Ich denke, es hängt von der Betriebsumgebung und der Menge und Größe der verwendeten Lehrerdaten ab. Zuallererst kann es gelöst werden, indem der Chargengrößenwert reduziert wird Wenn Sie sich hier Sorgen machen, probieren Sie es aus.

Bestätigung der Trainingsdaten

Die Trainingsdaten werden jederzeit in dem Speicherverzeichnis gespeichert, das bei der Ausführung von model_main.py angegeben wird. Die Daten werden zu dem Zeitpunkt gespeichert, zu dem "Speichern" angezeigt wird, wie unten gezeigt, während des Lernens. In dieser Phase können Sie die Situation während des Lernens mit dem unten beschriebenen "Tensorboard" visualisieren.

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 500: object_detection/test0001/save/model.ckpt-500
I1012 08:29:56.544728 139877141301056 estimator.py:2109] Saving 'checkpoint_path' summary for global step 500: object_detection/test0001/save/model.ckpt-500

Tensorboard ~ Visualisierung lernen ~

Die Visualisierung von Trainingsdaten ist unerlässlich und Tensorboard ist dabei sehr hilfreich.

Starten Sie Tensorboard

Sie können Tensorboard mit dem folgenden Befehl starten.

$ tensorboard --logdir=object_detection/test0001/save
  • --logdir : ** Geben Sie hier das Verzeichnis an, in dem Sie die Trainingsdaten speichern möchten, die Sie zu Beginn des Lernens angegeben haben. Wenn Sie das Speicherziel der in der Vergangenheit durchgeführten Lernergebnisse angeben, können Sie es auch nach Abschluss des Lernens erneut anzeigen.

Um Tensorboard in Ihrem Webbrowser anzuzeigen, gehen Sie zu Ihrem lokalen Host. Standardmäßig lautet die Portnummer 6006.

http://localhost:6006/

Wenn Sie in einer Docker-Containerumgebung ausgeführt werden, stellen Sie sicher, dass Sie Zugriff auf -p 6006: 6006 haben, wenn Sie Docker Run ausführen. Ich habe die Porteinstellungen in docker-compose.yml aufgelistet.

Wie man Tensorboard liest

Selbst wenn Sie Ihr Lernen visualisieren können, ist es schmerzhaft, wenn Sie nicht verstehen, wie Sie es betrachten sollen. Ich habe den Inhalt meiner Forschung zusammengefasst, also hoffe ich, dass Sie darauf verweisen können. GRAPHS Das Diagramm wird automatisch aus der Verarbeitung des Quellcodes generiert.

Artikel Erläuterung
Run Sie können das Unterverzeichnis wechseln, in dem sich das Protokoll befindet
Upload Laden Sie die Tensorflow-Modelldatei hoch
Trace inputs Von Knotenabhängigkeiten verfolgt werden
Color Wählen Sie eine Farbcodierungsmethode
- Structure :Modellkonfiguration (Netzwerkkonfiguration)
- Device :Verarbeitetes Gerät (CPU vs GPU)
- Compute time :Verarbeitungszeit
- Memory :Speichernutzung
- TPU Compatibility :Auf Tensor-Verarbeitungseinheit laufen lassen

SCALARS

Artikel Erläuterung
Show data download links Zeigen Sie einen Link an, über den Sie das Diagramm speichern können. Sie können das CSV- oder JSON-Format auswählen.
ignore outliners in chart scaling Gibt an, ob das Diagramm skaliert werden soll, um Ausreißer zu vermeiden (überprüfen Sie dies, um dies zu vermeiden).
Tooltip sorting method Werkzeugchip-Bestellung
- default :Alphabetischer Reihenfolge
- descending :In absteigender Reihenfolge des Wertes
- ascending :In aufsteigender Reihenfolge des Wertes
- nearest :Nah am Mauszeiger
Smoothing Glättung von Graphen
Horizontal Axis Angeben der horizontalen Achse (X-Achse) des gestrichelten Liniendiagramms
- STEP :Schritt (Anzahl der Ausführungen)
- RELATIVE :Ausführungszeit (Unterschied zum ersten Mal)
- WALL :Tageszeiten
- Runs :Grafik ein- / ausblenden

Referenz: Visualisierung des Lernens mit TensorBoard Als nächstes werde ich jedes der Hauptdiagramme erklären. Vorher werde ich eine Beschreibung der Wörter geben, die Sie zur Erklärung kennen müssen.

  • IOU :
    IOU ist eine Abkürzung für Intersection (gemeinsamer Teil von Regionen) über Union (Summe von Regionen) und ein Index, der angibt, "wie stark sich die beiden Regionen überlappen". Je näher dieser Wert an 1 liegt, desto besser stimmen die richtige Antwort und die Inferenz überein.
  • Recall :
    Erinnern. Prozentsatz dessen, was Sie finden sollten, den Sie richtig finden konnten. Auch Empfindlichkeit genannt.

Referenz: Bedeutung der IoU (Bewertungsindex) und Strenge des Werts Referenz: [Für Anfänger] Erläuterung der Bewertungsindizes für Klassifizierungsprobleme beim maschinellen Lernen (korrekte Antwortrate, Präzisionsrate, Rückrufrate usw.)

Das Folgende ist ein Auszug mit Bezug auf die Erläuterung der in object_detection /metrics / coco_tools.py beschriebenen Elemente.

Artikel Erläuterung
Precision/mAP Die durchschnittliche Genauigkeit der Klasse, die die IOU-Schwellenwerte im Bereich von 5 bis 95 in 5 Schritten gemittelt hat.
Precision/[email protected] Durchschnittliche Genauigkeit von 50% IOU
Precision/[email protected] Durchschnittliche Genauigkeit von 75% IOU
Precision/mAP (small) Durchschnittliche Genauigkeit kleiner Objekte (weniger als 32 x 32 px)
Precision/mAP (medium) Durchschnittliche Genauigkeit mittelgroßer Objekte(32×32 px〜96×96 px)
Precision/mAP (large) Durchschnittliche Genauigkeit großer Objekte(96×96 px〜10000×10000 px)
Recall/AR@1 Prozentsatz der Durchschnittswerte, die in einer einzelnen Erkennung korrekt gefunden wurden
Recall/AR@10 Prozentsatz der Durchschnittswerte, die in 10 Erkennungen korrekt gefunden wurden
Recall/AR@100 Prozentsatz der Durchschnittswerte, die bei 100 Erkennungen korrekt gefunden wurden
Recall/AR@100 (small) Durchschnittlicher Rückruf kleiner Objekte, die 100 Mal erkannt wurden
Recall/AR@100 (medium) Durchschnittlicher Rückruf von 100-mal erkannten mittleren Objekten

IMAGES

Bilddaten anzeigen. Sie können den Unterschied zwischen der richtigen Antwort der Überprüfungsdaten und dem Inferenzergebnis in Einheiten der .ckpt-Datei (Prüfpunkt) überprüfen.

Konvertierung in Inferenzdiagramm

Wenn das Training beendet ist, ist es endlich Zeit, die Daten in ein Inferenzdiagramm umzuwandeln. Insbesondere wird die durch Lernen erstellte .ckpt-Datei in eine .pb-Datei konvertiert.

Es gibt mehrere Quellen für die Konvertierung im Verzeichnis "object_detection".

  • export_inference_graph.py
  • export_tflite_ssd_graph.py

** Um es auf Android zu testen, wird es in das ** .tflite-Format konvertiert, also ** verwenden Sie das letztere **.

Für export_inference_graph.py

Eine Beschreibung der Laufzeitargumente.

  • --input_type : Geben Sie für das Inferenzdiagramm je nach Benutzer eine der folgenden drei an

    • image_tensor :
      4D-Tensor [Keine, Keine, Keine, 3] Normalerweise sollten Sie dies angeben.
  • encoded_image_string_tensor: 1D-Tensor [Keine] Enthält codierte PNG- oder JPEG-Bilder. Wenn mehrere Bilder bereitgestellt werden, wird davon ausgegangen, dass die Bildauflösungen gleich sind.

  • tf_example: 1-dimensionaler Stringtensor [Keine] Wenn mehrere Bilder bereitgestellt werden, einschließlich serialisierter TF-Beispielprotokolle, wird davon ausgegangen, dass die Bildauflösungen gleich sind.

  • --pipeline_config_path : Geben Sie die Konfigurationsdatei an, die während des Trainings verwendet wird.

  • --trained_checkpoint_prefix : Geben Sie die Datei "model.ckpt-XXXX" an, die als Speicherziel für die Trainingsdaten erstellt wurde. Geben Sie für XXXX die letzte (größte) Anzahl der durchgeführten Lernschritte an. Wenn es beispielsweise 10000 Mal ausgeführt wird, lautet es "model.ckpt-10000".

  • --output_directory : Geben Sie das Verzeichnis an, das Sie exportieren möchten. Im angegebenen Verzeichnis wird eine Datei mit genau der gleichen Struktur wie die Dateistruktur des ersten heruntergeladenen Modells erstellt.

Das Folgende ist ein Ausführungsbeispiel.

$ python object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path object_detection/ssd_mobilenet_v3_large_coco/pipeline.config \
--trained_checkpoint_prefix object_detection/test0001/save/model.ckpt-10000 \
--output_directory object_detection/test0001/output

Für export_tflite_ssd_graph.py

Ein Programm, das ein trainiertes Modell in ein .tflite-kompatibles Modell konvertiert. Die Argumente sind im Grunde die gleichen wie "export_inference_graph.py". (Es gibt keinen --input_type)

Das Folgende ist ein Ausführungsbeispiel.

$ python object_detection/export_tflite_ssd_graph.py \
--pipeline_config_path=object_detection/ssd_mobilenet_v3_large_coco/pipeline.config \
--trained_checkpoint_prefix=object_detection/test0001/save/model.ckpt-10000 \
--output_directory=object_detection/test0001/tflite \
--add_postprocessing_op=true

Zwei Dateien, "tflite_graph.pb" und "tflite_graph.pbtxt", werden in dem durch "--output_directory" angegebenen Verzeichnis erstellt.

In das TensorFlow Lite-Format konvertieren

Verwenden Sie tflite_convert, um in das tflite-Format zu konvertieren. Dieser Konverter sollte von Anfang an enthalten sein.

Wenn Sie "tflite_convert --help" eingeben, wird die Verwendung beendet. Da es viele Optionen zum Hinzufügen gibt, habe ich es wie folgt in einem Shell-Skript zusammengefasst. Ändern Sie das Verzeichnis nach Ihren Wünschen. Außerdem erkenne ich, dass --input_shapes wahrscheinlich ein Wert ist, der zum Zeitpunkt des Lernens mit dem image_resizer der Konfiguration übereinstimmt, aber es gibt keine Bestätigung ... Die Bedeutungen der Zahlen sind (Stapelgröße, Eingabebildhöhe, Eingabebildbreite, Eingabebildtiefe (RGB-Kanal)).

Converter command line reference

#! /bin/bash

OUTPUT_FILE="object_detection/test0001/tflite/test.tflite"
GRAPH_DEF_FILE="object_detection/test0001/tflite/tflite_graph.pb"
INTERFACE_TYPE="FLOAT"
INPUT_ARRAY="normalized_input_image_tensor"
OUTPUT_ARRAYS="TFLite_Detection_PostProcess,TFLite_Detection_PostProcess:1,TFLite_Detection_PostProcess:2,TFLite_Detection_PostProcess:3"
INPUT_SHAPES="1,300,300,3"

cd '/tensorflow/models/research'

tflite_convert \
    --output_file=$OUTPUT_FILE \
    --graph_def_file=$GRAPH_DEF_FILE \
    --inference_type=$INTERFACE_TYPE \
    --input_arrays=$INPUT_ARRAY \
    --input_shapes=$INPUT_SHAPES \
    --output_arrays=$OUTPUT_ARRAYS \
    --default_ranges_min=0 \
    --default_ranges_max=6 \
    --mean_values=128 \
    --std_dev_values=127 \
    --allow_custom_ops

Außerdem habe ich mehrere Anweisungen zum Installieren von "bazel" und "toco" auf anderen Websites gefunden, die jedoch nur mit dieser Befehlszeile ohne diese möglich waren. (Ich habe versucht, diese Methoden genau zu sein, aber das Ergebnis war das gleiche)

Wenn zu diesem Zeitpunkt die Version von TensorFlow ** 1.12.0rc0 ist, ist dies fehlgeschlagen **, Mit ** 1.15.0rc3 ** funktionierte genau der gleiche Befehl **.

Darüber hinaus wurde in der offiziellen Beschreibung die Python-API empfohlen. Converter command line reference

Führen Sie es tatsächlich auf Android aus

Es ist lange her, aber es ist endlich in Produktion.

Installieren Sie Android Studio

Installieren wir zunächst "Android Studio". Wenn Sie andere Tools einfacher zu verwenden finden, können Sie sie verwenden.

Beispiel vom offiziellen herunterladen

Laden Sie als Nächstes die Beispielsammlung vom Beamten herunter.

$ git clone --depth 1 https://github.com/tensorflow/examples.git

Probenänderung

Öffnen Sie nach dem Start von Android Studio examples / lite / examples / object_detection / android.

Legen Sie Ihre eigene tflite-Datei ab

Platzieren Sie Ihre test.tflite und labelmap.txt im Verzeichnis examples / lite / examples / object_detection / android / app / src / main / assets. labelmap.txt ist eine Textdatei, in der die von Ihnen getaggten Tag-Namen aufgelistet sind.

Wenn Sie beispielsweise zwei Arten von Tag-Namen vorbereiten, "apple" und "orange", lautet die Textdatei wie folgt.

labelmap.txt


???
apple
orange

Wichtig ist, dass die erste Zeile "???" lautet.

Bearbeiten von DetectorActivity.java

Es ist lang, aber bearbeiten Sie "DetectorActivity.java" im Verzeichnis "examples / lite / examples / object_detection / android / app / src / main / java / org / tensorflow / lite / examples / Detection /".

DetectorActivity.java


private static final boolean TF_OD_API_IS_QUANTIZED = false; //true->false
private static final String TF_OD_API_MODEL_FILE = "test.tflite"; //detect.tflite -> my tflite
private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/labelmap.txt"; //my txt

Bearbeiten Sie dann "build.gradle" im Verzeichnis "examples / lite / examples / object_detection / android / app /".

Kommentieren Sie Folgendes in Zeile 40 aus: (Wenn Sie hier keinen Kommentar abgeben, werden diese beim Erstellen durch die Standard-Beispieldaten ersetzt.)

build.gradle


apply from:'download_model.gradle' //Auskommentieren

Bauen

Sobald Sie dies getan haben, müssen Sie es nur noch erstellen, auf Ihrem Gerät ausführen und sehen! Herzlichen Glückwunsch, wenn Sie es gut versuchen können.

Unten finden Sie eine Referenzseite für Android

Training and serving a realtime mobile object detector in 30 minutes with Cloud TPUs How to Train Your Own Custom Model with Tensorflow Object Detection API and Deploy It into Android with TF Lite Detecting Pikachu on Android using Tensorflow Object Detection

abschließend

Was haben Sie gedacht? Es sieht aus wie eine Übersichtsseite auf einer anderen Seite, aber Zumindest denke ich, dass wir einige Informationen behandelt haben, die wir möglicherweise benötigen, um die Objekterkennungs-API von TensorFlow zu verwenden.

Insbesondere hat TensorFlow je nach Version ein unterschiedliches Detailverhalten. Da die Versionen der verschiedenen Referenzseiten, die zu dieser Zeit verwendet wurden, unterschiedlich sind, denke ich, dass viele Menschen die gleichen Schwierigkeiten hatten.

Es gibt noch viele Teile, die ich nicht verstehe, aber ich hoffe, es hilft. Vielen Dank für das Lesen des langen Artikels.

Recommended Posts