【问题标题】:CICoreMLModelFilter throws "Unsupported engine type"CICoreMLModelFilter 抛出“不支持的引擎类型”
【发布时间】:2019-03-05 17:10:48
【问题描述】:

CoreImage 中有这个新的但仍未记录的CICoreMLModelFilter。它有两个参数:

inputImage - 用作输入图像的图像。对于也使用背景图像的过滤器,这是前景图像。

inputModel - 用于对图像应用效果的 CoreML 模型。

这个想法很简单 - 拍摄一张图片,应用样式转换并输出风格化的图片。

所以我将 CoreML 模型加载到我的测试应用程序中,并尝试将此模型作为 inputModel 键传递:

guard
    let mlFilter = CIFilter(name: "CICoreMLModelFilter")
else {
    return nil
}

let model = StarryStyle().model

mlFilter.setValue(workingImage, forKey: "inputImage")
mlFilter.setValue(model, forKey: "inputModel")

guard
    let mlResult = mlFilter.outputImage
else {
    return nil
}

每当我尝试运行这个非常简单的代码时,都会出现以下异常:

[Espresso::handle_ex_] exception=Unsupported engine type

无论我尝试加载什么 MLModel,它总是抛出上述异常。我在 Mojave (10.14) 上运行 Swift 4.2。

有人尝试过使用 CoreImage 和 CoreML 吗?

【问题讨论】:

  • 您尝试做的事情可能完全不受支持,但 Espresso 是实际运行 Core ML 模型的东西。 “引擎类型”可以是 MPS(用于使用 GPU)、ANE(用于 A12 上的新神经引擎)以及可能的其他类型。看看这里请求的实际引擎类型是什么会很有趣。你是在 iPhone XS 上运行它吗?如果不是,这可能就是解释。
  • Matthijs,感谢您的意见,但我非常不同意。完全有可能做到这一点,因为这已在此 WWDC 会议developer.apple.com/videos/play/wwdc2018/719 (43:20) 中显示。他们加载 CoreML 模型并将其传递给CICoreMLModelFilter 以实现样式迁移。
  • 啊,但是如果他们在 WWDC 上展示了它,那么它并不是真正的无证。 ;-) 他们是在 WWDC 上的 Mojave 上展示它还是在手机上展示它?
  • 我刚刚用我的模型测试了过滤器,它确实有效(在 iPhone X 上)。但是,每次调用outputImage 都会泄漏大量内存,并且在几帧之后,应用程序就会耗尽内存。它还在输入图像上使用缩放以匹配模型的输入大小——没有像 Vision 那样的智能缩放和裁剪。我想你最好写自己的 CIImageProcessorKernel 来将 CoreML 模型集成到 Core Image 中。

标签: swift core-graphics core-image coreml


【解决方案1】:

我在 Mac OS 10.14 上遇到此错误 - 在适用于 iOS 12 无错误的模型上以及在早期版本的 Mac OS - 10.13 上。最初我认为这与浮点量化有关,但我在非量化浮点 32 模型和不同设备上尝试了这个,并为以下模型获取它:

  • 输出/运行推理正常
  • 使用标准 CoreML / Vision API
  • 在集成或独立 GPU 上运行
  • 在 iMac Pro AMD GPU 上
  • 在 MBP Nvidia GPU 上

我不确定这是否只是处理的一些内部异常 - 在 AMD 上,我得到一个稍微不同的错误;

[Espresso:handle_ex_] exception=<private>

我开始认为它是无害的?

【讨论】:

    【解决方案2】:

    添加一个有趣的答案/发现,因为错误消息是相同的,但我没有使用任何与 CoreML API 相关的东西(或者我是这么认为的)。

    WatchKit 扩展[7896:536979] [espresso] [Espresso::handle_ex_] 异常=不支持的引擎类型

    我在使用文本输入控制器时收到此消息。特别是presentTextInputController

    我相信这只是因为 CoreML 引擎在模拟器上运行而出现的。 至少在text input controller 的情况下,这是此消息的明显原因。

    文本输入控制器是我们免费获得的控制器,包括 Scribble 文本输入。它显然是谨慎地搭载在同一个 CoreML 引擎上,否则它将无法识别涂鸦。

    没有办法禁用涂鸦输入来实际测试这个理论。默认情况下启用听写和涂鸦。您只能禁用emoji 和/或animatedEmoji。但很明显这就是正在发生的事情。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2016-12-29
      相关资源
      最近更新 更多