Вход '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")