딥러닝

OpenPose로 사용자 동작 인식하기는 실패다. Mediapipe를 이용해보자.

lhg010524 2024. 8. 11. 13:48

호기롭게 Openpose를 다운받고 될 줄 알았지만 난관에 봉착했다. 알고 보니 저번에 실행한 Openpose는 모델만 로드하면 OpenCV에서 가볍게 돌아가는 모델이었고, 더 정확한 모델을 다운받으려면 터미널에서 경로인식 등을 통해 찾아주어야 하는데 Veclib를 자꾸 인식하지 못해 애를 먹었다. 

 

구글링과 챗지피티도 해결하지 못한 채, 포기했다. 가끔은 포기도 좋은 방법이고, 포기할 용기를 내야 한다.

 

합리화 100%.

 

여기서 드는 의문점은, 굳이 Openpose를 이용해야 하는가? 라는 의문점이었고 일단 러프하게 관절의 위치와 관절 사이 각도 값을 추출하는 것이 목표였기 때문에 좀 더 가볍게 돌아가는 MediaPipe 라이브러리를 사용하기로 했다. 이건 pip install을 통해 간단히 설치가 가능하다. 

 

전체적인 알고리즘은 https://www.youtube.com/watch?v=eHxDWhtbRCk 분의 영상을 참고했고, 이 분은 손가락 제스처 인식을 구현했다. 나는 추위, 더위를 인식하는 모델로 약간의 수정을 가했다. 

 

구현하고자 하는 사항은 총 3가지다.

 

1. 추위 / 더위 데이터셋 학습

 

 - 이 경우, 팔을 비비는 동작을 추위로, 옷깃을 잡아 펄럭거리는 동작을 더위로 인식하게 했다. 30초 동안 각각의 동작을 웹캠을 통해 녹화한다. 

- 30초 동안 녹화, 프레임 캡쳐 -> 이미지 RGB 변환해 Pose 모델에 전달 -> 인식된 관절 위치 저장 / 어깨, 팔꿈치, 손목 사이 각도 계산 -> 관절위치와 각도 포함된 데이터 저장이 주를 이룬다. raw 데이터와 시계열 데이터로 활영하기 위해 seq 데이터 각각을 따로 생성한다.

 

2. 모델 선정

 

- 여기서는 시계열 데이터를 학습할 것이기 때문에 LSTM 모델을 활용한다. 레이블 데이터(더위/추위) 원 핫 인코딩으로 변환하고 모델을 구축한다.

 

 

3개의 층으로 구성(LSTM 레이어, Dense 레이어(은닉층) , Dense 레이어(출력층))으로 구성된 간단한 모델이다.

 

- 모델을 학습한다. Epoch 50으로 돌리니 정확도 : 0.6898 - loss: 0.7792이 나왔고 영상에서는 200번 돌렸지만 내 인내심이 한계에 다다라 일단 50번 학습을 진행했다.

 

- 큰 불안정함을 보인다. 사실 200까지 해야 하는데 아직은 데모 프로젝트니 이 정도에서 마무리하자. 

 

3. 테스트

 

 

생각보다 잘 나오는 듯하다. 하지만 영상을 확인하면 cold 동작을 취하고 있지 않아도 cold로 인식하는 오류가 확인된다. 

 

이제 해결해야 할 사항은 다음과 같다 :

1. 한 프레임에 여러 사람이 나오는 상황을 어떻게 풀어갈지

2. 추위, 더위 동작 정확도를 어떻게 높일지

3. 온도 조절 임계값의 기준

 

사용한 코드 : https://github.com/lhg010524/Mediapipe-