使用Vision框架OCR时重复运行报错:Failed to get the home directory
CoreML报错
[coreml] Failed to get the home directory when checking model path 解决办法 问题背景
使用Apple官方文档提供的Vision框架OCR代码进行图片文本提取,首次运行完全正常,但后续执行时触发CoreML错误提示:[coreml] Failed to get the home directory when checking model path。
解决方案
- 确保在正确的线程执行请求
Vision框架的文本识别请求不能在主线程执行,且需要线程具备正常的文件系统访问权限。如果后续调用时把请求放在了主线程或权限受限的线程,会导致CoreML无法访问内置模型目录。修改代码,将请求逻辑放到全局队列执行,并在回调中切回主线程更新数据:
func requestORC(image: UIImage) { guard let cgImage = image.cgImage else { return } DispatchQueue.global(qos: .userInitiated).async { let requestHandler = VNImageRequestHandler(cgImage: cgImage) let request = VNRecognizeTextRequest(completionHandler: self.recognizeTextHandler) do { try requestHandler.perform([request]) } catch { print("请求执行失败: \(error).") } } } func recognizeTextHandler(request: VNRequest, error: Error?) { guard let observations = request.results as? [VNRecognizedTextObservation] else { return } let recognizedStrings = observations.compactMap { $0.topCandidates(1).first?.string } // 切回主线程更新UI或数据 DispatchQueue.main.async { self.recognizedStrings = recognizedStrings } }
- 复用识别请求对象,避免频繁初始化
频繁创建VNRecognizeTextRequest实例可能导致CoreML模型加载的资源冲突,将请求对象设为类的懒加载属性复用:
class YourViewController: UIViewController { private lazy var textRecognitionRequest: VNRecognizeTextRequest = { let request = VNRecognizeTextRequest(completionHandler: self.recognizeTextHandler) // 可根据需求配置识别精度,.fast 或 .accurate request.recognitionLevel = .accurate return request }() func requestORC(image: UIImage) { guard let cgImage = image.cgImage else { return } DispatchQueue.global(qos: .userInitiated).async { let requestHandler = VNImageRequestHandler(cgImage: cgImage) do { try requestHandler.perform([self.textRecognitionRequest]) } catch { print("请求执行失败: \(error).") } } } func recognizeTextHandler(request: VNRequest, error: Error?) { guard let observations = request.results as? [VNRecognizedTextObservation] else { return } let recognizedStrings = observations.compactMap { $0.topCandidates(1).first?.string } DispatchQueue.main.async { self.recognizedStrings = recognizedStrings } } }
- 检查App沙箱权限配置
确认项目的Info.plist中没有添加限制文件系统访问的配置,确保App拥有正常的沙箱访问权限,避免CoreML无法读取内置的OCR模型文件。
内容的提问来源于stack exchange,提问作者Qazi Ammar
相关产品推荐
相关产品推荐

