[눕따 개발일지 #2] Gyro Data와 CreateML를 활용한 자세 인식 삽질기

TaeUk·2025년 3월 24일
0

Project 정리

목록 보기
8/8
post-thumbnail

🙉 자세 인식을 하려던 이유

눕따의 초점은 단순한 스마트폰 사용 시간이 아니라, “누운 상태에서 스마트폰을 얼마나 쓰는지”였다.

대부분의 사람들이 스마트폰을 가장 오래 사용하는 시간은 바로 잠들기 전, 침대에 누운 상태이기 때문이다.

이 시점을 정확히 인식해야 진짜 습관 개선에 도움이 되는 앱이 될 수 있다고 생각했다.

그래서 사용자의 자세를 감지하는 기능을 기획했다. 정면, 측면 등 다양한 누운 자세를 인식하고 그에 따라 피드백을 제공하는 방식을 생각하였다.


🙊 Gyro 센서 데이터 수집 과정

자세 인식을 구현하기 위해 가장 먼저 한 건 직접 데이터 수집용 iOS 앱을 만드는 것이었다.

앱 안에는 총 9개의 버튼이 있었는데, 기본 3가지 자세인

  • 정면으로 누움
  • 측면으로 누움
  • 기울여 누움

여기에 각 자세마다

  • 오른쪽으로 폰을 돌려 사용
  • 왼쪽으로 돌려 사용
  • 폰을 세워서 사용

이라는 세부 사용 상황까지 고려해 총 9가지 상태를 버튼 하나로 라벨링하며 자이로 데이터를 수집할 수 있도록 구성했다.

센서 데이터는 단순 Gyro(회전) 값뿐 아니라, 가속도계(accelerometer) 값도 함께 수집했다. 그리고 초기 테스트 과정에서 발생한 Gimbal Lock 현상을 개선하여 CreatML을 통한 학습이 가능하도록 스마트폰의 자이로 데이터를 수집할 수 있게 만들었다!

그 결과, 자세한 회전 정보를 기반으로 학습에 쓸 수 있을 만큼 신뢰도 있는 자이로 데이터 로깅 앱을 구현할 수 있었다.

📌 초기 자이로 데이터 로깅 앱 UI 및 데이터 저장 형식

처음엔 3개의 라벨을 사용했다가 사용자의 자세에 대한 변수가 늘어남에 따라 총 9개의 버튼을 구성하였다!

데이터 수집을 위해 수십 번씩 직접 눕고, 방향을 바꾸고, 폰 각도를 조절하며 테스트를 반복했다.

그 과정은 정말 말 그대로...

“개발자”가 아니라 “눕는 자세 테스트 전문가”에 가까웠다. 😵‍💫


🙀 CreateML 학습 과정과 삽질

수집한 데이터를 기반으로, Apple의 CreateML Activity Classifier를 사용해 자세 분류 모델 학습을 시도했다.

이 라벨은 실제 앱에서 selectedPose 파라미터로 선택되어 자이로 + 가속도계 데이터를 기반으로 기록되었다.

하지만 실제로 모델을 적용해본 결과, 일부 자세에서 예상보다 정확도가 크게 떨어지는 문제가 나타났다.

학습 데이터셋에 이상이 있는지 확인하기 위해 각 자세별/축별로 분리된 데이터셋을 기준으로 Precision, Recall, F1 Score를 비교했다. 그리고 동시에 학습된 모델을 기반으로 실시간 자세 추론이 가능한 테스트 앱을 활용하여 여러 각도에서 자체 추론을 실험해보았다.

📌 관찰된 이슈

  • 정면 자세는 전체적으로 높은 정확도(0.95~1.0)를 보임
  • 하지만, 측면 자세는 일부 방향에서 Precision 또는 Recall이 60~70% 수준으로 낮았음
  • 특히, lying_on_left_side_left, lying_on_left_side_right는 예측 안정성이 떨어져 데이터 보강이 필요했음

무엇보다 문제였던 건, 학습 정확도는 높았지만 실제 사용 상황에선 전혀 쓸 수 없다는 것.

이후, 여러 실험 끝에 측면 자세의 DataSet에 이상이 있다는 것을 인지하였고, 데이터 증강을 통한 재검증과 재생성에 대한 추가 검증 필요성을 느꼈다!

하지만, 이 쯤에서부터 해당 기능을 실제 서비스에 반영할 수 없다는 것을 깨닫기 시작하였다... 😢

CreateML 모델의 정확도가 아쉬워도, "그래도 써볼 수는 있지 않을까?"라는 희망은 있었다.

그런데 진짜 문제는 바로 Apple의 보안 정책이었다.

iOS 환경에서는 앱이 완전히 종료되거나 백그라운드 상태일 경우 자이로스코프나 가속도계 데이터를 수집할 수 없다.

HealthKit처럼 백그라운드에서도 일부 데이터를 읽을 수 있는 API는 있지만 자세 데이터처럼 실시간 회전값을 읽는 기능은 명백히 제한되어 있었다. 결국, CoreMotion 기반의 자세 인식은 앱이 활성화된 상태에서만 가능하다는 치명적인 제약이 있었다.


🥺 결국 눕따는 방향을 전환했다...

자세 인식을 통한 디지털 디톡스 앱이라는 아이디어는 흥미롭고 매력적인 기능이었지만 현실적인 한계를 넘지 못했다. 보완 가능하였지만 정확도 문제도 있었고, 무엇보다 애플 정책상 백그라운드에서 센서 접근이 불가능했다.

그래서 결국 눕따 기능의 중심을 바꿨다.

누워있는 자세를 인식하는 대신, 수면 전 사용에 대해서 피드백을 하기로 결정하였다! 또한, iOS의 Screen Time API를 활용해 앱 사용 시간 및 사용 앱 종류와 사용 패턴을 분석하는 구조로 전환했다.

결과적으로 이 전환은 초기 아이디어를 버리는 것이 아니라, 현실적이고 실용적인 형태로 진화시킨 선택이었다.

🚧 삽질을 마무리하면서...

자세 인식 기능 개발과 방향 전환까지, 3주 넘는 시간을 흘려보내면서 솔직히 눕따 개발 일정이 꽤 늘어난 게 아쉬웠다.

그래도 이번 기회를 통해 CreateML을 처음 경험해봤고, 생각보다 강력하고 정확한 도구라는 인상을 받았다. 언젠가 CreateML을 제대로 활용한 프로젝트를 기획할 수 있을 것 같다는 확신도 생겼다.

기술적으로 하나의 기반을 익혔다는 점만으로도 이번 삽질은 나름 의미 있었다고 생각한다.

당시, 눕따의 기능 대부분은 구현이 마무리된 상태였고 개발 방향도 명확해진 덕분에 이제 남은 건 프로토타입 완성뿐. 이제 정말 끝이 조금씩 보이기 시작했다.

앞으로도 분명 또 삽질하겠지만.. 이번엔 꽤 의미 있는 삽질이었다고 그렇게 스스로 위안해본다 😅


이 글을 읽고 "어..? 나 얘긴데?" 싶다면
🛌 눕따 - 스마트폰 중독 방지 & 사용 습관 개선 앱 보러가기

profile
진짜 몰루

0개의 댓글

관련 채용 정보