[SWIFT] [Core ML] So konvertieren Sie YOLO v3 in Core ML

Ich habe versucht, YOLO v3 in CoreML zu konvertieren, daher werde ich die Prozedur schreiben.

YOLO v3 ist ein Algorithmus, der Objekte erkennt. Der einfachste Weg, YOLO unter iOS zum Laufen zu bringen, ist das Herunterladen und Verwenden von Apple Official Core ML Models. Diesmal habe ich jedoch versucht, es manuell zu konvertieren.

Original YOLO v3 basiert auf Darknet, aber dieses Mal werde ich das hier in Keras konvertierte verwenden.

qqwweee/keras-yolo3 https://github.com/qqwweee/keras-yolo3

Verfahren

Hier sind die Schritte für Google Colaboratory.

** 1. Installieren und importieren Sie die erforderlichen Bibliotheken **

Notebook


!pip install tensorflow-gpu==1.14.0
!pip install -U coremltools
!pip install keras==2.2.4

** 2. Klone keras-yolo3 **

Löschen Sie es zunächst aus dem Repository.

Notebook


!git clone https://github.com/qqwweee/keras-yolo3

** 3. Versuchen Sie, keras-yolo3 auszuführen **

Lassen Sie uns zuerst keras-yolo3 wie in Python ausführen. Dieser Bereich entspricht dem in README.md auf github beschriebenen Verfahren.

Laden Sie zunächst die Gewichtsinformationsdatei herunter.

Notebook


%cd keras-yolo3
#!wget https://pjreddie.com/media/files/yolov3.weights

In Keras-Version des Yolo-Modells konvertieren.

Notebook


!python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

Ich werde ein entsprechendes Bild hochladen und darauf schließen lassen. Diesmal habe ich eine Datei namens neco.jpg hochgeladen.

! python yolo_video.py --image --input neco.jpg

#Ausgabeergebnis
# (416, 416, 3)
# Found 2 boxes for img
# bed 0.66 (11, 481) (656, 660)
# cat 1.00 (98, 17) (624, 637)
# 6.3229040969999915

Es scheint, dass die Katze richtig erkannt werden kann.

** 4. In CoreML konvertieren **

Konvertieren Sie mit Core ML Tools. Das Eingabebild ist 416 (Breite) x416 (Höhe) x3 (RGB). Setzen Sie außerdem image_scale zur Normalisierung auf 1 / 255.0.

Notebook


from keras.models import load_model
from coremltools.converters import keras as converter
mlmodel = converter.convert(keras_model,
  output_names=['grid1','grid2','grid3'], 
  input_name_shape_dict = {'input1' : [None, 416, 416, 3]},
  image_input_names='input1', 
  image_scale=1/255.0,
)

#Ausgabe
# 0 : input_1, <keras.engine.input_layer.InputLayer object at 0x7f7e4058fa58>
# 1 : conv2d_1, <keras.layers.convolutional.Conv2D object at 0x7f7e41cffb38>
# 2 : batch_normalization_1, <keras.layers.normalization.BatchNormalization object at 0x7f7e41cc6438>
#~ Abkürzung ~
# For large sized arrays, multiarrays of type float32 are more efficient.
# In future, float input/output multiarrays will be produced by default by the converter.
# Please use, either the flag 'use_float_arraytype' during the call to convert or
# the utility 'coremltools.utils.convert_double_to_float_multiarray_type(spec)', post-conversion.

Speichern Sie das konvertierte Core ML-Modell.

Notebook


coreml_model_path = 'yolo.mlmodel'
mlmodel.save(coreml_model_path)

** 5. Überprüfen Sie die Anzeige des Inferenzergebnisses **

Die Konvertierung in CoreML hat funktioniert, aber als ich sie in mein Xcode-Projekt kopierte und versuchte, sie mit dem Vision Framework abzuleiten, schlug sie fehl.

Dies liegt daran, dass es drei Ausgänge von YOLOv3 gibt, die Formen von 1x1x255x13x13, 1x1x255x26x26, 1x1x255x52x52 haben, aber von Vision Framework nicht so interpretiert werden können, wie sie sind. Sie müssen die Ausgabe dekodieren.

Dieser Blog war leicht über die Ausgabe von YOLO v3 zu verstehen. Modellstruktur der allgemeinen Objekterkennung YOLO v3

Das Dekodieren scheint schwierig zu sein, wenn Sie es selbst machen, also werde ich dieses Projekt dieses Mal verwenden.

Ma-Dan/YOLOv3-CoreML https://github.com/Ma-Dan/YOLOv3-CoreML

In diesem Projekt wird davon ausgegangen, dass die CoreML-Ausgabe 255 x 13 x 13, 255 x 26 x 26, 255 x 52 x 52 ist. Sie müssen die Ausgabe in diese Form umformen.

** 6. Form umformen **

Ändern Sie die Ausgabe des Modells wie folgt:

1x1x255x13x13 → 255x13x13 1x1x255x26x26 → 255x13x26 1x1x255x52x52 → 255x13x52

