识别照片时的时差Swift



我创建了一个可以识别照片中花朵的应用程序。照片可以来自图库,也可以使用相机拍摄。我有功能:

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秒。这可能是什么结果?是什么导致了时间差,以及你第一次扫描时,这个时间总是最长的?

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

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

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

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

最新更新