이 튜토리얼에서는 iOS와 macOS 앱에 바로 적용할 수 있는 맞춤형 강아지 품종 분류 Core ML 모델을 직접 학습시키는 방법을 다룹니다. 튜토리얼이 끝나면 여러분의 모델은 서로 다른 5가지 품종의 강아지를 구분할 수 있게 됩니다.
몇 년 전 Apple이 머신러닝·인공지능 스타트업 Turi를 약 2억 달러 이상의 금액으로 인수했다는 사실을 기억하시는 분도 있을 겁니다. Turi는 짧은 시간 안에 고성능 머신러닝 모델을 만들 수 있는 강력한 도구를 제공합니다.
이번 튜토리얼에서는 Mac에 Turi Create를 설치하고, Python 스크립트를 작성한 뒤, 그 스크립트로 Core ML 모델을 학습시키는 과정까지 진행합니다. 완성된 모델 파일은 Xcode 프로젝트에 바로 드래그해서 앱에 손쉽게 적용할 수 있습니다.
시작하기 전에
본격적인 머신러닝 작업에 들어가기 전에 먼저 Turi와 Python을 설치하고, 하드웨어와 소프트웨어가 Turi의 요구 사양을 충족하는지 확인해야 합니다.
시스템 요구 사항
다른 소프트웨어와 마찬가지로 Turi Create에도 몇 가지 요구 사항이 있으며, 공식 GitHub 페이지에서 자세한 내용을 확인할 수 있습니다.
Turi Create가 지원하는 환경:
- macOS 10.12 이상
- Linux (glibc 2.12 이상)
- Windows 10 (WSL 경유)
Turi Create의 필수 요구 사항:
- Python 2.7, 3.5, 3.6
- x86_64 아키텍처
- 최소 4GB RAM
결론적으로, Mac이 그럭저럭 최신형이라면 Turi Create를 실행하는 데 문제가 없습니다. 다른 운영체제에서 따라 해도 되지만, 일부 단계를 환경에 맞게 수정해야 할 수 있습니다.
Turi Create 설치
Turi Create 설치는 생각보다 간단합니다. 특히 명령줄 인터페이스에 익숙하다면 더욱 그렇습니다. 더 최신 버전의 Python을 사용해도 되지만, 이 튜토리얼에서는 Python 2.7을 기준으로 진행합니다.
macOS Mojave에는 Python 2.7이 기본으로 설치되어 있으므로, 버전만 확인하면 됩니다. Mac에서 응용 프로그램 > 유틸리티 > 터미널을 열거나, Command-Space 단축키로 터미널을 검색해 실행하세요.
Mac에 설치된 Python 버전을 확인하려면 다음 명령어를 입력합니다:
$ python --version터미널에 Python 버전이 출력되며, 콘솔 화면은 대략 아래와 같습니다.

만약 버전이 Python 2.7이 아니거나 어떤 이유로 설치되어 있지 않다면, 해당 링크에서 먼저 설치하세요. 출력 결과가 위와 비슷하다면 바로 진행할 준비가 된 것입니다.
참고: Apple이 권장하는 방식대로 가상환경(virtual environment)에 Turi Create를 설치하는 것을 선호하는 분들도 있습니다. 하지만 여기서는 설명을 단순화하기 위해 시스템에 바로 설치하겠습니다.
Turi Create를 설치하려면 터미널에 다음 명령어만 입력하면 됩니다:
$ pip install turicreate끝입니다! 이제 Mac에 Turi Create가 성공적으로 설치되었으며, 곧바로 사용할 준비가 되었습니다. 이미지 분류, 객체 탐지, 회귀 등 다양한 유형의 모델을 만들 수 있습니다.
데이터셋 준비
모든 머신러닝 모델에는 데이터셋이 필요합니다. 이 튜토리얼에서는 이미지 분류가 필요한 간단한 강아지 품종 분류 모델을 학습시킵니다. 데이터는 스탠퍼드 대학교의 Dogs Dataset을 활용합니다.
Turi가 미리 분류된 이미지들을 인식하려면, 이미지가 나타내는 대상별로 폴더를 정리해야 합니다. 예를 들어 골든 리트리버 사진은 한 폴더에, 라브라두들 사진은 다른 폴더에 모아두는 식입니다.
설명의 편의를 위해 스탠퍼드 데이터셋의 수백 개 품종 중 5개만 사용하지만, 원한다면 원하는 만큼 많은 품종을 추가할 수 있습니다. 저는 미리 정리해서 저장소(repository)로 만들어 두었습니다. 품종을 더 추가하고 싶다면 폴더를 새로 만들고 원하는 이름을 붙이기만 하면 됩니다.
폴더 구조
눈치채셨겠지만, 데이터셋을 어떻게 구성하느냐가 모델 학습 성패를 좌우합니다. Turi Create가 어떤 이미지가 어디에 속하는지 파악할 수 있는 유일한 방법이 폴더 구조이기 때문입니다. 지금부터 폴더를 정리해 두세요.

