본문 바로가기

트렌드 한눈에 보기/산업 트렌드

실전에서 사용하는 딥러닝 - : IMU 활용 속도 추정 (내 딥러닝이 망한 이유)

 딥러닝 딥러닝 말로만 들었지, 실생활에서 사용되는 것을 본 적은 거의 없다. 물론 알게모르게 많이들 쓰이고 있을 테지만, 내가 직접 사용하는 일이 없었다는 뜻이다. 그러다가 chatGPT가 나와 내 인식을 바꿔줬다. "딥러닝 참 유용하구나!" 현재로서는 구글보다도 chatGPT에 물어보는 일이 더 많아졌다. 물론 틀린 답을 얻는 비율도 그만큼 늘어났지만...

 "뭐가 됐든 딥러닝을 써보긴 해야겠다" 싶어 IMU를 활용한 속도 추정에 딥러닝을 활용해보기로 했다. 위 논문은 하나의 IMU를 활용해서 사람의 보행 속도를 추정하는 방법에 관한 것이다.

 

 IMU는 가속도와 각속도를 측정하는 센서이다. 지자기 센서가 (나침반 역할) 추가로 들어있지만, 금속이 안들어가는 곳이 없는 우리 생활에서 지자기 센서는 오차를 낳기 쉽고 거의 쓸모가 없다. 쓰고 보니, 휴대폰 나침반 어플로는 남북 방향을 명확히 알았던 것 같은데, 지자기 센서를 너무 불신하는 것은 아닌가도 싶긴 하다. 여튼 이 글을 쓰기 전까지는 지자기 센서는 만져본 적도 없다.

지긋지긋한 IMU coordinate

 가속도와 각속도가 있으면 굳이 딥러닝까지 가지 않더라도 바로 속도를 추정할 수 있을 것 같지만, 그렇게 녹록지가 않다. 일단 가속도 센서는 노이즈가 너무 많이 끼어 있다. 각속도 센서는 적분을 통해 센서의 방향을 추정해서 중력의 영향을 없애는 것에 사용되지만, 적분 과정에서 Drift가 발생한다. 노이즈와 Drift, IMU를 센서로 활용하기 위해서는 절대적으로 해결해야 하는 문제인 것이었다... 딥러닝을 만나기 전까지는.

 

 기존에 노이즈와 Drift 제거를 위해 각종 필터를 지지고 볶았던 것에 비해, 딥러닝은 그런 것 하나도 신경쓰지 않고도 속력을 추정하고, 센서의 방향을 추정해낸다. 이는 물론 Ground Truth 데이터가 있을 때 가능한 것이다. 예를 들어, 속력을 추정하는 문제에서는 IMU로 가속도와 각속도를 수집하고 있다면, 광학 센서 등을 통해 속도 참값 (Ground Truth)를 어떻게 해서든지 알고 있어야 한다는 뜻이다. 물론 광학센서는 비싸기도 할 뿐더러 실험실 환경에서만 사용한 수준인지라 접하기가 힘들다.

 

 그래서 공개된 데이터셋을 사용할 수 있다. 위 자료는 IMU를 17개 정도는 달아서 인간의 움직임을 측정한 데이터 모음이다. 저 정도로 IMU를 갖고 있으면 딥러닝 없이도 속력 추정이 된다. 스무 명 정도 데이터를 공개했기에 상당한 분량으로 학습이 가능했다.

 

 그래서 내가 하려던 것은

1. 속력 추정

2. 딥러닝 활용 IMU 센서값 처리

3. 오픈 데이터셋을 딥러닝 학습용으로 활용

4. 간단한 테스트 데이터셋을 제작하여 딥러닝 모델 검증

위와 같은 구성이라고 볼 수 있겠다. 참 쉽죠? 하지만 처참히 망했다. 그 몇 가지 이유에 대해 생각해보았다.

왼쪽은 논문에서 나왔던 딥러닝 아키텍처, 오른쪽은 내가 구현했던 딥러닝 모델이다. 최대한 논문을 보고 그대로 만든다고 했지만, 잘 됐는지 확인할 길이 없었다. 이게 첫 번째 문제다. 딥러닝 모델을 검증할 방법이 없다. 

그런 문제와는 별개로, 성능은 아주 잘 나왔다. 평균 0.2 m/s 정도였을까? 냉큼 테스트 데이터셋을 만들어서 시험해보았다. IMU를 매달고 런닝머신에서 3km/h로 걸으면서 값을 취득한 것이다. 여기서 두 번째 문제점, 테스트 데이터 셋의 참값이 없다. 오른쪽 위 그래프를 보면 알 수 있듯이, 인간의 실시간 보행속도는 런닝머신의 3km/h 처럼 일관된 숫자로 나오지 않는다. 약간 느려졌다가 가속, 약간 느려졌다가 또 가속의 반복인 셈이다. 이 정도 정확한 속도는 광학센서처럼 정확-정밀한 센서를 통해서만 구할 수 있다. 

 

테스트 데이터셋 결과

하지만 꿩대신 닭이라고, 테스트 데이터셋의 평균을 구하면 얼추 런닝머신의 3km/h 값에 근접할 것이라는 전제로 일단 모델을 돌려보았다. 위 그래프의 y 축이 속력 추정값 [m/s] 이다. 결론은, 평균 1.54 m/s 정도 나왔던 것 같다. 이는 시속 5 km/h가 넘는다. 오차가 상당히 큰 셈이다. 어라? 학습할 때는 오차 0.21 m/s 정도였는데? 여기서 세 번째 문제점. 학습데이터에서 과적합 overfitting이 발생한 것이다. 오버피팅을 실제로 접하기 전까지는 그냥 당연한 머신러닝의 문제점이라고만 생각했다. 학습된 데이터로 결과를 내놓으니, 학습 데이터의 평균값을 따라가는 것이 당연한 게 아닌가? 하지만 막상 실습을 하려고보니, 학습 데이터 너머의 세상을 가늠해보기가 여간 어려운 것이 아니다. 좀 허탈하기도 하면서, 내가 정말 머신러닝을 하긴 했구나 싶어 뿌듯하기도 하다. 직접 해보기 전까지는 모르는 문제점에 직면했기 때문이다. 물론 똑똑한 사람들은 직접 해보기 전에 알았겠지만, 난 아니었다.


 다시 한 번 내가 하려고 했던 내용 정리.

1. 속력 추정

2. 딥러닝 활용 IMU 센서값 처리

3. 오픈 데이터셋을 딥러닝 학습용으로 활용

4. 간단한 테스트 데이터셋을 제작하여 딥러닝 모델 검증

 세 가지 문제가 발생했는데, 목적이라고 할 수 있는 1번을 제외한 모든 항목에서 문제가 발생했고 결과적으로 1번 항목을 이루지 못했다. 그럼 다음 action item을 정해야 하는데, 아직 모르겠다. 어떻게 해야 할까?