Project 28 - MLModel

DaY·2021년 6월 21일
1

iOS

목록 보기
52/52
post-thumbnail

CoreML

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)
    }
}

Reference

0개의 댓글