위 계층 구조 다이어그램을 보면 무엇을 해야 할지 명확할 겁니다. 계속 진행하기 전에 반드시 이 구조대로 폴더를 배치하세요. 이름을 바꾸거나 구조를 다르게 구성하고 싶다면, 그 내용을 별도로 기록해 두어야 합니다.
분류기 학습시키기
준비가 끝났으니 이제 이 튜토리얼의 핵심인 분류기 학습으로 들어갑니다. 주로 Python을 사용하게 되는데, 처음 접하는 분이라도 걱정하지 마세요. 각 단계마다 자세히 설명해 드리니 궁금한 점이 있다면 댓글로 남겨주세요.
Python 파일 생성
먼저 코드를 작성할 Python 파일이 필요합니다. Atom 같은 편집기나 PyCharm 같은 통합 개발 환경(IDE)이 이미 있다면, 그곳에서 dog_breeds.py라는 빈 파일을 생성하세요.
저처럼 좀 더 개발자스러운 방식을 선호한다면 터미널로 동일하게 만들 수 있습니다. 이 파일은 images 폴더와 같은 위치인 ml_classifier 폴더 안에 만들어야 하며, 최종 계층 구조는 다음과 같습니다:

새 파일을 만들려면 먼저 대상 디렉터리로 이동합니다:
$ cd ml_classifier그다음 dog_breeds.py라는 이름의 새 파일을 생성합니다.
$ touch dog_breeds.py완성! 폴더, 파일, 이미지가 모두 제자리에 있으니 다음 단계로 넘어갈 준비가 되었습니다. 이후 Xcode로 파일을 열 것이므로, Xcode가 설치되어 있고 최신 버전으로 업데이트되어 있는지 확인하세요.
데이터셋 이미지 불러오기
드디어 방금 만든 Python 파일을 통해 Turi에게 할 일을 지시할 차례입니다. 파일을 더블클릭하면 Xcode가 설치되어 있을 경우 기본 프로그램으로 열립니다. 없다면 다른 편집기나 Python IDE를 사용해도 됩니다.
1단계 — 프레임워크 임포트
import turicreate파일 상단에서 Turi Create 프레임워크를 임포트해야 합니다. 필요하다면 as <이름> 형태로 참조 이름을 붙일 수 있습니다. 예를 들어 코드에서 turicreate를 tc로 줄여 부르고 싶다면 이렇게 작성합니다:
import turicreate as tc이렇게 하면 turicreate를 매번 입력하는 대신 tc로 호출할 수 있습니다. 이 튜토리얼에서는 혼동을 줄이기 위해 전체 이름인 turicreate를 그대로 사용하겠습니다.
또한 폴더 이름 처리 등 운영체제 관련 작업을 위해 os라는 Python 라이브러리도 필요합니다. 다음 한 줄을 추가해 임포트하세요:
import os2단계 — 이미지 불러오기
data = turicreate.image_analysis.load_images("images/")이 코드는 데이터셋의 모든 이미지를 data라는 변수에 저장합니다. dog_breeds.py 파일과 images 폴더가 같은 디렉터리에 있으므로 경로를 "images/"로 지정하기만 하면 됩니다.
3단계 — 레이블 정의
Turi Create가 모든 이미지를 불러왔다면, 이제 폴더 이름을 레이블(label) 이름과 연결해야 합니다. 이 레이블 이름이 바로 iOS나 macOS 앱에서 Core ML 모델을 사용할 때 반환되는 값입니다.
data["label"] = data["path"].apply(lambda path: os.path.basename(os.path.dirname(path)))이 코드는 모든 폴더 이름을 "label" 이름에 매핑합니다. 예컨대 "cocker_spaniel" 폴더에 들어 있는 이미지들이 실제로는 코커 스패니얼이라는 사실을 Turi Create에 알려주는 역할을 합니다.
4단계 — SFrame으로 저장
SFrame을 처음 들어보신다면 간단히 말해, 모든 데이터(여기서는 이미지)와 모든 레이블(여기서는 강아지 품종)을 담은 사전형(dictionary) 구조라고 생각하시면 됩니다. 다음과 같이 저장합니다:
data.save("dog_classifier.sframe")이렇게 하면 레이블이 지정된 이미지들이 저장되어 다음 단계에서 활용됩니다. SFrame은 머신러닝 업계에서 널리 쓰이는 표준적인 데이터 타입입니다.
학습과 테스트
Turi Create가 레이블이 지정된 이미지를 모두 확보했다면, 마지막 관문인 모델 학습 단계로 진입합니다. 또한 데이터를 분할해 80%는 학습에, 20%는 학습 완료 후 모델 테스트에 사용하도록 설정합니다. 덕분에 우리는 수동으로 테스트할 필요가 없습니다.
1단계 — SFrame 불러오기
이제 앞서 만든 SFrame을 불러옵니다. 이 데이터를 나중에 학습용과 테스트용으로 나누게 됩니다.
data = turicreate.SFrame("dog_classifier.sframe")이 코드는 이전 단계에서 저장한 SFrame을 SFrame 타입의 data 변수에 할당합니다. 다음으로 데이터를 학습용과 테스트용으로 분할해야 합니다. 앞서 언급했듯이 80:20 비율로 나눕니다.
2단계 — 데이터 분할
데이터를 분할할 차례입니다. SFrame 코드 아래에 다음을 추가하세요:
testing, training = data.random_split(0.8)이 코드는 데이터를 80:20 비율로 무작위 분할해 각각 testing과 training 변수에 할당합니다. 이제 Turi가 자동으로 모델을 평가해 주므로, 테스트 이미지를 일일이 준비하거나 앱을 직접 만들 필요가 없습니다. 조정이 필요하면 실제 앱에 구현하기 전에 Python 파일 안에서 바로 수정할 수 있습니다.
3단계 — 학습, 테스트, 내보내기
여러분의 노력이 마침내 결실을 맺는 순간입니다! 이 Python 코드 한 줄로 Turi Create에 모델 학습을 지시하면서, 사용할 아키텍처도 함께 지정합니다.
classifier = turicreate.image_classifier.create(testing, target="label", model="resnet-50")즉, 앞서 지정한 testing 데이터를 사용해 labels(폴더 구조 기반)를 예측하되, 가장 정확도가 높은 머신러닝 아키텍처 중 하나인 resnet-50을 활용하라고 지시하는 것입니다.
테스트 데이터로 모델의 정확도를 검증하려면 다음을 추가합니다:
testing = classifier.evaluate(training)print testing["accuracy"]이 코드는 지정한 training 데이터를 사용하고, 테스트 결과를 testing 변수에 저장합니다. 참고로 여기서는 정확도(accuracy)를 출력하지만, Turi Create의 API를 충분히 살펴보면 다른 지표들도 출력할 수 있습니다.
마지막으로, 알아보기 쉬운 이름을 붙여 모델을 파일 시스템에 저장합니다. 단 두 줄이면 끝납니다:
classifier.save("dog_classifier.model")classifier.export_coreml("dog_classifier.mlmodel")물론 다른 형식으로 저장할 수도 있지만, 이 예제에서는 Core ML 모델(.mlmodel)로 저장했습니다.
실행과 결과 확인
iOS 개발자 여러분께 당부드립니다. 이건 자동으로 빌드되며 오류를 늘어놓는 Xcode 프로젝트가 아닙니다! 방금 작성한 코드를 실행하려면 터미널을 통해야 합니다.
Python 파일 실행하기
실행 방법은 아주 간단합니다. 올바른 디렉터리에 있는지 확인한 뒤, 터미널 창에 다음 명령어만 입력하세요:
python dog_breeds.py결과 확인
몇 분간의 학습이 끝나면 images 폴더와 dog_breeds.py 파일 옆에 SFrame, 모델 폴더, 그리고 바로 그 .mlmodel 파일, 즉 여러분의 Core ML 모델이 생성됩니다!
또한 터미널 창에 아래와 비슷한 결과물이 출력됩니다.

