Вход 'input_image' слоя '63' не найден ни в одном из выходных данных предыдущих слоев

Обновление №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 динамичными? Или мне следует сохранить две версии модели 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 х 480.

Как указано ниже, модель должна принимать любое изображение размером 64x64 и выше.

Для моделей гибких форм нужно ли вводить данные в xcode по-другому?


Исходный вопрос (части по-прежнему актуальны)

Я медленно работал над преобразованием модели переноса стилей из pytorch > onnx > coreml. Одна из проблем, с которой боролись, - это гибкая / динамическая форма ввода + вывода.

Этот метод (помимо переименования ввода-вывода) хорошо работал в iOS 12 и 13 при использовании статической формы ввода.

Я использую следующий код для выполнения 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.

Вот как выглядит проблемная зона в 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 HW 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")

0 ответов

Другие вопросы по тегам