Create ML로 나만의 Classifier 모델을 만들고 Core ML로 앱에서 사용해보는 End-to-End 예제 프로젝트입니다.
다음 그림은 모바일 기기 위에 머신러닝을 올리는 절차를 표현한 다이어그램이다. 크게 세 단계(학습, 변환, 추론)로 나눠지며, 이 저장소에서는 Create ML을 활용하여 모델을 만들고 Core ML을 활용하여 모바일 위에서 머신러닝을 사용해 봅니다.
최종적으로 모바일용 Classification 앱을 만들기위해 모바일 프로젝트를 생성합니다.
모바일 프로젝트(MyClassificationApp
)에서 File > New > Playground...
를 선택합니다.
여기서 주의할 점은 macOS 플랫폼을 선택하고 플레이그라운드를 만들어줘야 CreateML을 사용할 수 있습니다!
플레이그라운드를 어느 프로젝트와 어느 그룹에 넣을지 정합니다. 여기서는 MyClassificationApp
프로젝트에 추가하며, 이렇게 해야 모바일 프로젝트 안에 플레이그라운드 파일이 생성됩니다.
플레이그라운드가 모바일 프로젝트 안에 만들어졌음을 확인할 수 있습니다. 이제 Create ML 코드는 이 파일 안에 작성하면 됩니다.
다음 코드를 넣고 ①의 실행 버튼을 누르면 Assistant Editor에 ②처럼 ClassificatierBuilder가 만들어집니다. Assistant Editor는 ③을 클릭하면 나타납니다.
import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()
구글에 있는 아두이노와 모듈 사진을 종류별로 30개씩 준비했습니다.
저는 파이썬 라이브러리인 hardikvasa/google-images-download을 사용하여 구글로부터 데이터셋을 수집했습니다.
# install google-images-download
$ pip install google_images_download
$ cd ~/Desktop
# download 30 images searched on google with "arduino"
$ googleimagesdownload -k "arduino" -l 30
$ googleimagesdownload -k "breadboard" -l 30
$ googleimagesdownload -k "motor" -l 30
$ googleimagesdownload -k "resistor" -l 30
...
google-images-download
를 사용해 구글의 이미지를 다운받으면 아래와같이 검색 키워드에대한 폴더가 생기고, 해당 폴더 안에 이미지가 다운로드 됩니다.
다운로드 받았던 데이터셋을 Xcode에 드래그 & 드롭합니다.
학습이 끝나면 학습데이터와 검증 데이터에대한 모델의 accuracy를 알려줍니다. 아래의 경우는 학습 데이터에대해서는 93%와 검증 데이터에대해서는 94%의 결과를 나타냅니다.
이번에는 직접 찍은 아두이노 사진을 테스트 데이터셋으로 넣어서 accuracy를 확인합니다.
학습때와 마찬가지로 테스트 데이터셋 폴더를 Xcode에 드래그 & 드롭합니다
드롭을 하는 순간 테스트 데이터셋 폴더 안에 있는 이미지를 추론한 결과를 보여줍니다.
아래 스크린샷처럼 Core ML용 모델 아이콘을 모바일 프로젝트에 넣거나 다른 폴더에 저장할 수 있습니다.
여기까지가 모바일 머신러닝에서 학습과 변환단계였습니다. 다음으로는 만들어진 모델을 사용하여 추론하는 간단한 모바일 앱을 만들어보도록 하겠습니다.
Create ML에서 만든 Core ML 모델을 Xcode에서 열어보면 다음 화면이 나타납니다(①). 이번에 만든 Classification 모델 크기는 165 KB(②), 소스코드상에서 모델을 불러올때는 ImageClassifier
클래스를 통해 불러옵니다(③). 이 모델의 입력 포맷은 299X299 컬러 이미지이며, 출력 포맷에는 카테고리별 확률이 들어간 Dictionary와 가장 높은 확률의 카테고리 이름이 있습니다(④).
모델을 Xcode 프로젝트에 넣으면 자동으로 모델 이름의 클래스를 만들어 줍니다. 모델 이름의 클래스를 호출하여 코드상에서 모델을 사용할 수 있습니다.
앞에서 추가했던 모델(ImageClassifier
)을 인스턴스로 생성하고, prediction
메소드를 호출하여 결과를 받아냅니다.
import Vision
// create model
let model = ImageClassifier()
// predict
if let result = try? model.prediction(image: pixelBuffer) {
let predictedLabel = result.classLabel
let confidence = result.classLabelProbs[result.classLabel] ?? 0.0
label.text = "\(predictedLabel), \(confidence)"
}
- Machine Learning - Apple Developer
- Create ML | Apple Developer Documentation
- Core ML | Apple Developer Documentation
- WWDC17 - Core ML 발표자료
- WWDC18 - Core ML 2 발표자료
- 오픈세미나 - Machine Learning with Apple 슬라이드 자료
- MoTLabs Blog