语境
我正在尝试使用 ONNX 格式的预训练模型对 Unity 中的图像数据进行推断。该模型作为名为 modelAsset 的资产链接到 Unity 中的执行组件。我为此使用梭子鱼 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)中生成与 Unity 中梭子鱼相同的输出数据。
问题
在 python 中,ONNX 和 PyTorch 模型都产生相同的输出。但是,在梭子鱼中运行的相同 ONNX 模型会产生不同的输出。不同之处主要在于我们期望热图,但梭子鱼在这些模式中始终产生介于 0.001 和 -0.0004 之间的值:
这使得看起来模型权重没有正确加载。
我们发现了什么
根据梭子鱼手册转换为 ONNX 时,我们发现如果我们在转换之前没有在 PyTorch 网络中将模型设置为推理模式(链接),这些相同的、不正确的结果是由 Python 中的 ONNXRuntime 生成的。换句话说,看起来这种推理模式保存在 ONNX 模型中,并且在 Python 中被 ONNXRuntime 识别,但在梭子鱼中却没有。
我们的问题
一般来说:
- 我们如何在 Unity 中的梭子鱼中获得这个模型,以产生与 Python 中的 ONNXRuntime/PyTorch 相同的结果?
并且可能:
- 推理模式如何嵌入到 ONNX 文件中,以及如何在 ONNXRuntime 与梭子鱼中使用?