如何使用 Playground 为创建的 mlmodel 获取边界框数据

How To Get Bounding Box Data For Created mlmodel With Playground

我们创建了一个带有 playground 的 mlmodel,如 https://developer.apple.com/documentation/createml/creating_an_image_classifier_model

然后我们使用以下代码获取该 mlmodel 中对象的边界框数据。但是在 "results" 中,我们只能得到我们建模的预测值和对象名称,即使这已经存在但不是我们的目标。

print("detectOurModelHandler (results)") 向我们展示了所有对象和 我们的 mlmodel 中的预测值是 VNClassificationObservation。

所以我们没有盒子数据也就不足为奇了。

所以问题是如何将模型创建为 VNRecognizedObjectObservation,我想?

根据https://developer.apple.com/documentation/vision/recognizing_objects_in_live_capture我们应该得到边界框数据。

但我们不能。甚至 print("detectOurModelHandler 2") 也从未像 dump(objectBounds).

那样被调用

我们顺便调用captureOutput中的findOurModels。我们称之为 1 秒一次来测试我们的模型。

lazy var ourModel:VNCoreMLModel = { return try! VNCoreMLModel(for: ImageClassifier().model)}()

lazy var ourModelRequest: VNCoreMLRequest = { 
    return VNCoreMLRequest(model: ourModel, completionHandler: detectOutModelHandler)  
}()



 func findOurModels(pixelbuffer: CVPixelBuffer){

    let testImage =  takeAFrameImage(imageBuffer: pixelbuffer)
    let imageForThis   = testImage.cgImage
    let requestOptions2:[VNImageOption : Any] = [:]

    let handler = VNImageRequestHandler(cgImage: imageForThis!,
                                                    orientation: CGImagePropertyOrientation(rawValue: 6)!,
                                                    options: requestOptions2)



    try? handler.perform([ourModelRequest])

}




func detectOurModelHandler(request: VNRequest, error: Error?) {

   DispatchQueue.main.async(execute: {

    if let results = request.results {

       print("detectOurModelHandler \(results)") 

        for observation in results where observation is VNRecognizedObjectObservation {

             print("detectOurModelHandler 2") 

            guard let objectObservation = observation as? VNRecognizedObjectObservation else {
                continue
            }




      let objectBounds = VNImageRectForNormalizedRect(objectObservation.boundingBox, self.frameWidth, self.frameHeight)


             dump(objectBounds)

     }            
   }
 })

}

使用 CreateML 无法完成。 我还没有这样做,但据说可以使用 Turi Create 创建具有边界数据的模型。