여기에는 학습 정보와 학습 정확도, 처리된 이미지 수 등 유용한 정보가 담겨 있어, 모델을 직접 사용하기 전에도 성능을 분석할 수 있습니다.
마무리
이 튜토리얼을 제작하는 만큼 재미있게 읽으셨기를 바랍니다! 다음 단계로 나아가는 방법을 몇 가지 소개합니다. Core ML 모델을 iOS 앱에서 활용하는 법을 배우고 싶다면 아래 튜토리얼을 확인해 보세요:
Get Started With Image Recognition in Core ML
기술의 발전으로 이제 기기의 내장 카메라만으로 물체를 정확하게 식별할 수 있는 시대가 되었습니다…
code.tutsplus.com
이 튜토리얼에서는 결과물인 dog_classifier.mlmodel 모델을 실제 iOS 앱에 구현하는 방법을 보여줍니다. 라이브 영상 스트림을 파싱하고 개별 프레임을 추출해 이미지 분류에 활용하는 방법도 함께 배울 수 있습니다.
이 튜토리얼에 대해 궁금한 점이나 의견이 있다면 아래 댓글로 언제든 남겨주세요. 피드백, 질문, 그리고 여러분이 배운 내용을 어떻게 활용하셨는지 듣는 것을 항상 기다립니다.
제 작품을 응원하는 방법
"박수" 버튼을 아깝지 않게 눌러주시고, 소셜 미디어에 이 튜토리얼을 공유해 주시며, Twitter에서 저를 팔로우해 주세요!
Vardhan Agrawal (@vhanagwal) | Twitter
Vardhan Agrawal(@vhanagwal)의 최근 트윗. 독학으로 배운 #iOS 개발자이자 #강사, 그리고 인간입니다…