Ошибка!Модель CoreML на изображении неверна, на видео верна - PullRequest
0 голосов
/ 17 мая 2018

Я использую CoreML в качестве примера приложения для iOS с моей собственной моделью обнаружения обученных объектов.Модель при использовании на видеокадрах способна хорошо работать и показывает правильные определения классов и ограничивающие рамки.

При использовании на изображении все определения ограничивающего прямоугольника неверны, и все прогнозы классифицируются на 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 Ответ

0 голосов
/ 26 мая 2018

Ключевые ошибки включены

  • ориентация изображений смешивалась при конвертации. Видеопоследовательность сохранила ориентацию.

  • Вывод модели был поврежден во время преобразования. Повторное преобразование с первого шага решило проблему. Таким образом, моя собственная ошибка, однако важное наблюдение. Из-за большого количества шагов при переходе с одной платформы на другую возможные источники ошибок многократно, и это помогло начать с первого шага.

  • изменение размера изображения и изменение размера приложения ImageView влияло на визуализацию ограничивающих рамок. Таким образом, важно проверить это. Я сделал наивный вывод, что предсказания были неверными, тогда как визуализация была неправильной.

Надеюсь, это поможет.

...