上下文
我尝试使用ONNX格式的预训练模型在Unity中对图像数据进行推理。该模型作为称为modelAsset的资产链接到Unity中的执行组件。我使用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);
字符串
进入输入Tensor的数据(模型只有1个)是h * w的图像数据,具有RGB值在-0.5到0.5之间的3个通道。模型有多个输出,我在上面显示的最后一行中检索。
预期行为
使用相同的输入数据,PyTorch模型和转换后的ONNX模型在Python中(ONNXtreme和PyTorch)产生与Unity中Barracuda相同的输出数据。
问题
在python中,ONNX和PyTorch模型产生相同的输出。然而,在Barracuda中运行相同的ONNX模型会产生不同的输出。区别主要在于我们期望得到一个热图,但Barracuda在以下模式中始终产生介于0.001和-0.0004之间的值:x1c 0d1x
这使得模型权重似乎没有正确加载。
我们发现
当按照the Barracuda manual转换到ONNX时,我们发现如果我们在转换之前没有在PyTorch网络中将模型设置为推理模式(link),那么这些相同的不正确的结果将由Python中的ONNXtron生成。换句话说,看起来这个推理模式保存在ONNX模型中,并且被Python中的ONNXtron识别,而不是Barracuda。
我们的问题
一般而言:
- 我们如何在Unity中的Barracuda中获得这个模型,以产生与Python中的ONNXP/PyTorch相同的结果?
并且可能:
- 推理模式是如何嵌入ONNX文件中的,以及它是如何在ONNX与梭子鱼中使用的?
1条答案
按热度按时间k5ifujac1#
结果发现有两个问题。首先,输入数据是根据ONNX模型的维度编排的,然而,梭子鱼期望不同方向的数据。“原生ONNX数据布局是NCHW,或通道优先。梭子鱼自动将ONNX模型转换为NHWC布局。”因此,我们的数据被扁平化为一个数组,类似于Python实现,这导致了第一个不匹配。
其次,输入图像的Y轴被反转,使模型无法识别任何人。
纠正这些问题后,实现工作正常!