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