问题标签 [onnx-coreml]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
686 浏览

pytorch - 通过 ONNX 从 PyTorch 转换为 CoreML 时缺少权重向量

我正在尝试通过 ONNX 将 PyTorch 模型转换为 CoreML,但是 ONNX-->CoreML 转换缺少权重向量?

我正在关注这里的教程,它做出了这样的声明:

第 3 步:将模型转换为 CoreML

就像运行convert函数一样简单。生成的对象是一个 coremltools MLModel 对象,您可以将其保存到文件中并稍后在 XCode 中导入。
cml = onnx_coreml.convert(model)

不幸的是,当我尝试这样做时,它失败了。

这是我的代码:

这是该print(graph)行给出的内容。

这是错误消息:

据我所知,它说重量张量%1[FLOAT, 64x3x5x5]丢失了。这就是我保存模型的方式:

ONNX 加载它很好 - 这只是我从 ONNX 转换到 CoreML 的步骤。

任何帮助弄清楚这一点将不胜感激。我确定我做错了很多其他事情,但我现在只需要导出这个东西。

谢谢,

0 投票
0 回答
727 浏览

pytorch - 通过 onnx 将 PyTorch Unet(“提拉米苏”)转换为 coreml 时出错

我正在尝试通过 onnx 将 pytorch“tiramisu”UNet(来自:https ://github.com/bfortuner/pytorch_tiramisu )转换为 coreml,我在 onnx-coreml 中遇到了这个错误_operators.py

TypeError: Error while converting op of type: Concat. Error message: Unsupported axis 1 in input of shape

关于我如何解决这个问题的任何想法?图层文件在这里,供参考:https ://github.com/bfortuner/pytorch_tiramisu/blob/master/models/layers.py

更新 1:因此,进一步深入研究,我注意到我的一些 graph.shape_dicts 包含没有值/形状的键:例如,'422': (1, 324, 2, 4), '423': (1, 324, 2, 4), '424': (1, 12, 2, 4), '425': (1, 48, 2, 4), '426': (), '427': (), '428': (), '429': (), '430': () [...]

我真的不确定这是怎么发生的,或者它是否是我的原始模型、onnx 或 onnx-coreml 问题。if node.inputs[0] in graph.shape_dict:但考虑到这一点,我if len(graph.shape_dict[node.inputs[0]]) != 0:_operators.py. 这允许转换完成,但在我尝试模型是否实际转换正确之前我不会知道......

更新 2:好的,所以生成的 mlmodel 在 Xcode 中验证失败,validator error: Layer '427' of type 320 has 1 inputs but expects at least 2.我猜这是(简单地)忽略我在上面的“更新 1”中找到的空 shape_dict 值的结果。但显然模型是不正确的。错误可能源于onnx吗?

0 投票
1 回答
235 浏览

ios - 为 coremlmodel 塑造输入

我有一个 coremlmodel 输入形状MultiArray (Float32 67 x 256 x 320) 我很难塑造这个模型的输入。目前,我正在尝试像这样实现它,

稍后我将不得不用这种大小的矩阵替换 rand。我首先将其用于测试目的。

任何关于如何塑造输入以适应体积的指针将不胜感激。

[斯维克斯]

0 投票
1 回答
263 浏览

python - pytorch 模型的 Coreml 模型浮点输入

我有一个 pytorch 模型,它将3 x width x height图像作为输入,像素值在0-1

例如,在 pytorch 中输入

我将此模型转换为 coreml 并导出了一个 mlmodel,它采用正确尺寸的输入

但是,我的预测是不正确的,因为模型期望两者之间有一个浮点值,0-1而 cvpixelbuffer 是一个 int bwetween0-255

我试图像这样规范化模型内部的值,

但是,当此操作在 coreml 级别的模型内部完成时, int * float被转换为int并且所有值本质上都是0

Cast op 不支持导出,例如,x = x.float()

我如何确保我的输入正确地进行预测?本质上,我想将其pixel rgb and float divide 255.0传递给模型进行推理?

0 投票
1 回答
903 浏览

pytorch - CoreML:为 ONNX RandomNormal 创建自定义层

我已经在 PyTorch 中训练了一个需要转换为 CoreML 的 VAE。从这个线程PyTorch VAE 无法转换为 onnx我能够导出 ONNX 模型,但是,这只是将问题进一步推到了 ONNX-CoreML 阶段。

包含torch.randn()调用的原始函数是 reparametrize func:

解决方案当然是创建一个自定义层,但我在创建一个没有输入的层时遇到了问题(即,它只是一个randn()调用)。

我可以通过以下定义完成 CoreML 转换:

我使用以下方法进行转换:

我还应该注意,在mlmodel导出完成时,会打印以下内容:

带入.mlmodelXcode 抱怨Layer '62' of type 500 has 0 inputs but expects at least 1.所以我想知道如何为层指定一种“虚拟”输入,因为它实际上没有输入——它只是一个包装器torch.randn()(或者,更具体地说,onnx RandonNormal操作) . 我应该澄清一下,我确实需要整个 VAE,而不仅仅是解码器,因为我实际上是在使用整个过程来“纠正”我的输入(即编码器z根据输入估计我的向量,然后解码器生成输入的最接近的可推广预测)。

非常感谢任何帮助。

更新:好的,我终于在 Xcode 中加载了一个版本(感谢@MattijsHollemans 和他的书!)。这originalConversion.mlmodel是将我的模型从 ONNX 转换为 CoreML 的初始输出。为此,我必须手动插入RandomNormal图层的输入。我无缘无故地做到了 (64, 28, 28) - 我知道我的批量大小是 64,我的输入是 28 x 28(但大概它也可能是 (1, 1, 1),因为它是一个“虚拟"):

这在 Xcode 中加载,但我还没有在我的应用程序中测试模型的功能。由于附加层很简单,并且输入实际上是虚假的,非功能输入(只是为了让 Xcode 开心),我不认为这会是一个问题,但如果它运行,我会再次发布适当地。

更新 2:不幸的是,模型不会在运行时加载。它失败了[espresso] [Espresso::handle_ex_plan] exception=Failed in 2nd reshape after missing custom layer info.我觉得非常奇怪和令人困惑的是,检查model.espresso.shape时,我发现几乎每个节点的形状都像:

我有两个问题/疑虑:1)最明显的是,为什么所有值都为零(除了输入节点之外的所有值都是这种情况),以及 2)为什么它看起来是一个顺序模型,而它只是一个相当传统的模型VAE?在同一个应用程序中打开model.espresso.shape一个功能齐全的 GAN,我看到节点的格式为:

