ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코골이 감지 안드로이드 어플리케이션 만들기
    컴퓨럴/후로그람스 2020. 9. 30. 13:09

    코골이 감지 안드로이드 어플리케이션 만들기 프로젝트를 했다(2020.2~3) 코드를 전체 공개하는 건 문제의 소지가 있어서 그냥 만들었던 과정을 간단하게 적어보고자 한다. 

     원래는 펌웨어 개발자가 진폭 범위에서 규칙 기반으로 코골이 감지 기능을 구현하려 시도했지만 정확도가 낮아 오랜 기간 상용화에 어려움을 겪고 있었다. 오랫동안 하고 있던 해결 방법에 진척이 없다면, 완전히 다른 방법을 생각해볼 필요가 있다. 원래 동아리에서 머신러닝 공부를 해보기도 했고 음성 프로젝트도 해봤겠다 딥러닝을 이용하여 문제를 해결해 보기로 했다. 그리고 비슷한 소리 관련 프로젝트(비속어 감지)를 해봤던 친구들을 모아서 같이 일할 팀을 만들었다.

     동아리에서는 좋은 서버에서 딥러닝을 했지만 제품에 사용할 모델은 여러가지 제약 사항이 있었다. 먼저 사용자가 언제든 좋은 와이파이 환경에서 잠잔다고 보장할 수도 없었다. 또 모든 수면 소리를 서버에 보내 코골이를 감지하는 것은 꽤 큰 비용이 든다. 그래서 모바일에 모델을 이식해서 서버 없이 코골이 감지하는 기능을 구현해야 했다. 안드로이드를 한 번도 다루어 본 적은 없었지만 뭐 내가 처음부터 다 알고 프로젝트를 시작한적 있던가? 직접 문제를 부딪히면서 많이 배울 수 있다는 생각으로 바로 시작했다.

     

    데이터 라벨링 노동 줄이기

    http://www.datamarket.kr/xe/board_pdzw77/63632 투빅스 친구들이 LSTM을 활용했다.

     처음에는 기존에 친구들이 비속어 필터링 할 때 활용했던 LSTM 모델을 활용하여 500ms마다 소리를 판별하도록 구현했다. 비슷하게 구현하기 위해서 10초짜리 코골이 데이터(google audioset에서 받음)를 audacity를 활용하여 코골이 부분만 라벨링 하고 잘라 다른 소리와 섞어 학습했다. 학습 후 테스트 결과를 확인하니 코골이 라벨 recall이 많이 낮았다. 그래서 데이터 더 받아와야겠다 생각했는데 또 라벨링을 하려고 하니 엄청 막막쓰... 그대로 갖다 써서 꿀빠려 했다가 실패하고 라벨링 작업이 덜 들어가는 10초 melspectrogram 윈도우를 사용한 Resnet 모델로 바꿨다.(같이한 팀원들이 모델들을 빵빵하게 잘 써봐서 개선 방법을 잘 알았다. 너무너무 다행) 결과적으로 라벨링 작업을 줄이고도 1908개의 10초짜리 다양한 소리를 95%의 accuracy로 판별할 수 있었다.

     

    모바일을 위한 모델 경량화 및 이식

     Resnet 모델은 모바일에서 예측하는 데 소수계산이 많이 필요하고 무거운 문제가 있다. 그래서 팀원과 논의 후 모델을 Mobilenet으로 수정 했다. 경량화 후에도 거의 줄지 않은 94% 의 accuracy로 판별할 수 있었다. 모델 학습 후 tfLite 예제를 공부하고 안드로이드 애플리케이션에 모델을 이식했다. 그런데 예제의 경우 amplitude를 기반으로 ‘yes’, ‘no’ 등을 판단하는 애플리케이션이었다. 우리는 melspectrogram으로 학습했어서 예제 맞게 amplitude 기반으로 재학습 해보니 정확도가 떨어졌다. ㅜㅜ 그래서 amplitude를  melspectrogram으로 바꾸는 코드들을 찾다가 mfcc로 변환하는 코드를 찾았다. mfcc로 재학습 하니 accuracy를 유지할 수 있었고 바꿔도 되겠다 판단했다. 게다가 mfcc를 사용하여 전처리를 하니 차원이 줄어서 모델도 가벼워졌다.

     

    녹음 음질 문제

    모바일에 이식 후 실험해보니 실생활에서 조용한 상황에서 판별하지 못하는 문제가 있었다. 문제를 해결하기 위해 PCM 파일에 header를 추가해서 wav 파일을 만들고 막 디버깅해봤다. 학습할 때 사용한 무음은 백색소음이었지만 모바일에서는 무음을 모두 0으로 처리함을 발견했다. 며칠 동안 다양한 시도를 해보다가 녹음 옵션을 안드로이드 단에서 수정할 수 있음을 발견했다(아마 전화 통화 같은데서는 굳이 무음을 다 들려줄 필요가 없으니 없애버리는 처리를 하나보다). 그래서 VOICE_RECOGNITION으로 수정보니 원음에 가깝게 들리는 것을 발견하였고 모바일 코골이 분류기가 문제없이 잘 작동되었다.

    UI를 막 꾸미고 한건 아니다(그건 안드로이드 개발자 분꼐서 작업하신다)

     

    다른 개발자 분들이 만든 모델을 이용해 실제 제품 안드로이드/ios 어플리케이션을 개발 중이다. 어서 빨리 나와서 진짜 내가 만든 제품이 살아 숨 쉬는 걸 확인해봤으면 좋겠다.

    ----------------

    내가 만든 코골이 알고리즘을 활용해 베개가 출시되었다.

    조금 더 개선했으면 좋았을걸 하는 지점이 있긴 했지만 이 상태로도 프로덕션에 나가볼수 있겠다 결정되어 출시되었다.

    여담으로 내 친구집에 놀러갔다가 이 베개가 떡 하니 있어서 놀랐었다...

     

Designed by Tistory.