티스토리 뷰

Kinect

[Kinect] kinect 수화 프로그램

생각많은 소심남 2014. 6. 9. 01:29

한창 학기말 준비때문에 바쁘다. 성적은 잘 받아야되겠고, 논문 준비는 해야되겠는데 일단 급한 불부터 지금 끄고 있다. 문제는 불은 꺼도 불씨는 살아남아있다는 거다...

우선 지금 집중하는 건, Machine Learning 학기 프로젝트다. 우리팀의 주제는 키넥트를 이용해서 실시간 수화프로그램을 만드는 것이다. 대충 Framework는 이렇다.


이렇게 오른손을 tracking해서 손의 모양을 인식하게 되면 될거 같았고, 이에 대한 결과를 하단부에 이미지로 출력하려고 했다. 기존의 접근 방식과는 다르게 우리는 depthStream을 이용해서 손인식을 하게 하려고 했다. 그러고보니까 문제는 크게 두가지가 있었다. 첫번째는 사람이 어디서 손을 인식하느냐에 따라서 손의 depthValue가 다르게 나오는 것이다. 기계학습의 특성상 해당 모션에 대한 feature를 효율적으로 찾고, 최대한 constraint를 배제해야 되었다. 그래서 depthValue로만 feature로 삼기가 어려웠다. 그래서 논문을 읽어보니까 몇가지 논문에서 Histogram of Oriented Gradient(HOG)라는 걸 써서 분류하는 게 있었다. 말그대로 이미지의 Orientation을 histogram 형식으로 뽑아주는 기법인데 이걸 matlab에서 plot 하게 하면 각 픽셀이 어떤 vector를 가지는지를 확인할 수 있다. 즉, 이걸 활용하면 depthValue 자체가 아닌 그 방향성과 주변 pixel간의 상대적인 값을 feature로 삼을 수 있다고 생각해서 이걸 학습시키게 됬다. 



결국 이런식으로 trainset과 testset을 생성하고 이 dataset을 바탕으로 support Vector Machine을 통한 classification을 수행했다. 그랬더니 testSet자체는 거의 svm training model에 잘 인식되서 거의 정확하게 결과를 보여줬다. 가령 위의 이미지처럼 'L'이란 수화를 집어넣게 되면 출력으로 L이 나오게 되는 것이다. 

 그래서 대충 만든건 이렇다.



인식좀 좋게 하려면 training data를 좀더 많이 해주면 되려나.. 그래도 가끔(?) 잘 인식한다. 


그런데 아마 수화를 잘 아는 사람은 알겠지만 American Sign Language 중에서도 모션이 필요한 character가 있는데 그게 'j'와 'z'다. 이건 어떻게 학습시켜야 될지 조금 고민 중이다..


- 추가: 아무튼 결과물이 나오긴 했다. 그런데 a, m, n, s 같이 비슷한 제스처에 대한 인식은 조금 많이 떨어졌다. 고민할 시간이나 트레이닝할 시간이 좀만 더 있었으면 좋았을거 같은데.. 아무튼.. 

대충 우리 프로젝트를 요약한 내용이고,







이게 결과물이다.



키넥트 공부하면서 한번쯤 해보고 싶었던 프로젝트 중 하나였는데 이렇게 한번 해봤다는 사실 자체가 참 의미가 있었던 것 같다. 뭐 완벽했으면 좋았겠지만, 덕분에 한동안 공부안했던 키넥트도 다시 꺼내보고 즐길 수 있었던 같아서 개인적으로는 좋은 기회였다고 생각한다. 

댓글