也就是说,它们包含合理的形状信息,并且它们没有字段seq

非常非常迷茫……

更新3:我也刚刚注意到编译器报告了错误:IMPORTANT: new sequence length computation failed, falling back to old path. Your compilation was sucessful, but please file a radar on Core ML | Neural Networks and attach the model that generated this message.

这是原始的 PyTorch 模型:

0 投票
0 回答
639 浏览

python - ONNX 何时决定包含 Gather 操作?

我想这个问题很模糊,但我有一个刚刚构建的 PyTorch 模型,它无法转换为 CoreML,因为 ONNX 添加了Gather操作。完整的模型实际上是两个独立模型的合并,旨在通过尽可能长时间地在 GPU/Metal 上进行处理来提高性能。

构建这个“复合”模型需要我创建几个切片,形式为x = y[:, 0],我想知道这些是否可能是Gather操作的原因?

我确实意识到我可以创建一个自定义层,但是我刚刚经历了 CoreML 中自定义层的可怕惨败,这浪费了很多很多时间,而且让我无处可去,所以我试图找到另一种解决问题的方法.

如果找到绕过这些切片的方法会阻止 ONNX 添加Gather,我愿意寻找解决方案。

任何想法表示赞赏。

0 投票
1 回答
480 浏览

pytorch - 将 pytorch 模型转换为 core-ml 时出错

