https://www.kaggle.com/datasets/moltean/fruits?resource=download
ViewController
private let classifier = VisionClassfier(mlModel: FruitClassifier_1().model)
Button("Classify") {
if let img = self.image {
self.classifier?.classify(img) { result in
self.classificationLabel = result
}
}
}.padding()
.foregroundColor(Color.white)
.background(Color.green)
.cornerRadius(10)
VisionClassfier
import Foundation
import CoreML
import Vision
import UIKit
class VisionClassfier {
private let model: VNCoreMLModel
private var completion: (String) -> Void = { _ in }
private lazy var request: [VNCoreMLRequest] = {
let request = VNCoreMLRequest(model: model) { (request, error) in
guard let results = request.results as? [VNClassificationObservation] else {
return
}
if !results.isEmpty {
if let result = results.first {
self.completion(result.identifier)
}
}
}
request.imageCropAndScaleOption = .centerCrop
return [request]
}()
init?(mlModel: MLModel) {
if let model = try? VNCoreMLModel(for: mlModel) {
self.model = model
} else {
return nil
}
}
func classify(_ image: UIImage, completion: @escaping (String) -> Void) {
self.completion = completion
DispatchQueue.global().async {
guard let cgImage = image.cgImage else {
return
}
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
do {
try handler.perform(self.request)
} catch {
print(error.localizedDescription)
}
}
}
}