2017-10-29 158 views
0

我是一个noob,我真的不知道如何发生多个CoreML模型到VNCoreMLRequest。 下面的代码只是使用一个模型,但我还想追加另一个模型(以下示例中的visionModel2)。谁能帮我?谢谢!追加多个VNCoreMLModel ARKit和CoreML

private func performVisionRequest(pixelBuffer: CVPixelBuffer){ 
    let visionModel = try! VNCoreMLModel(for: self.iFaceModel.model) 
    let visionModel2 = try! VNCoreMLModel(for: self.ageModel.model) 
    let request = VNCoreMLRequest(model: visionModel){ request, error in 

     if error != nil { 
      return 
     } 

     guard let observations = request.results else { 
      return 
     } 

     let observation = observations.first as! VNClassificationObservation 

     print("Name \(observation.identifier) and confidence is \(observation.confidence)") 


     DispatchQueue.main.async { 
      if observation.confidence.isLess(than: 0.04) { 
       self.displayPredictions(text: "Not recognized") 
       print("Hidden") 
      }else { 
       self.displayPredictions(text: observation.identifier) 
      } 
     } 
    } 

回答

0

要使用多个ML模型评估图像,您需要执行多个请求。例如:

let faceModelRequest = VNCoreMLRequest(model: visionModel) 
let ageModelRequest = VNCoreMLRequest(model: visionModel2) 

let handler = VNImageRequestHandler(/* my image and options */) 
handler.perform([faceModelRequest, ageModelRequest]) 

guard let faceResults = faceModelRequest.results as? [VNClassificationObservation], 
    let ageResults = ageModelRequest.results as? [VNClassificationObservation] 
else { /*handle errors from each request */ } 

(是的,你可以运行没有完成处理视觉的请求,然后收集来自多个请求的结果可能要检查的请求prefersBackgroundProcessing并调度一切到后台排队自己,虽然。 )

之后,您可能想要将两个请求的结果迭代在一起。这里是你可以做一个方便的方式,与雨燕标准库序列的功能,但它假定这两个模型返回有关以相同的顺序相同的面孔信息:

for (faceObservation, ageObservation) in zip (faceResults, ageResults) { 
    print(“face \(faceObservation.classification) confidence \(faceObservation.confidence)”) 
    print(“age \(ageObservation.classification) confidence \(ageObservation.confidence)”) 

    // whatever else you want to do with results... 
} 

免责声明:代码写在StackExchange iOS应用,不测试。但它至少是您可能要查找的内容的草图 - 根据需要进行调整。