张量的形状:

期望值C(1, 129, 128, 256)

此代码在 pytorch 上运行,但在转换为 core-ml 时,它给了我以下错误:

0 投票
1 回答
876 浏览

machine-learning - 使用 ONNX 将 YOLOV3 Pytorch 模型转换为 coreml 以在 IOS 应用程序中时面临问题

我要转换的模型:https ://github.com/ultralytics/yolov3

我正在尝试将此 pytorch yolov3 模型转换为 coreML,为此我使用了 ONNX,它用于将模型从一个平台转换为另一个平台。它正在转换模型,当我在 xcode 中运行它时,我可以看到它的输入和输出不同,它没有检测到任何对象,也没有在屏幕上显示任何矩形。

我已经尝试过本教程并遵循了类似的步骤,但这次是针对 YOLOV3。谷歌文档:https ://drive.google.com/drive/folders/1uxgUBemJVw9wZsdpboYbzUN4bcRhsuAI

我还检查了 Yolov3 自己也提供了“onnx”文件,所以我什至尝试使用该文件并将其转换为 coreML,但它仍然没有检测到对象并提供错误的输入/输出值。

将 Pytroch 转换为 ONNX

名为“yoloToOnnx.py”的文件内容:

命令:

将 ONNX 模型转换为 CoreML 模型:

文件 onnx_to_coreml.py 内容:

命令:

我期待转换后我应该能够在我的 IOS 应用程序中使用这个模型,它将检测带有矩形及其名称的不同对象。

奇怪的是,在转换它时没有抛出任何错误,它给出了编译成功的消息,但在 IOS App 中使用时没有给出预期的输出。

0 投票
2 回答
358 浏览

machine-learning - 将 Pytorch 图像分类器转换为 mlmodel 时出现问题:无论 img 如何,都返回相同的 softmax 输出

我使用 pytorch 训练和测试了一个图像分类器(Resnet34、Fast.ai、3 类),并按learn.predict()预期工作。当我转换 pytorch -> onnx -> mlmodel 时,无论我提交的图像如何,它都会预测相同的 softmax 值。

这是我的 pytorch 模型:

要将其转换为 .onnx,我需要先对图像数据进行归一化并将其展平。我找到了这个教程,它适用于 fastai/onnx-coreml 的早期版本。我用以下课程做到这一点:

为了构建整个模型,我将 ImageScale 层、模型和 softmax 函数连接起来,如下所示:

最终看起来像这样:

我像这样转换为 .onnx:

我像这样从 .onnx 转换为 .mlmodel :

当我使用 coremltools 调用 predict 时,无论我输入什么图像,我都会得到相同的输出:

可能的问题: 1. 在转换之前我没有正确设置 Sequential 2. Coreml 或 onnx 无法处理非方形图像

我尝试了一堆不同的输入,但一直得到相同的,所以任何帮助将不胜感激!

这是netron的我的头部和尾部的屏幕截图:

头:

头

尾巴:

尾巴

0 投票
1 回答
536 浏览

python - 使用 onnx_coreml 转换节点类型切片时出错

我已将我的暗网 YOLOv3-SPP 模型转换为 PyTorch .pt 模型。然后我将.pt 转换为.onnx。我的最终目标是建立一个 CoreML 模型。我尝试使用这个GitHub 存储库。但是,在转换我的模型时,我遇到了这样的错误......

我正在使用的脚本是这个......

这个简单的 python 脚本应该可以工作,但我不知道为什么会出现这个错误。我对机器学习很陌生,所以我什至不明白如何开始尝试解决这个问题。我应该怎么做才能成功地将我的 .onnx 模型转换为 CoreML?