CoreML은 학습된 모델을 쉽게 사용하도록 도와준다.
더불어 Vision을 사용하면 얼굴, 랜드마크, 텍스트, 사각형, 바코드 및 다양한 객체를 감지하는 모델을 사용할 수 있다.
프로젝트에 모델 추가
Resource 그룹에 추가한다.
VNCoreMLModel
VNCoreMLModel은 Vision 요청에 CoreML을 사용할 수 있도록 해준다.
Vision의 워크플로우는 모델을 생성하고, 하나 이상의 요청을 한 뒤, 요청 핸들러를 생성 및 실행시키는 방식으로 진행된다.
VNCoreMLRequest는 Core ML Model을 사용하여 작업을 수행하는 이미지 분석 요청으로, VNClassificationObsevation 객체로 이루어진 배열인지 확인한다.
extension ViewController {
func detectScene(image: CIImage) {
answer.text = "detecting..."
guard let model = try? VNCoreMLModel(for: GoogLeNetPlaces().model) else {
fatalError("can't load Places ML model")
}
let request = VNCoreMLRequest(model: model) { [weak self] request, error in
guard let results = request.results,
let topResult = results.first as? VNClassificationObservation else {
fatalError("unexpected result type from VNCoreMLRequest")
}
let article = (["a", "e", "i", "o", "u"].contains(topResult.identifier.first!)) ? "an" : "a"
DispatchQueue.main.async { [weak self] in
self?.answer.text = "\(Int(topResult.confidence * 100))% it's \(article) \(topResult.identifier)"
}
}
let handler = VNImageRequestHandler(ciImage: image)
DispatchQueue.global(qos: .userInteractive).async {
do {
try handler.perform([request])
} catch {
print(error)
}
}
}
}
이미지가 선택되면 모델이 사용되도록 한다.
extension ViewController: UIImagePickerControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)
dismiss(animated: true)
guard let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage else {
fatalError("couldn't load image")
}
scene.image = image
guard let ciImage = CIImage(image: image) else {
fatalError("couldn't convert UIImage to CIImage")
}
detectScene(image: ciImage)
}
}