【问题标题】:How to fix thread or handle error in Swift?如何修复 Swift 中的线程或处理错误?
【发布时间】:2021-03-15 08:48:08
【问题描述】:

我无法摆脱使用 Core ML 图像识别的程序中的错误!

我的代码基本上是调试过的,可以处理大量文件,但是在421文件上出现EXC_BAD_ACCESS错误(我更改了处理文件的顺序以消除文件损坏的问题) 我已经将所有潜在危险的对象转换为单例以避免泄漏,调试和整理 sqlite 数据库,使用推荐的 generateCGImagesAsynchronously 运算符重写代码以从视频文件中获取图片,一切都已清理干净并且没有泄漏,但是错误仍然发生 直接提取文本对象的代码取自网络,稍微升级一下,会不会有问题?,求助!

CreateAltModel3.shared.handler = VNImageRequestHandler(ciImage: inputImage!)
        CreateAltModel3.shared.request = VNCoreMLRequest(model: CreateAltModel3.shared.visionModel!) { [weak self] req3, error in
            output_handler(req3.results) }
        
        do {try CreateAltModel3.shared.handler!.perform([CreateAltModel3.shared.request!])} catch {print ("hadler3 error - request3")}

这是 output_handler 函数的代码

            func output_handler(_ results: [Any]?) {
        guard let results = results as? [VNClassificationObservation]
            else {return}
        for class1 in results {
            if (class1.confidence > 0.05) {  // Only show greater than 5%
                let fileID = filesArray[currentFileIndex]?.index
                if percentRecogn <= Int(round(class1.confidence*100)) {
                    findKeyStr = (class1.identifier + " " + String(round(class1.confidence*100)) + "%")
                    resultKeyStr.0 = Int64(fr)
                    let comma = (resultKeyStr.1 == "") ? "" : ", "
                    let cutDubbing = (resultKeyStr.1 == class1.identifier) ? resultKeyStr.1 : resultKeyStr.1 + comma + class1.identifier
                    resultKeyStr.1 = cutDubbing
                    resultKeyStr.2 = Int64(fileID!)
                }
            }
        }
    }

但我理解的错误是在退出此功能后发生的

在下一行代码

更多的代码传播没有意义,因为我只会用额外的信息混淆你,我只会补充一点,这段代码在全局流中循环工作,并按预期将信息输出到主流中的标签和 ImageView ,一切似乎都已调试,但我无法理解错误的性质,可能与流有关,但甚至不知道在哪里挖掘)

【问题讨论】:

    标签: swift thread-safety coreml


    【解决方案1】:

    您不能(或至少不应该)一次使用来自多个线程的单个 VNCoreMLRequest

    【讨论】:

    • 但我也划分了请求(如 request1 request2),这就是为什么我将 VNCoreMLRequest 类型的对象放在单例中以使用单个实例,您是否建议在主线程中使用此对象还是删除全局队列?
    • 从 iOS 14 开始,Apple 表示您应该仅从单个线程或队列中使用 Core ML 模型。如果你想使用多个线程,你应该创建多个 MLModel 对象(以及 VNCoreMLModel)的实例。
    • 我正在创建 macOS 应用程序
    • 同样的事情,不管你是在 iOS 还是 macOS 上。
    • 我将关键代码放在全局队列中,只更新主队列中的控件,但没有任何改变,需要帮助修复可能的堆栈溢出
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2021-02-26
    • 1970-01-01
    • 2021-12-20
    • 2017-02-11
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多