使用第一个 MLModel MLMultiArray 输出作为第二个 MLModel MLMultiArray 输入

Posted

技术标签:

【中文标题】使用第一个 MLModel MLMultiArray 输出作为第二个 MLModel MLMultiArray 输入【英文标题】:Use first MLModel MLMultiArray output as second MLModel MLMultiArray Input 【发布时间】:2021-08-19 13:30:52 【问题描述】:

我有两个CoreML MLMModels(从.pb 转换而来)。 第一个模型输出一个Float32 3 × 512 × 512MLMultiArray,它基本上描述了一个图像。 第二个模型输入是Float32 1 × 360 × 640 × 3MLMultiArray,它也是一个图像,但大小不同。

我知道理论上我可以将第二个模型输入转换为图像,然后将第一个模型输出转换为图像(后预测),调整大小,然后喂给第二个模型,但是感觉不太好效率很高,而且模型已经造成了很大的延迟,所以我正在努力提高性能。

是否可以“resize”/“reshape”/“transposed”第一个模型输出以匹配第二个模型输入?我正在使用https://github.com/hollance/CoreMLHelpers(由惊人的 Matthijs Hollemans) 帮助者,但我真的不明白如何在不破坏数据并尽可能保持高效的情况下做到这一点。

谢谢!

【问题讨论】:

【参考方案1】:

您不必必须将它们变成图像。使用 MLMultiArrays 代替图像的一些选项:

您可以从第一个模型中取出 512x512 的输出并切掉一部分使其成为 360x512,然后填充另一个尺寸使其成为 360x640。但这可能不是你想要的。如果是这样,您必须自己为此编写代码。

您也可以手动将 512x512 输出调整为 360x640。为此,您需要自己实现一个合适的调整大小选项(可能是双线性插值)或转换数据,以便您可以使用 OpenCV 或 vImage 框架。

让模型做上面的事情。将 ResizeBilinearLayer 添加到模型,然后添加 PermuteLayer 或 TransposeLayer 以更改尺寸的顺序。现在图像将被调整为 360x640 像素,第一个模型的输出为 1x360x640x3。如果将这些操作添加到原始模型中,然后让 coremltools 将它们转换为适当的 Core ML 层,这是最简单的。

【讨论】:

以上是关于使用第一个 MLModel MLMultiArray 输出作为第二个 MLModel MLMultiArray 输入的主要内容,如果未能解决你的问题,请参考以下文章

预热 CoreML MLModel

隐藏 CoreML 模型 (.mlmodel) 文件

我很困惑使用 coreml3 工具使 mlmodel 可更新

从coremltools4.0转换的mlmodel比从tfcoreml转换的mlmodel慢很多

动态加载 mlmodel

在 Xcode 中使用 MLModel 时如何重写更少的代码