我们创建了一个带有游乐场的 mlmodel,例如https://developer.apple.com/documentation/createml/creating_an_image_classifier_model。
然后我们使用以下代码获取该 mlmodel 中对象的边界框数据。但是在“结果”中,我们只能得到我们建模的预测值和对象名称,即使那是退出但不是我们的目标。
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)
}
}
})
}