pytorch 使用Barracuda在Unity中运行Onnx模型时出现意外模型输出

hpcdzsge  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(261)

上下文

我尝试使用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与梭子鱼中使用的?
k5ifujac

k5ifujac1#

结果发现有两个问题。首先,输入数据是根据ONNX模型的维度编排的,然而,梭子鱼期望不同方向的数据。“原生ONNX数据布局是NCHW,或通道优先。梭子鱼自动将ONNX模型转换为NHWC布局。”因此,我们的数据被扁平化为一个数组,类似于Python实现,这导致了第一个不匹配。
其次,输入图像的Y轴被反转,使模型无法识别任何人。
纠正这些问题后,实现工作正常!

相关问题