Dazu müssen Sie eine Ebene hinzufügen, um sie mit Core ML Tools neu zu formen. Weitere Informationen zum Bearbeiten von Ebenen in Ihrem Core ML-Modell mit Core ML Tools finden Sie hier.

So bearbeiten Sie eine Ebene mit Core ML Tools https://qiita.com/TokyoYoshida/items/7aa67dcea059a767b4f2

Es ist eine Ebene, die neu geformt werden muss, aber zunächst wird die Dimension reduziert da add_squeeze vorhanden ist Ich habe es versucht (.builder.NeuralNetworkBuilder.add_squeeze), aber aus irgendeinem Grund hat es nicht funktioniert.

Es gab auch add_reshape. Dann blieb die Abmessung des ersten 1x1-Teils nicht reduziert.

Als Ergebnis verschiedener Untersuchungen gibt es add_reshape_static. Damit konnte ich es gut umformen.

Fügen Sie es wie folgt hinzu.

Notebook


from coremltools.models.neural_network import datatypes

builder.add_reshape_static(name='Reshape1', input_name='grid1', output_name='output1', output_shape=(255,13,13))
builder.add_reshape_static(name='Reshape2', input_name='grid2', output_name='output2', output_shape=(255,26,26))
builder.add_reshape_static(name='Reshape3', input_name='grid3', output_name='output3', output_shape=(255,52,52))

Geben Sie dann die Form der Ausgabe für das gesamte Modell an.

Notebook


builder.spec.description.output[0].name = "output1"
builder.spec.description.output[0].type.multiArrayType.shape[0] = 255
builder.spec.description.output[0].type.multiArrayType.shape.append(13)
builder.spec.description.output[0].type.multiArrayType.shape.append(13)

builder.spec.description.output[1].name = "output2"
builder.spec.description.output[1].type.multiArrayType.shape[0] = 255
builder.spec.description.output[1].type.multiArrayType.shape.append(26)
builder.spec.description.output[1].type.multiArrayType.shape.append(26)

builder.spec.description.output[2].name = "output3"
builder.spec.description.output[2].type.multiArrayType.shape[0] = 255
builder.spec.description.output[2].type.multiArrayType.shape.append(52)
builder.spec.description.output[2].type.multiArrayType.shape.append(52)

Speichern Sie schließlich das Modell.

Notebook


mlmodel_modified = coremltools.models.MLModel(spec)
mlmodel_modified.save('Yolov3.mlmodel')

** 7. Anzeige in der App **

Jetzt müssen Sie das Core ML-Modell nur noch per Drag & Drop in das YOLO v3-Core ML-Projekt ziehen und ausführen.

Wenn Sie versuchen, das Modell über Xcode anzuzeigen, können Sie feststellen, dass es korrekt erkannt wird.

Dies ist das Ausführungsergebnis.

Sie können es richtig erkennen.

Schließlich

Hinweis veröffentlicht regelmäßig Informationen zur iOS-Entwicklung. Folgen Sie uns daher. https://note.com/tokyoyoshida

Es wird auch auf Twitter gepostet. https://twitter.com/jugemjugemjugem

Recommended Posts

[Core ML] So konvertieren Sie YOLO v3 in Core ML
So bearbeiten Sie eine Ebene mit Core ML Tools
So konvertieren Sie Java Base
Karte <K, V1> in Karte <K, V2> konvertieren (Kartenwert konvertieren)
So konvertieren Sie erb-Datei in haml
So konvertieren Sie LocalDate und Timestamp
[Core ML] Konvertieren Sie Cycle GAN in Core ML und führen Sie es unter iOS aus
So konvertieren Sie java.util.Date, java.sql.Date, LocalDate, ZonedDateTime
[Ruby] So konvertieren Sie eine CSV-Datei in Yaml (Yml)
[Android] So konvertieren Sie eine Zeichenfolge in resourceId
So installieren Sie Titan 2D (v4.2.0) in einer virtuellen Umgebung
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse
Ruby So konvertieren Sie zwischen Groß- und Kleinschreibung
[Rails] So konvertieren Sie die UC-Zeitanzeige in die japanische Zeitanzeige
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
Wie schreibe ich einen Core Mod in Minecraft Forge 1.15.2
So entwickeln Sie OpenSPIFe
So rufen Sie AmazonSQSAsync auf
Verwendung von Map
Wie schreibe ich Rails
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von fields_for
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
So installieren Sie Docker
Verwendung von MapStruct
Verwendung von TreeSet
So deinstallieren Sie Rails
So installieren Sie Docker-Maschine
[Verwendung des Etiketts]
Wie man ein schattiertes Glas macht
Wie schreibe ich Docker-Compose
Wie man Identität benutzt
Wie man Hash benutzt
Wie schreibe ich Mockito
So erstellen Sie Docker-Compose
So installieren Sie MySQL
So schreiben Sie eine Migrationsdatei
Wie man android-midi-lib baut
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Wie man einen Schrägstrich zurückschlägt \
So verketten Sie Zeichenfolgen
Überlegen Sie, wie Sie MVC in M und V unterteilen können