크래프톤 정글 8기에서 진행하는 나만의 무기 만들기 프로젝트 내용으로 모션 인식 서비스를 개발하게 되었다. 우리의 모션 인식은 손을 주된 내용으로 구성하고자 하였기 때문에 시범을 위한 애니메이션을 만들어야 했다. 그에 대한 내용을 풀어본다.
애니메이션 도입에 대한 것은 프로젝트 초안부터 제안되었고 이에 대한 도전아닌 도전을 다양한 시도를 진행했다.
우리가 영감을 받았던 서비스 fingerspeling.xyz 는 해당 기능에 대해 꽤 완벽한 내용을 제공하고 있었다.
우리 또한, 현재 사용자가 수행해야 할 손 동작에 대한 숙련된 시범을 Meshed 손으로 구현 해본다는 생각을 했다. 시중에 돌아다니는 손에 Blender로 뼈를 입혀 해당 목표를 이룰 뻔 했다. 하지만.. [다소 해괴함 주의]
가능한 많이 검색하고, 시도하였지만 3D 수학의 부재가 크게 다가왔다. 이 부분의 완성은 계속 시도해봐야겠지만 당장 이런 것들을 적절한 손이라고 할 수가 없었다.
어쨌든 실시간은 아닐지언정 Mediapipe의 양식을 받아서 쓰이는 숙련된 시범을 준비해야 했다. 팀장은 우선 이 부분에 대한 시간 소요를 멈추고 당장 선보일 수 있는 부분부터 보라고 했고 동시에 일단은 좌표의 흐름부터 보여줘야 한다는 강조가 있었다.
Mediapipe 상으로 주어지는 좌표를 그대로 뿌려주는 내용이 필요했다. 그래서 팀장이 제시한 npz 파일을 받아와서 구성에 따라 적당히 나눠서 배치해보려고 했다.
첫 시도 : 샘플이 일단 뽑히는지부터 보기
- 좌표들이 모여있는 npz 파일 형식에서, 재생 할 수 있는 json 형태로 만들어서 시도
일단 샘플이 0번부터 5번까지 재생되는 걸 확인하였으나, 손을 일정하게 잡질 못했다. 현호에게 npz를 만들었던 코드를 보니 코드는 일정한 번호를 좌측 손과 우측 손으로 매핑하고 있었다. 해당 코드 내용을 viewer 코드에 반영하고 나서야 손 다운 손이 작동하기 시작했다.
푸른 계열로 각기 연결된게 손들이다.
2nd : 평균화 시도
우선 작동은 봤으니 연이어서 평균화를 시도하려고 했다. 현호의 코드는 한 단어에 20개씩 작성된 코드가 있었으니 샘플도 그 갯수만큼만 매핑해주면 되겠다고 생각했다. 하지만 형식이 엄청 달랐다.
파일 내부 내용으로, 4470개의 샘플, 샘플 당 30프레임, 1프레임 당 (최대) 675개의 관절이 주어졌다.
한 단어에 파일 한 개씩 해서 총 20개를 매핑하는데 샘플이 미친것처럼 많은 것은 그냥 분류안된 큰 파일을 준줄로만 알았다.
하지만, 파일 내부 내용의 구성이 하나 더 있었던 것을 간과 했다 : npz는 X, y 두 값으로 구성되는데, 앞에서 언급한게 X이고, y는 이에 대한 클래스 내지 태그를 표기한다. 더 쉽게 말하면, y로 X의 종류를 구분 할 수 있었다. 그렇게 확인하니 4470개 중 2000개의 샘플이 겨우 5개의 단어를 잡는데 필요한 샘플들이었다.
- y가 동일한 경우는 최소 399개 였다. 즉, 한 단어에 대한 샘플은 399개가 주어지고 있었다.
용량이 개많았지만 괜찮다. 평균화를 하면 어차피 한 개가 되는데, 이것만 재생해도 되는 것이었다. 그렇게 평균화를 하니까 몇몇개가 재생이 아예 안이루어졌다. 내 뷰어가 잘못된 구조였나하고 계속 고민했는데, 랜드마크를 끌어온 구조가 상당히 잘못 되었었다.
3rd : 파일 구조를 완전히 파악하기
앞에 내용을 다시 보면 : 파일 내부 내용으로, 4470개의 샘플, 샘플 당 30프레임, 1프레임 당 (최대) 675개의 관절이 주어졌다.
수어는 내용이 다양해서 한 개의 단어를 표현하는데 걸리는 시간은 일반적인 말의 단어에 비해 좀 더 편차가 있다.
그걸 30프레임으로 모두 축약시켜버리면 긴 내용일수록 이동 좌표에 대한 손실이 커지게 된다.
각기 다른 영상이 손실된 위치가 완벽히 동일한 프레임이면 상관없지만, 각기 다른 영역이라면 결국 평균인 원점에 가까운 위치로 손들의 점들이 배치되고 만다. 즉, 60프레임 짜리 첫 영상에서 15 30 45 60번째 프레임이 날아가고, 다른데가 14 29 44 59가 날아가고.. 이것이 누적되면 결국 해당 애니메이션은 평균값을 재생하고 있지만 그 어떤것도 재생하지 못한다.
그럼 애니메이션만큼은 프레임에 대한 손실이 발생해서는 안됐다. 결국 기존의 랜드마크를 디지털 화 하는 형태에서 수정이 필요했다. 30프레임을 보다 확장해서 영상 전체의 랜드마크를 담을 수 있도록 수정했다.
현재?
어째저째 전체 손 애니메이션을 잘 담아오고 있다. 다음엔 보다 확실히 정하고 접근해야할듯..