티스토리 뷰

Kinect

[Useful SDK] 3 Gear Systems test

생각많은 소심남 2012. 11. 12. 20:48

지난 포스트 중에서 Hand Gesture를 Tracking할 수 있는 툴인 3 Gears System 을 소개해드렸습니다.

2012/10/28 - [About Kinect] - [Useful SDK] 3Gear System.

사실 공식 홈페이지에서 추천하는 개발환경은 다음과 같이 구성됩니다.



거기에 따르면 키넥트를 설치할 수 있는 프레임과 키넥트를 달 수 있는 마운트가 필요하다고 되어 있습니다. 사실 제 블로그를 보신 분이라면 아시겠지만 키넥트가 내보내는 IR 패턴이 겹치면 Depth의 형태가 미세하게 어긋납니다. 그래서 충분한 거리(1m)를 두고 무언가를 보정하는 과정을 거쳤을 거라고 생각합니다. 당연히 원래 키넥트가 제공하는 Near Mode같은건 적용할 수 없겠지요. 아무튼 저도 한번 시도를 해보고자 하고 다음과 같이 환경을 구성했습니다.



조금 엉성해보이긴 하지만 그래도 나름대로 1시간에 걸쳐서 구축했고 잘되는 거 같네요.


참 개발환경을 설명드리자면 반드시

- windows 7 64bit

- JAVA RE 64bit( 애초에 이것때문에 32bit 운영체제에서는 돌아가지 않습니다.)

- Kinect for Windows Runtime v1.6

- 그리고 엄청 좋은 컴퓨터 (저는 i5 3550 / 4GB 에서 시도했습니다. 공식 홈페이지에서는 i7 / 8GB 이상의 시스템을 요구하고 있습니다.)


사실 위키피디아에 Hand Gesture를 쳐보시면 아시겠지만 다양한 방법의 Gesture Recognition 방법이 나와있습니다. 그중 제가 생각하는게 맞다면 이 3Gear Systems는 model Based Rocognition 에 Training 과정이 적용된거 같습니다. 그래서 일련의 Training 과정을 거친 후에는 손의 Pick이나 Pinch, Rotate 같은 제스처를 가상 현실에서 구현해볼 수도 있게끔 되어 있습니다. 아마 이 과정들을 보신다면 대충 Hand Recognition이 어떤식으로 구현이 된다는 것을 아실 수 있을 겁니다. 


첫번째 과정은 Camera Calibration입니다. 키넥트를 두대 쓰는 이상 두개의 Space를 일치시키기 위해서는 하나의 요소에 대한 기준을 세워야 합니다. 바로 위 사진에 잠깐 나오는 체크보드를 사용하는 겁니다. 사실 이 방법은 OpenCV 배울 때에도 다수의 웹캠의 초점을 일치시키기 위해서 하는 선행과정으로 이뤄집니다. 물론 이 System에서도 똑같이 적용됩니다.



잠깐 보이시겠지만 체크보드의 Edge 마다 색이 표현되어 있는 것을 보실 수 있을 겁니다. 이제 이과정을 거친 후에는 이 기준상에서 Hand Gesture가 이뤄질 것이라는 정의를 내려줘야 하고 약 20프레임에 걸쳐서 손이 움직이는 Space를 누적하는 과정을 수행하게 됩니다.

  



이제 기본적인 Space에 대한 정의가 이뤄졌습니다. 제대로 되었는지 확인하기 위해서 Test를 시도해봅니다.



딱 보시면 오른손과 왼손에 대한 구분도 이뤄지고 가려지는 영역없이 잘 나타나고 있습니다. (참고로 파란색이 오른손입니다.) 


다음으로 할 과정은 손에 대한 Calibration을 수행하고 몇가지 Gesture에 대한 hand model을 구현하는 과정입니다. 



이전에 나왔던 손에 대한 Point Cloud가 나오고 일련의 과정을 거치면 손에 대한 3D 모델이 형성되게 됩니다.



손에 대한 모델이 잡혔으니까 이제 몇가지 제스처를 학습시킵니다. 총 6개 Gesture에 대해서 학습을 시키는데 이 과정은 동영상으로 보여드리겠습니다.



Hand Gesture에 대한 6가지 모델에 대해서 정의가 되었고 이에 대한 샘플을 형성하면 끝납니다. 이제 이게 제대로 학습이 된건지를 테스트해봐야 하는데 이 과정에서는 총 2가지 예제를 보여줍니다. 

그런데 일련의 처리과정이 복잡한 만큼 여기서도 소켓통신으로 데이터를 주고 받습니다. 그래서 server를 하나 켜두고 client 프로그램이 달라붙는 식으로 진행이 됩니다. 즉 server에 hand model이 저장되어 있어서 아까 정의한 6가지 모델 중 하나와 matching이 된다면 그에 해당하는 이벤트를 client에 뿌려주는 식으로 취할 겁니다. 그래서 server단은 이렇게 생깁니다.



이 과정도 역시 동영상으로 보여드리는 게 좋겠네요. 



결론적으로 이 Server가 켜져 있어야 이 Hand Gesture가 정상적으로 동작한다는 것이지요. 앞에서 이야기 한 것과 같이 예제가 두개 있는데 첫번째 예제는 grasp에 대한 제스처가 제대로 학습되었는지 확인하는 예제입니다. grasp을 한 후에 조립하는 예제입니다.





다음은 Pinch 제스처에 대한 학습이 제대로 되었는지를 테스트 한겁니다. Pinch를 통해서 Rotate가 되는 거지요. 실제 사물을 움직이는 것처럼 말입니다.



마지막은 Pointing 제스처에 대한 테스트입니다.



아마 이건 어디선가 보셨던 예제일 겁니다. 사실 이 예제는 Leap라는 Hand Gesture Device의 예제로도 소개되었던 내용인데 이렇게 키넥트로도 손 끝점을 잡아서 그릴 수가 있습니다. 이런 걸 활용한다면 Leap에서 소개되었던 것처럼 앵그리버드도 할 수 있겠지요.



지금까지 3 Gear System에 대한 테스트를 진행해봤는데 생각보다 학습에 대한 결과물이 잘 나타나서 놀라웠습니다. 저도 이를 활용해서 무언가를 학습하는 것에 대한 공부를 한달동안 진행하려고 하고 이 sdk가 도움이 될거 같습니다. 그리고 개발 문서에 대한 정리도 잘되어있는 편이니 많이들 보셨으면 좋겠네요. 참고로 이 샘플은 11월 말까지 무료로 공개되는 샘플이니까 한번 해보실 분은 서둘러서 해보시길 권합니다. 

댓글