XCode13调用DeepLabV3预测图像崩溃,XCode12运行正常求解决方案
Xcode13调用DeepLabV3预测崩溃解决方案
该崩溃是Xcode13对Core ML代码生成逻辑、编译优化规则做出变更导致,Xcode12默认生成的模型接口与Xcode13默认编译规则存在兼容冲突,触发DeepLabV3Output类元数据访问异常,可按以下方案依次排查解决:
- 方案1:修改Core ML模型代码生成语言
在Xcode文件导航栏中找到DeepLabV3的.mlmodel文件,打开右侧文件检查器,在「Target Membership」区域将「Code Generation Language」从默认的Swift修改为Objective-C,重新编译项目即可。 - 方案2:降级Core ML代码生成版本
打开项目Build Settings,搜索「Core ML Code Generation Version」,将值设置为4(对应Xcode12的默认生成版本),覆盖Xcode13默认的最新版本规则。 - 方案3:禁用Bitcode编译
如果项目部署目标低于iOS15,在Build Settings中搜索「Enable Bitcode」,将值设置为No,Xcode13默认的Bitcode裁剪逻辑会误删Core ML相关符号触发该崩溃。 - 方案4:手动解析预测结果,绕过自动生成类
不直接调用DeepLabV3Output类的属性,将预测输出转为MLFeatureProvider手动读取对应特征值,示例代码如下:
guard let predictionOutput = try? deeplabModel.prediction(input: yourInput) as? MLFeatureProvider, let segmentationResult = predictionOutput.featureValue(for: "semanticPredictions")?.multiArrayValue else { return } // 后续处理分割结果逻辑
- 方案5:通过Vision框架封装调用
使用Vision框架封装Core ML请求,完全避开直接访问自动生成的DeepLabV3Output类,示例代码如下:
import Vision // 初始化模型 guard let mlModel = try? DeepLabV3().model, let vnModel = try? VNCoreMLModel(for: mlModel) else { return } // 构造识别请求 let segmentationRequest = VNCoreMLRequest(model: vnModel) { request, error in guard let results = request.results as? [VNCoreMLFeatureValueObservation], let segmentationMap = results.first?.featureValue.multiArrayValue else { return } // 处理分割结果 } // 执行请求 let imageHandler = VNImageRequestHandler(cgImage: yourCGImage, options: [:]) try? imageHandler.perform([segmentationRequest])
内容的提问来源于stack exchange,提问作者Domenico Gonnelli
相关产品推荐
相关产品推荐

