Контекст
Я пытаюсь использовать предварительно обученную модель в формате 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 в следующих шаблонах:
Это создает впечатление, будто веса модели не загружены должным образом.
Что мы нашли
При преобразовании в ONNX в соответствии с руководством Barracuda мы обнаружили, что если мы не установили модель в режим вывода в сети PyTorch перед преобразованием (ссылка), эти же неверные результаты были получены с помощью ONNXRuntime в Python. Другими словами, похоже, что этот режим вывода сохранен в модели ONNX и распознается ONNXRuntime в Python, но не в Barracuda.
Наш вопрос
В основном:
- Как сделать так, чтобы эта модель в Barracuda в Unity давала те же результаты, что и ONNXRuntime / PyTorch в Python?
И потенциально:
- Как режим вывода встроен в файл ONNX и как он используется в ONNXRuntime vs Barracuda?