Unity3d 使用Barracuda在Unity中运行NX模型的意外模型输出 上下文

Unity3d 使用Barracuda在Unity中运行NX模型的意外模型输出 上下文,unity3d,pytorch,onnx,onnxruntime,barracuda,Unity3d,Pytorch,Onnx,Onnxruntime,Barracuda,我试图使用ONNX格式的预训练模型对Unity中的图像数据进行推理。该模型作为名为modelAsset的资产链接到Unity中的执行组件。我正在为此使用Barracuda 1.0.0版,并执行以下模型: // Initialisation this.model = ModelLoader.Load(this.modelAsset); this.worker = WorkerFactory.CreateWorker(WorkerFactory.Type.CSharpBurst, m

我试图使用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);
进入输入张量(模型只有1个)的数据是h*w的图像数据,RGB值在-0.5和0.5之间有3个通道。模型有多个输出,我在上面显示的最后一行中检索到了这些输出

预期行为 使用相同的输入数据,PyTorch模型和转换后的ONNX模型在Python(ONNXRuntime和PyTorch)中生成与Unity中的Barracuda相同的输出数据

问题 在python中,ONNX和PyTorch模型都产生相同的输出。然而,在梭鱼中运行的相同ONNX模型产生不同的输出。区别主要在于,我们预计会出现热图,但梭鱼在这些模式中始终会产生介于0.001和-0.0004之间的值:

这使得模型权重似乎没有正确加载

我们发现了什么 当按照转换为ONNX时,我们发现如果在转换()之前没有在PyTorch net中将模型设置为推断模式,那么ONNXRuntime会在Python中生成这些相同的、不正确的结果。换句话说,这个推断模式似乎保存在ONNX模型中,由Python中的ONNXRuntime识别,但在Barracuda中不识别

我们的问题 一般而言:

  • 我们如何让Unity中的Barracuda中的这个模型产生与Python中的ONNXRuntime/PyTorch相同的结果
而且可能:

  • 推理模式是如何嵌入到ONNX文件中的,它是如何在ONNX运行时与Barracuda中使用的

结果发现有两个问题。 首先,输入数据是根据ONNX模型维度编排的,然而,梭鱼需要不同方向的数据。“本机ONNX数据布局是NCHW,或先通道。Barracuda会自动将ONNX模型转换为NHWC布局。”因此,我们的数据被展平为一个数组,类似于造成第一个不匹配的Python实现

其次,输入图像的Y轴被反转,使得模型无法识别任何人

在纠正了这些问题后,实现工作正常