Ввод 'input_image' слоя '63' не найден ни в одном из выходов предыдущих слоев - PullRequest
0 голосов
/ 15 апреля 2020

Обновление # 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 выглядит так:

enter image description here


Мой главный вопрос: как я могу получить эти два предупреждения из кстати?

Рады сообщить любые другие детали.

Спасибо за любой совет!


Ниже мое преобразование 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...