Неожиданный вывод модели при запуске модели Onnx в Unity с использованием Barracuda

Контекст

Я пытаюсь использовать предварительно обученную модель в формате ONNX для вывода данных изображения в Unity. Модель связана с исполняемым компонентом в Unity как актив под названием modelAsset. Я использую для этого Barracuda версии 1.0.0 и выполняю модель следующим образом:

// Initialisation        
this.model = ModelLoader.Load(this.modelAsset);
this.worker = WorkerFactory.CreateWorker(WorkerFactory.Type.CSharpBurst, model);

// Loop
Tensor tensor = new Tensor(1, IMAGE_H, IMAGE_W, 3, data);        
worker.Execute(tensor);
Tensor modelOutput = worker.PeekOutput(OUTPUT_NAME);

Данные, входящие во входной тензор (из которых модель имеет только 1), представляют собой данные изображения h * w с 3 каналами для значений RGB от -0,5 до 0,5. Модель имеет несколько выходов, которые я получил в последней строке, показанной выше.

Ожидаемое поведение

Используя одни и те же входные данные, модель PyTorch и преобразованная модель ONNX создают те же выходные данные в Python (ONNXRuntime и PyTorch), что и в Barracuda в Unity.

Проблема

В python модели ONNX и PyTorch производят одинаковый результат. Однако та же модель ONNX, работающая в Barracuda, дает другой результат. Разница в основном заключается в том, что мы ожидаем тепловую карту, но Barracuda последовательно выдает значения где-то между 0,001 и -0,0004 в следующих шаблонах:  Шаблоны данных, вывод Barracuda

Это создает впечатление, будто веса модели не загружены должным образом.

Что мы нашли

При преобразовании в ONNX в соответствии с руководством Barracuda мы обнаружили, что если мы не установили модель в режим вывода в сети PyTorch перед преобразованием (ссылка), эти же неверные результаты были получены с помощью ONNXRuntime в Python. Другими словами, похоже, что этот режим вывода сохранен в модели ONNX и распознается ONNXRuntime в Python, но не в Barracuda.

Наш вопрос

В основном:

  • Как сделать так, чтобы эта модель в Barracuda в Unity давала те же результаты, что и ONNXRuntime / PyTorch в Python?

И потенциально:

  • Как режим вывода встроен в файл ONNX и как он используется в ONNXRuntime vs Barracuda?

person Rens van der Veldt    schedule 02.07.2020    source источник


Ответы (1)


Так и оказалось, что проблем было 2. Во-первых, входные данные были организованы в соответствии с размерами модели ONNX, однако Barracuda ожидает данных, ориентированных по-разному. Собственный макет данных ONNX - NCHW или каналы. Barracuda автоматически преобразует модели ONNX в макет NHWC. Таким образом, наши данные были объединены в массив, аналогичный реализации Python, которая создала первое несоответствие.

Во-вторых, ось Y входного изображения была перевернута, что сделало модель неспособной распознавать людей.

После исправления этих проблем реализация работает нормально!

person Rens van der Veldt    schedule 06.07.2020