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

Posted

技术标签:

【中文标题】错误! coreML 模型对图像的预测是错误的,对视频是正确的【英文标题】:Error! coreML model prediction on image is wrong , on video is correct 【发布时间】:2018-10-27 03:07:50 【问题描述】:

我在一个示例 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。

问题是:为什么在函数和模型调用相同的情况下会出现这种差异。

我该如何解决这个问题?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

包含的关键错误

图像的方向在转换中变得混杂。视频序列保持方向。

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

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

希望这会有所帮助。

【讨论】:

感谢分享!我们正在研究类似的问题。您可以为我们提供付费顾问吗?

以上是关于错误! coreML 模型对图像的预测是错误的,对视频是正确的的主要内容,如果未能解决你的问题,请参考以下文章

图像识别的 CoreML 模型预测仅适用于 iPhone 11 和 12 模型

如何在将图像提供给 CoreML 模型之前对其进行预处理?

该模型在 Tensorflow 到 CoreML 模型中没有有效的图像类型输入特征

错误的模型预测

我的 CNN 分类器对随机图像给出了错误的预测

CoreML 模型预测不同于训练