0

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

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

是否可以“调整大小”/“重塑”/“转置”第一个模型输出以匹配第二个模型输入?我正在使用https://github.com/hollance/CoreMLHelpers(由令人惊叹的 Matthijs Hollemans 提供)助手,但我真的不明白如何在不破坏数据并尽可能保持高效的情况下做到这一点。

谢谢!

4

1 回答 1

2

您不必它们变成图像。使用 MLMultiArrays 而不是图像的一些选项:

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

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

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

于 2021-06-01T19:35:24.727 回答