Error Domain=com.apple.Vision Code=9 "Could not create inference context"

所属分类:ios | 发布于 2025-01-11

使用 VNGeneratePersonSegmentationRequest 做人像分割时,xcode报出了如下错误:

Error Domain=com.apple.Vision Code=9 "Could not create inference context" 
UserInfo={NSLocalizedDescription=Could not create inference context}

明明是把别人的示例代码搬过来,也还是报错,搞的一度怀疑人生。今天又搜了一下,知道了答案。

这个错误是出现在用模拟器Simulator运行App时,这个结论一说,立马到真机上运行,程序终于正常了。

官方的文档说明:

Core ML optimizes on-device performance by leveraging the CPU, GPU, and Neural Engine while minimizing its memory footprint and power consumption.

Core ML 利用 CPU、GPU 和神经引擎优化设备性能,同时最大限度地减少其内存占用和功耗。

最终原因是:

You see Could not create inference context error because Neural Engine is not supported in the simulator.

您会看到“无法创建推理上下文”错误,因为模拟器不支持神经引擎。

1、Stackvoerflow解决方法

只需要设置 usesCPUOnly 为 true 即可

#if targetEnvironment(simulator)
   request.usesCPUOnly = true
#endif

但是 usesCPUOnly 属性在 iOS17 被 deprecated 弃用

@available(iOS, introduced: 11.0, deprecated: 17.0)
open var usesCPUOnly: Bool

2、iOS17 兼容版

#if targetEnvironment(simulator)
if #available(iOS 17.0, *) {
    let allDevices = MLComputeDevice.allComputeDevices
    for device in allDevices {
        // CPU device
        if(device.description.contains("MLCPUComputeDevice")){
            request.setComputeDevice(.some(device), for: .main)
            break
        }
//        // GPU device, Simulator上没有GPU,在Simulator使用CPU模拟GPU
//        if(device.description.contains("MLGPUComputeDevice")){
//            computeDevice = device
//            break
//        }
    }
} else {
  // Fallback on earlier versions
    request.usesCPUOnly = true
}
#endif

加上了上述代码,模拟器运行不报错了,但是合成图像还是不成功

3、配置计算单元

usesCPUOnly 被 废弃,但是CoreModel提供了MLComputeUnits枚举来确定计算单元

@available(iOS 12.0, *)
public enum MLComputeUnits : Int, @unchecked Sendable {
    case cpuOnly = 0                  // limits the model to use CPU only
    case cpuAndGPU = 1                // limits the model to use CPU and GPU
    case all = 2                      // the model can use CPU, GPU and NE

    @available(iOS 16.0, *)
    case cpuAndNeuralEngine = 3       // limits the model to use CPU and NE
}

现在只能在配置中选择计算单元

let config = MLModelConfiguration()
config.computeUnits = .cpuOnly

let mlModel = try! MobileNetV2(configuration: config).model

guard let model = try? VNCoreMLModel(for: mlModel)
else { return }

4、最终解决方案

模拟器使用CPU不报错,但是没有效果,所以最终解决方案是:在真机上运行代码。

 

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接