Обновление # 1 (оригинальный вопрос и подробности ниже) :
В соответствии с предложением @MatthijsHollemans, приведенным ниже, я попытался запустить его, удалив dynamic_axes
из исходного create_onnx
шаг ниже. Это удалило оба:
Description of image feature 'input_image' has missing or non-positive width 0.
и
Input 'input_image' of layer '63' not found in any of the outputs of the preceeding layers.
К сожалению, это открывает два подвопроса:
Я все еще хочу получить функциональная модель ONNX. Есть ли более подходящий способ сделать H и W динамическими c? Или я должен сохранить две версии модели ONNX, одну без dynamic_axes
для преобразования CoreML, а другую - для использования в качестве допустимой модели ONNX?
Хотя это решает компиляцию ошибка в xcode (указана ниже) приводит к следующим проблемам во время выполнения:
Finalizing CVPixelBuffer 0x282f4c5a0 while lock count is 1.
[espresso] [Espresso::handle_ex_plan] exception=Invalid X-dimension 1/480 status=-7
[coreml] Error binding image input buffer input_image: -7
[coreml] Failure in bindInputsAndOutputs.
Я называю это так же, как я вызывал модель фиксированного размера, которая все еще работает нормально. Размеры изображения составляют 640 x 480.
Как указано ниже, модель должна принимать любое изображение размером от 64x64 и выше.
Для моделей с гибкой формой нужно ли вводить данные по-другому в xcode?
Оригинальный вопрос (части все еще актуальны)
Я медленно работаю над преобразованием модели передачи стиля из pytorch > onnx > coreml
. Одной из проблем, с которой пришлось столкнуться, является гибкая / динамическая c форма ввода-вывода.
Этот метод (кроме переименования ввода / вывода) хорошо работал на iOS 12 и 13 при использовании формы ввода stati c.
Я использую следующий код для преобразования onnx > coreml
:
def create_coreml(name):
mlmodel = convert(
model="onnx/" + name + ".onnx",
preprocessing_args={'is_bgr': True},
deprocessing_args={'is_bgr': True},
image_input_names=['input_image'],
image_output_names=['stylized_image'],
minimum_ios_deployment_target='13'
)
spec = mlmodel.get_spec()
img_size_ranges = flexible_shape_utils.NeuralNetworkImageSizeRange()
img_size_ranges.add_height_range((64, -1))
img_size_ranges.add_width_range((64, -1))
flexible_shape_utils.update_image_size_range(
spec,
feature_name='input_image',
size_range=img_size_ranges)
flexible_shape_utils.update_image_size_range(
spec,
feature_name='stylized_image',
size_range=img_size_ranges)
mlmodel = coremltools.models.MLModel(spec)
mlmodel.save("mlmodel/" + name + ".mlmodel")
Несмотря на то, что преобразование выполнено успешно, есть несколько предупреждений (для удобства чтения добавлены пробелы):
Translation to CoreML spec completed. Now compiling the CoreML model.
/usr/local/lib/python3.7/site-packages/coremltools/models/model.py:111:
RuntimeWarning: You will not be able to run predict() on this Core ML model. Underlying exception message was:
Error compiling model:
"Error reading protobuf spec. validator error: Description of image feature 'input_image' has missing or non-positive width 0.".
RuntimeWarning)
Model Compilation done.
/usr/local/lib/python3.7/site-packages/coremltools/models/model.py:111:
RuntimeWarning: You will not be able to run predict() on this Core ML model. Underlying exception message was:
Error compiling model:
"compiler error: Input 'input_image' of layer '63' not found in any of the outputs of the preceeding layers.
".
RuntimeWarning)
Если я игнорирую эти предупреждения и пытаюсь скомпилировать модель для последних целей (13.0), я получаю следующую ошибку в xcode:
coremlc: Error: compiler error: Input 'input_image' of layer '63' not found in any of the outputs of the preceeding layers.
Вот что проблемная область c в netron выглядит так:
Мой главный вопрос: как я могу получить эти два предупреждения из кстати?
Рады сообщить любые другие детали.
Спасибо за любой совет!
Ниже мое преобразование pytorch > onnx
:
def create_onnx(name):
prior = torch.load("pth/" + name + ".pth")
model = transformer.TransformerNetwork()
model.load_state_dict(prior)
dummy_input = torch.zeros(1, 3, 64, 64) # I wasn't sure what I would set the H W to here?
torch.onnx.export(model, dummy_input, "onnx/" + name + ".onnx",
verbose=True,
opset_version=10,
input_names=["input_image"], # These are being renamed from garbled originals.
output_names=["stylized_image"], # ^
dynamic_axes={'input_image':
{2: 'height', 3: 'width'},
'stylized_image':
{2: 'height', 3: 'width'}}
)
onnx.save_model(original_model, "onnx/" + name + ".onnx")