iOS/Framework

Core ML - Classifying Images with Vision and Core ML 번역

DevBabamba 2017. 12. 28. 23:54
반응형


※의역 오역 많습니다. 참고하시고 보세요~

원문: https://developer.apple.com/documentation/vision/classifying_images_with_vision_and_core_ml


Classifying Images with Vision and Core ML

  • 이미지 분류를 수행하기 위해 Vision과 Core ML을 사용하라
    Download

Overview

  • Core ML 프레임워크로, input 데이터 분류를 위해 훈련된 머신러닝 모델을 사용할 수 있다.
  • Vision 프레임워크는 Core ML과 함께 분류 모델을 이미지에 적용한다.
  • 그리고 이들 이미지들에 전처리하여 머신러닝 작업을 쉽고 안정적으로 수행한다.

  • 이 샘플앱은 몇가지 사용가능한 분류 모델 중 하나인 오픈 소스 MobileNet model을 사용한다.

  • 아래 스크린 샷의 에서 보듯 이미지를 확인하기 위해 1000 분류 카테고리를 사용한다.

Preview the Sample App

  • 이 샘플앱을 실제로 보려면, 프로젝트를 빌드하고 실행하라. 그 다음 샘플 앱의 툴바의 버튼을 사용하여 사진을 찍거나 포토 라이브러리에서 이미지를 선택하라.
  • 샘플앱은 선택한 이미지에 Core ML 모델을 적용하기 위해 Vision을 사용한다. 그리고 결과 분류 라벨을 각 분류의 신뢰 수준을 표시하는 숫자와 함께 보여준다.
  • 모델이 각자에게 배정한 신뢰도 스코어 순서로 상위 두 분류를 보여준다.

Set Up Vision with a Core ML Model

  • Core ML은 ML 모델에 쉬운 접근을 제공하는 Swift 클래스(이 샘플에서는 MobileNet 클래스)를 자동으로 생성한다.
  • 모델을 사용하여 Vision 요청을 설정하기 위해, VNCoreMLRequest 객체를 생성하기 위하여 클래스의 인스턴스를 생성하고 모델 프로퍼티를 사용한다.
  • 요청을 실행한 이후 모델로 부터 결과를 받기 위해 메소드를 명시하는 것으로 요청 객체의 completion handler를 사용하라.
let model = try VNCoreMLModel(for: MobileNet().model)
            
let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
    self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = .centerCrop
return request
  • ML 모델은 고정된 가로세로 비의 input 이미지들을 처리한다. 그러나 input 이미지들은 임의의 가로세로 비일 것이다. 그래서 Vision은 이미지가 적합하도록 크기를 조정하거나 자른다.
  • 최상의 결과를 위해, 모델로 학습된 이미지 레이아웃과 일치하도록 request의 imageCropAndScaleOption 프로퍼티를 설정하라.
  • 사용가능한 분류 모델의 경우, 달리 언급이 없다면 centerCrop 옵션이 적합하다.

Run the Vision Request

  • 처리할 이미지로 VNImageRequestHandler 객체를 생성하라, 그리고 그 객체의 perform(_: ) 메서드로 requests를 전달하라.
  • 이 메소드는 동기적으로 실행한다. - requests가 실행되는 동앟ㄴ 메인 큐가 봉쇄되지 않도록 백그라운드 큐를 사용하라.
DispatchQueue.global(qos: .userInitiated).async {
    let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
    do {
        try handler.perform([self.classificationRequest])
    } catch {
        /*
         This handler catches general image processing errors. The `classificationRequest`'s
         completion handler `processClassifications(_:error:)` catches errors specific
         to processing that request.
         */
        print("Failed to perform classification.\n\(error.localizedDescription)")
    }
}
  • 많은 모델들은 이미지들이 올바르게 표시하도록 지향되어지는 훈련을 받는다.
  • 임의의 방향으로 input 이미지들의 제대로된 처리를 보장하기 위해, 이미지 request handler에 이미지의 방향으로 전달하라.

Handle Image Classification Results

  • Vision request의 completion handler는 request가 성공했는지 또는 오류가 발생하였느지 여부를 나타낸다. 
  • 만약 성공했다면, results 프로퍼티는 ML 모델로 확인된 분류 가능을 기술하는 VNClassificationObservation 객체를 포함한다.
func processClassifications(for request: VNRequest, error: Error?) {
    DispatchQueue.main.async {
        guard let results = request.results else {
            self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
            return
        }
        // The `results` will always be `VNClassificationObservation`s, as specified by the Core ML model in this project.
        let classifications = results as! [VNClassificationObservation]


반응형