【问题标题】:Timing difference when recognizing photos SwiftSwift 识别照片时的时间差
【发布时间】:2020-12-22 16:11:12
【问题描述】:

我创建了一个应用程序来识别照片中的花朵。照片可以来自画廊或用相机拍摄。我有功能:

func detectFlower(image: CIImage,completion: @escaping (_ getString:String?,_ error:Error?,_ getDouble:Double?,_ getArray:Array<VNConfidence>?,_ getArray:Array<String>?)-> Void)  {
        
        guard let model = try? VNCoreMLModel(for: NewFlowersModel().model) else {
            
            fatalError("Cannot import a model.")
        }
        let methodStart = Date()
        let request = VNCoreMLRequest(model: model) { (request, error) in
            
            let classifiedNameOfFlower = request.results?.first as? VNClassificationObservation
            let classifiedValues = request.results as? [VNClassificationObservation]
            let methodFinish = Date()
            let nameOfFlower = String(classifiedNameOfFlower?.identifier ?? "Unexpected type")
            let executionTime = methodFinish.timeIntervalSince(methodStart)
            
            let classificationConfidences = classifiedValues?.prefix(10).map {
                ($0.confidence)
            }
            
            let classificationIdentifiers = classifiedValues?.prefix(10).map {
                ($0.identifier)
            }
            completion(nameOfFlower,nil,executionTime, classificationConfidences, classificationIdentifiers)
        }
        
        let handler = VNImageRequestHandler(ciImage: image)
        do {
            try handler.perform([request])
        } catch {
            print(error)
            completion(nil, error, nil, nil, nil)
        }
    }

用于识别。其中有两个常数let methodStart = Date()let methodFinish = Date() 用于测量时间。后面的代码中有一个常数可以计算差值let executionTime = methodFinish.timeIntervalSince(methodStart)

我注意到一个奇怪的依赖关系——当我运行应用程序时,第一次扫描会返回一个时间差,例如0.395959 秒。下一次扫描返回的时间要短得多,例如 0.033615 秒。这可能是什么结果?是什么造成了时差,而且第一次扫描,这个时间总是最长的?

【问题讨论】:

    标签: swift coreml vision


    【解决方案1】:

    从磁盘加载模型可能会占用大部分时间。每次进行检测时,您都在重新创建整个模型:

    guard let model = try? VNCoreMLModel(for: NewFlowersModel().model) else { ... }
    

    第一次这样做时,您需要从磁盘加载大量数据。之后,大部分数据将被缓存,但这通常不是正确的做法,因为您仍然在浪费大量精力重新创建数据结构。

    您想要做的只是一次创建模型和请求,可能是在应用程序启动期间,或者当您来到此屏幕时,或者当您预计用户将需要 ML 引擎时。将其存储在属性或共享对象中。然后,每次获得新图像时,只需创建 VNImageRequestHandler 并执行即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多