首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Barracuda运行Onnx模型的意外模型输出

使用Barracuda运行Onnx模型的意外模型输出
EN

Stack Overflow用户
提问于 2020-07-02 14:13:16
回答 1查看 1K关注 0票数 1

上下文

我试图使用一个预先训练的模型,在ONNX格式,以进行推断的图像数据在统一。该模型作为一个名为modelAsset的资产,链接到Unity中的执行组件。为此,我使用了Barracuda版本1.0.0,并按如下方式执行该模型:

代码语言:javascript
复制
// 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)中产生相同的输出数据,与在统一中的Barracuda生成相同的输出数据。

问题

在python中,ONNX和PyTorch模型产生相同的输出。但是,在Barracuda中运行的相同的ONNX模型会产生不同的输出。不同之处主要在于我们期望一个热图,但梭鱼在这些模式中总是产生0.001到-0.0004之间的值:

这使得模型的权重似乎没有适当地加载。

我们发现的

当按照梭鱼手册转换到ONNX时,我们发现,如果不将模型设置为PyTorch网中的推理模式,则在转换之前(链接),这些结果都是由ONNXRuntime在链接中生成的。换句话说,这种推断模式似乎保存在ONNX模型中,并被ONNXRuntime在Python中识别,而不是在Barracuda中识别。

我们的问题

一般而言:

  • 我们如何在Unity中获得与Python中的ONNXRuntime/PyTorch相同的结果?

而且有可能:

  • 推理模式是如何嵌入到ONNX文件中的,在ONNXRuntime和Barracuda之间是如何使用的?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 15:02:40

结果发现有两个问题。首先,输入数据是根据ONNX模型维度编排的,然而,Barracuda期望有不同的面向对象的数据。本机ONNX数据布局是NCHW,或通道优先。Barracuda自动将ONNX模型转换为NHWC布局。因此,我们的数据被扁平化成一个类似于Python实现的数组,该实现创建了第一个不匹配。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62698346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档