티스토리 뷰

반응형

 


Vision과 CoreML로 이미지 분류하기

Vision 프레임워크로 사진 전처리를, CoreML 모델로 분류(Classification)를 해보십시오

 


OverView

CoreML 프레임워크와 함께 당신은 입력 데이터 분류를 위한 훈련된 ML(Machine Learning) 모델을 사용할 수 있습니다. Vision 프레임워크는 이미지에 분류모델을 적용하기 위해, ML 작업을 보다 쉽게 신뢰성있게 처리하기위해 사용되며 CoreML과 함께 동작합니다.

해당 샘플 앱은 아래의 예시 스크린샷에서 볼 수 있듯이 1000 여개의 분류 카테고리를 통해 이미지를 식별 할 수 있는 분류모델 중 하나인 MobileNet Model 오픈소스를 사용하고 있습니다.

이미지 식별의 예시, 1,2 순위의 식별 결과를 보여주고 있습니다. 

 

 


샘플 앱 미리보기

해당 샘플 앱을 보기 위해 프로젝트를 빌드 & 실행해줍니다. 그 다음 이미지를 선택하기 위해 샘플앱의 툴바에 있는 버튼을 사용합니다. 이 후 샘플앱은 Vision을 사용해 CoreML모델을 선택된 이미지에 적용 시키고 신뢰 레벨 점수 순으로 상위 2개의 분류 결과를 라벨로 보여줍니다.

 

 


CoreML 모델과 함께 Vision 설정하기

CoreML은 자동적으로 ML 모델로 쉽게 접근할 수 있도록 하는 Swift Class를 생성합니다.
 이 샘플을 예시로 보면, CoreML은 자동적으로 MobileNet 모델로부터 MobileNet Class를 생성합니다. 모델을 사용한 Vision 요청을 설정하기 위해 해당 클래스이 인스턴스를 만들고 VNCoreMLRequest 객체를 생성하기 위한 해당 인스턴스의 model 프로퍼티를 사용합니다. 당신이 요청을 실행 뒤 모델로부터 그 결과를 받기 위해 필요한 메서드를 구체화 하려면 요청 객체의 completion 핸들러를 사용하시면 됩니다.

let model = try VNCoreMLModel(for: MobileNet().model)

let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
		// completion Handler 클로져 내에서 요청 이후 결과를 업데이트 하기위한 메서드를 실행합니다.
    self?.processClassifications(for: request, error: error)
})
request.imageCropAndScaleOption = .centerCrop
return request



ML 모델은 고정된 종횡비 내에서 입력 된 이미지들을 처리합니다.
하지만, 입력된 이미지들은 임의적인 종횡비를 가질 수 있기 때문에 Vision은 해당 이미지를 적절히 조절하거나 잘라내야만 합니다. 최적의 결과를 위해 request 객체의 imageCropAndScaleOption 프로퍼티를 설정하여 이미지 레이아웃을 훈련된 모델과 일치하도록 만드세요. 사용가능한 분류모델을 위해서 명시할게 없다면 VNImageCropAndScaleOption.centerCrop 옵션이 적당합니다.

 

 


Vision 요청 실행하기

처리된 이미지와 함께 VNImageRequestHandler객체를 생성하세요. 그 후 해당 객체의 perform(_:) 메서드로 요청들을 보내세요. 해당 메서드는 동기적으로 실행합니다.
* 백그라운드 큐를 사용해서 요청이 실행되는 동안 메인 큐가 블록되지 않도록 하세요!

// 백그라운드 큐로 비동기적으로 VNImageRequestHandler 객체의 perform 메서드를 실행하여 메인큐의 blocking을 방지할 수 있습니다. 
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)")
    }
}



대부분의 모델들은 표시를 위해 올바르게 맞춰진 이미지에 의해서 학습됩니다.
임의의 방향으로 입력 이미지들을 적절히 처리할 수 있도록 이미지의 방향을 이미지 요청 핸들러로 전달하세요. (해당 샘플 앱은 CGImagePropertyOrientation 타입이 UIImageOrientation 값에 따라 변환될 수 있도록 생성자, init(_:)을 갖고 있습니다. )

extension CGImagePropertyOrientation {
    /**
     Converts a `UIImageOrientation` to a corresponding
     `CGImagePropertyOrientation`. The cases for each
     orientation are represented by different raw values.
     
     - Tag: ConvertOrientation
     */
    init(_ orientation: UIImageOrientation) {
        switch orientation {
        case .up: self = .up
        case .upMirrored: self = .upMirrored
        case .down: self = .down
        case .downMirrored: self = .downMirrored
        case .left: self = .left
        case .leftMirrored: self = .leftMirrored
        case .right: self = .right
        case .rightMirrored: self = .rightMirrored
        }
    }
}

 

 

 


이미지 분류결과를 처리하기

Vision Request(VNRequest)의 completion 핸들러는 요청이 성공했는지, 오류가 발생했는지를 알려줍니다. 만약 성공했다면, result 프로퍼티는 VNClassificationObservation 객체를 포함하게 됩니다. VNClassificationObservation 객체는 ML 모델에 식별 가능한 분류를 설명합니다.

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]

 

 

 

지적, 의견 환영합니다. 감사합니다 ^-^//

 

 

참고 자료 ▼
Classifying Images with Vision and CoreML

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함