티스토리 뷰
Vision과 CoreML로 이미지 분류하기
Vision 프레임워크로 사진 전처리를, CoreML 모델로 분류(Classification)를 해보십시오
OverView
CoreML 프레임워크와 함께 당신은 입력 데이터 분류를 위한 훈련된 ML(Machine Learning) 모델을 사용할 수 있습니다. Vision 프레임워크는 이미지에 분류모델을 적용하기 위해, ML 작업을 보다 쉽게 신뢰성있게 처리하기위해 사용되며 CoreML과 함께 동작합니다.
해당 샘플 앱은 아래의 예시 스크린샷에서 볼 수 있듯이 1000 여개의 분류 카테고리를 통해 이미지를 식별 할 수 있는 분류모델 중 하나인 MobileNet Model 오픈소스를 사용하고 있습니다.
샘플 앱 미리보기
해당 샘플 앱을 보기 위해 프로젝트를 빌드 & 실행해줍니다. 그 다음 이미지를 선택하기 위해 샘플앱의 툴바에 있는 버튼을 사용합니다. 이 후 샘플앱은 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
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
iOS 개발문서 - 강한순환참조(strong reference cycle) 문제 (3) | 2020.04.09 |
---|---|
iOS 개발문서 - ARC 동작방식과 strong 참조원리 (0) | 2020.04.08 |
iOS ML모델 프레임워크, CoreML 문서개요 (0) | 2020.03.29 |
CocoaTouch Framework Apple 공식 문서 개요 (0) | 2020.03.19 |
이벤트처리 및 반응, UIResponder iOS 문서 개요 (0) | 2020.03.18 |
- Total
- Today
- Yesterday
- swift언어
- 부스트코스
- Collection
- swift
- Swift 알고리즘
- 컬렉션
- 김프매매
- 알고리즘문제
- 자연어처리
- 개발자문서
- swift string
- ios
- swift 기초
- swift reduce
- 프로토콜
- swift알고리즘
- 백준swift
- swift 문자열
- 스위프트
- 프로그래머스swift
- publisher
- swift문제
- Protocol
- CoreML
- 프로그래머스
- 알고리즘
- SwiftUI
- createML
- 백준알고리즘
- uikit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |