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