如何使用 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 创建具有边界数据的模型。
我们创建了一个带有 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 创建具有边界数据的模型。