1

语境

我正在尝试使用 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 之间的值: 数据模式 Barracuda 输出

这使得看起来模型权重没有正确加载。

我们发现了什么

根据梭子鱼手册转换为 ONNX 时,我们发现如果我们在转换之前没有在 PyTorch 网络中将模型设置为推理模式(链接),这些相同的、不正确的结果是由 Python 中的 ONNXRuntime 生成的。换句话说,看起来这种推理模式保存在 ONNX 模型中,并且在 Python 中被 ONNXRuntime 识别,但在梭子鱼中却没有。

我们的问题

一般来说:

  • 我们如何在 Unity 中的梭子鱼中获得这个模型,以产生与 Python 中的 ONNXRuntime/PyTorch 相同的结果?

并且可能:

  • 推理模式如何嵌入到 ONNX 文件中,以及如何在 ONNXRuntime 与梭子鱼中使用?
4

1 回答 1

1

结果发现有2个问题。首先,输入数据已根据 ONNX 模型维度进行编排,然而,梭子鱼期望不同方向的数据。“本机 ONNX 数据布局是 NCHW,或通道优先。梭子鱼自动将 ONNX 模型转换为 NHWC 布局。” 所以我们的数据被扁平化成一个数组,类似于创建第一个不匹配的 Python 实现。

其次,输入图像的 Y 轴倒置,使模型无法识别任何人。

纠正这些问题后,实施工作正常!

于 2020-07-06T15:02:40.937 回答