gpt4 book ai didi

ios - 错误! coreML 模型对图像的预测是错误的,对视频是正确的

转载 作者:行者123 更新时间:2023-11-28 07:48:12 25 4
gpt4 key购买 nike

我在一个示例 iOS 应用程序中使用 CoreML 和我自定义训练的对象检测模型。该模型在视频帧上使用时能够表现良好并显示正确的类检测和边界框。

在图像上使用时,边界框检测全部错误,所有预测都归为 1 类。

两种情况下的模型设置是相同的。

模型预测调用处理为

func processClassifications(for request: VNRequest, error: Error?) -> [Prediction]? {

let results = request.results

let results1 = results as! [VNCoreMLFeatureValueObservation]

let results2 = try? postprocess().prediction( output: results1[0].featureValue.multiArrayValue! )

// Some processing from results2 -> predictions

return predictions
}

对于视频:

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

// self.visionModel is same as the " MODEL_TF2keras_OutConv12().model " below...

guard let visionModel = self.visionModel

var requestOptions:[VNImageOption : Any] = [:]
if let cameraIntrinsicData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) {
requestOptions = [.cameraIntrinsics:cameraIntrinsicData]
}
let orientation = CGImagePropertyOrientation(rawValue: UInt32(EXIFOrientation.rightTop.rawValue))

let trackingRequest = VNCoreMLRequest(model: visionModel) { (request, error) in
guard let predictions = self.processClassifications(for: request, error: error) else { return }. // This function performs the coreML model on the frame and return the predictions.
}
trackingRequest.imageCropAndScaleOption = VNImageCropAndScaleOption.centerCrop

let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: orientation!, options: requestOptions)
try imageRequestHandler.perform([trackingRequest])

}
}

对于单张图像,预测的处理方式为:

lazy var classificationRequest: VNCoreMLRequest = {

let model = try VNCoreMLModel(for: MODEL_TF2keras_OutConv12().model)

let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
let predictions = self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = VNImageCropAndScaleOption.centerCrop
return request
}
}()

func updateClassifications(for image: UIImage) {

let orientation = CGImagePropertyOrientation(image.imageOrientation)
guard let ciImage = CIImage(image: image)

let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
handler.perform([self.classificationRequest])
}

据我了解,问题在于在视频情况下使用 CVPixelbuffer 而在单图像情况下使用 CIImage。

问题是:为什么函数和模型调用相同时会出现这样的差异。

我该如何解决这个问题?

感谢您的帮助。

最佳答案

包含的关键错误

  • 图像的方向在转换过程中变得困惑。视频序列保留方向。

  • 模型输出在转换过程中损坏。从第一步重新转换解决了这个问题。因此,我自己的错误是一个重要的观察结果。由于从一个平台转换到另一个平台的步骤太多,可能的错误来源是多方面的,这有助于从第一步开始。

  • 图像大小调整和应用程序 ImageView 大小调整影响了边界框的可视化。因此检查这些很重要。我天真地推断预测是不正确的,而可视化是不正确的。

希望这对您有所帮助。

关于ios - 错误! coreML 模型对图像的预测是错误的,对视频是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com