Я использую CoreML и Vision для анализа фотографии, сделанной камерой или импортированной из библиотеки.Как только фотография получена, я запускаю некоторый код, чтобы убедиться, что фотография действительна, и если это так, она возвращает true, иначе возвращает false.Я использую это так:
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
if let error = error {
// display alert there is a problem
return
}
guard let imageData = photo.fileDataRepresentation(), let previewImage = UIImage(data: imageData) else {
// display alert there is a problem
return
}
if useVisionAndCoreMLToCheckIfIsImageValid(image: previewImage) {
tableData.append(previewImage)
} else {
// display alert image was not valid
}
}
Проблема в том, что внутри функции useVisionAndCoreMLToCheckIfIsImageValid есть 4 точки, которые могут пойти не так, и мне нужно вернуть false
, чтобы я мог выпрыгнуть изфункция и, если она действительна, есть 1 точка, где она может идти правильно, и мне нужно вернуть true
.Но так как функция возвращает Bool
, я продолжаю получать ошибки при попытке вернуть true
или false
в следующих точках:
Как мне избавиться от вышеуказанных ошибок?
func useVisionAndCoreMLToCheckIfIsImageValid(image: UIImage) -> Bool {
if let cgImage = image.cgImage {
let foodModel = CustomFoodModel()
guard let model = try? VNCoreMLModel(for: foodModel.model) else {
return false
}
let request = VNCoreMLRequest(model: model) { [weak self](request, error) in
if let error = error {
// 1st point - if there is an error return false
return false
}
guard let results = request.results as? [VNClassificationObservation], let topResult = results.first else {
// 2nd point - if there is a nil value here return false
return false
}
if topResult.confidence > 0.8 {
// 3rd point - if confidence is greater then 80% return true
return true
} else {
// 4th point - if confidence is less then 80% return false
return false
}
}
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
do {
try handler.perform([request])
} catch let err as NSError {
// 5th point - if there is a try error return false
return false
}
}
}
// if the cgImage is nil return false
return false
}