You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:10:11