Преобразование CoreMLTools в MLModel: reName_Feature не работает

Проблема: CoreMLTools reName_feature не обновляет имя функции в модели, только в спецификации модели!

Я создал последовательную модель Tensorflow для задачи классификации изображений. Первоначально после преобразования (согласно документации Apple):

# https://coremltools.readme.io/docs/tensorflow-2

mlmodel2 = ct.convert(model, 
                      inputs=[ct.ImageType()],
                      input_names=['image'],
                      image_input_names='image')

создал модель MLModel с входом с именем conv2d

spec = mlmodel.get_spec()
#spec.description.input
ct.utils.rename_feature(spec, 'conv2d_3_input', 'image')

#rename change spec but does not push new spec into model
spec.description.input
input и MultiArray (Float33. 1x299x299x1) и выходом с именем Identity, который также был MultiArray из Float32

К счастью, документ Quickstart находится по адресу: https://coremltools.readme.io/docs/introductory-quickstart#download-the-model выяснено, что исправление для типа ввода требует добавления аргумента формы в ImageType:

# Define the input type as image, 
# set pre-processing parameters to normalize the image 
# to have its values in the interval [0,1] 

image_input = ct.ImageType(shape=(1, 299, 299, 1,))
mlmodel3 = ct.convert(model, 
                      inputs=[image_input],
                      input_names=['image'],
                      image_input_names='image')

Итак, теперь получившаяся MLModel имеет тип ввода Image (Grayscale 299 x 299) (отлично!), Но он по-прежнему называется conv2d

spec = mlmodel.get_spec()
#spec.description.input
ct.utils.rename_feature(spec, 'conv2d_3_input', 'image')

#rename change spec but does not push new spec into model
spec.description.input
input.

Для точек стиля я хочу переименовать входную функцию в изображение. Аргументы имени функции преобразования (см. Выше) не имели никакого эффекта. Затем я попытался напрямую изменить спецификацию модели:

spec = mlmodel.get_spec()
#spec.description.input
ct.utils.rename_feature(spec, 'conv2d_3_input', 'image')

#rename change spec but does not push new spec into model
spec.description.input

Это правильно меняет имя входа в спецификации:

[name: "image"
type {
  imageType {
    width: 299
    height: 299
    colorSpace: GRAYSCALE
  }
}
]

Однако это, по-видимому, не вносит изменений в модель! Вот список для mlmodel:

input {
  name: "conv2d_3_input"
  type {
    imageType {
      width: 299
      height: 299
      colorSpace: GRAYSCALE
    }
  }
}
output {
  name: "Identity"
  shortDescription: "Most likely ....."
  type {
    multiArrayType {
      dataType: FLOAT32
    }
  }
}
metadata {
  shortDescription: "Converts image ........."

Как можно перенести изменение имени функции в настоящую ml-модель?


person BlueskyMed    schedule 21.02.2021    source источник


Ответы (1)


С помощью Aseem из команды coreMLtools вот механизм, позволяющий вернуть обновленную спецификацию protobuf в модель:

spec = mlmodel3.get_spec()
ct.utils.rename_feature(spec, 'conv2d_3_input', 'image')
ct.utils.rename_feature(spec, 'Identity', 'output')


# reload the model with the updated spec and re-save
model = ct.models.MLModel(spec)
model.save("mlModel3.mlmodel")

#observe the correct model

model

Это более подробно рассматривается в выступлении Aseem на WWDC2020: https://developer.apple.com/videos/play/wwdc2020/10153/

person BlueskyMed    schedule 22.02.2021