iOS & WatchOS 앱에 ML 적용해보기 시리즈
본론으로 들어가기 전에..
이 시리즈는 SwiftUI를 이용한 iOS 앱과, 그에 연동되는 Apple Watch 앱을 이용하고,
Apple Watch에서의 CoreMotion 프레임워크를 이용해 가속도 센서의 값들을 불러와 데이터셋으로 만든 이후,
Create ML을 이용해 모델을 생성하여 상기한 데이터셋을 기반으로 학습시킵니다.
이후 학습시킨 모델을 CoreML 프레임워크로 불러와, 애플 워치의 가속도 센서 값을 이용해 실시간으로 유저가 허리를 굽히고 팔을 내렸는지(쓰레기를 줍는 행동을 하였는지) 여부를 판별하는 것까지를 목표로 합니다.
Machine Learning에 대한 이론적인 내용은 깊게 다루지 않습니다.
실제로 간단하게 모델을 만들어, 적당히 tuning하여 적용해보는 것을 목표로 합니다.
Apple Developer Academy의 Mini Challenge 3를 진행하다, 허리를 굽힌 횟수 (정확히는, 플로깅하면서 쓰레기를 주운 횟수)를 카운팅하는 기능을 구현해야 했다.
애플 워치를 이용해 가속도센서와 회전가속도값을 측정해, 적당한 임계값을 정해 측정하면 되지 않을까- 아니면, 가속도값을 적분시켜 y값 변화량(위아래 변화량)을 이용하면 가능하지 않을까- 라는 막연한 생각으로 시도해 보았다.
그러나, 결과적으로 잘 작동하지는 않았는데, 민감도를 높이면 팔을 흔드는 행동으로도 쓰레기 줍기 카운팅이 되기 일쑤였고, 그렇다고 민감도를 너무 낮추어 놓으면, 잘 인식하지 못해서... 답이 없어 보였다.
그래서 결국 모델 생성해서 직접 학습시키던가, 아니면 다른 방법으로 대체해야 겠다- 라고 생각했고, 팀원들과 상의했다.
당연히 다른 방법으로 대체하게 되지 않을까- 라고 생각했으나, 의외로 한번 모델 만들어서 테스트하는게 가능하다면, 시도해보자 라는 의견이 나왔고, 그래서 시도해 본다...!
마침 요즘 AI.. 딥러닝.. 머신러닝.. 이쪽도 슬슬 공부해서 공모전 같은 곳에 써먹을 수 있을 정도는 해보고 싶었고, 좋은 기회라고 생각했다.
개발환경
- M1 MacBook Pro 14"
- XCode (version 14.3.1)
- iPhone 14
- Apple Watch S8 (45mm)
CreateML로 모델 생성하기
CreateML 프로젝트 생성
Xcode - Open Developer Tool - Create ML 을 선택해줍니다
New Document를 눌러줍시다
우리가 하고 싶은 것은, Apple Watch의 CoreMotion의 자이로 센서의 값들을 이용한 판별입니다.
이를 위해서 Activity Classification을 선택해 줍시다.
그리고 적당히 프로젝트명과 설명을 입력해 주고 생성합시다.
모델 학습 세팅
프로젝트 생성 직후 화면
Parameters
- Maximum Iterations
- Model 학습 과정에서 최대로 학습을 반복하는 수. 이 횟수만큼 전체 데이터셋을 반복하여 학습하게 된다.
- Batch Size
- 모델이 한 번에 학습하는 데이터셋의 개수.
- 예를 들어, 전체 training data set의 개수가 1000개이고, Batch Size가 50이라면, 50개의 data set을 묶어 20개의 batch를 만들고, 전체 training data set을 학습할 때 20번의 training을 하게 된다.
- Prediction Window Size
- 어떤 행동을 인식하기 위해 사용하게 되는 data의 개수.
- 예를 들어, Prediction Window Size가 100이라면, 그 시점부터의 과거 데이터의 샘플을 100개 정도 사용한다는 것.
- 더 자세하게는, 나의 경우에, 워치에서 가속도 센서에서 데이터를 받아오는 주기가 1/60초(60Hz) 일 때, 과거 100/60초 만큼의 데이터를 이용하여 쓰레기를 줍는 행동을 했는 지를 판단한다는 것.
- Sample Rate
- 초당 센서 데이터 샘플 수집 개수.
- Sample Rate가 60이라면, 1초에 센서(이 경우에는, 워치의 가속도 센서) 데이터를 60개 (60Hz) 받아온다는 것.
Data
- Training Data
- 모델에게 학습시킬 Data Set.
- Class별로 폴더를 만들어 분류해 놓으면 된다. (아래 사진과 같이 구분하고, 상위 폴더를 선택해주자.)
- 나의 경우, 쓰레기를 줍는 행위와 아닌 행위 두 개의 Class로 구분해 놨는데, 아마 Plogging / Walking / Running / Standing / ... 등으로 수정해야 할 듯 하다.
- Validation Data
- Training Data로부터 자동으로 일부분을 가져와 사용하게 된다. 따로 설정해줄 필요는 없는 셈.
- Testing Data
- Training Data와 같은 방법으로 폴더링 후, 넣어주면 된다.
- Training Data에 사용되지 않은 데이터들을 넣는 것을 추천한다. 재사용하게 되면 모델 학습이 정상적으로 이루어지지 않을 수 있다.