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不报错,但是没有效果,所以最终解决方案是:在真机上运行代码。