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

问题描述

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

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

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

谢谢!

解决方法

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

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

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

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