by PoseEstimation Model
1. 배경
2. PoseEstimation 이란?
3. 구성도
4. Key-points 추출 및 전처리
5. 유사도 계산
6. 마무리
AI기반 PoseEstimation 모델을 이용해 Dance-cover 유사도 구하기
최근 K-pop가수들이 신곡을 발표하면 자신의 노래를 홍보하기 위해 다양한 SNS에 유명 연예인들과 같이 노래의 포인트 안무를 추는 영상을 촬영하여 영상을 게시 합니다. 해당 영상이 SNS를 통해 퍼지면, 유명 유투버부터 일반인 남녀노소 누구나 해당 영상과 똑같은 춤을 추고 영상을 게시하는 일명 '댄스 챌린지(영상)'를 쉽게 접할 수 있습니다. 가수들은 자신의 노래를 효과 적으로 홍보 할 수 있고, SNS 사용자는 조회수를 올려, 서로 'Win-Win' 할 수 있는 마케팅 전략 입니다.
뿐만 아니라 전 세계적으로 K-pop의 위상과 인기가 올라 감에 따라 세계의 다양한 곳에서 K-pop 노래와 춤을 추는 모습을 볼 수 있는데, 대표적인 문화가 바로 'K-pop 랜덤 플레이 댄스(영상)'입니다. 랜덤 플레이 댄스 문화는 길거리에서 다양한 K-pop 노래가 1분 이내로 흘러나오면, 해당 노래의 춤을 아는 사람 이라면 누구든지 무대의 중앙으로 와서 춤을 추는 문화 입니다. 국내에서 시작된 이 문화는 최근 해외의 유명 관광지로 전파 되었고, 해당 영상을 촬영하여 SNS나 Youtube등에 게시하여 높은 조회수를 보여주고 있습니다.
이 처럼 최근 K-pop 댄스는 누구나 쉽게 따라 할 수 있는 비교적 쉬운 포인트 안무로 구성 되어있고, 많은 사람들이 하나의 춤에 대해 다양한 영상을 올립니다. 그러면 과연 내가 추는 Dance-cover의 유사도 점수는 몇점일 까요? 사람의 자세를 인식하는 AI모델을 이용하면 Dance-cover 유사도 점수를 구 할 수 있을까요?
PoseEstimation은 영상(Image)에서 사람의 관절을 인식하여 해당 관절의 Key-points(좌표값)을 추출하는 AI 영상처리 모델 입니다. 많이 사용되는 OpenPose(Keras version)과 HRNet모델은 [그림1]의 왼쪽 처럼 사람의 관절 포인트를 머리부터 발까지 총 18개로 정의하고 있습니다. 하지만, 모든 PoseEstimation모델이 관절포인트의 개수를 18개로 정의 하지는 않습니다. Google의 MideaPipe에서 공개한 Pose-landmarker모델은 총 33개의 관절 포인트의 개수를 추출 할 수 있습니다.
PoseEstimation의 모든 연구는 Top-down과 Bottom-up방식으로 구분[2] 됩니다. Top-down방식은 사람 detector를 이용하여 사람 객체를 먼저 뽑아낸 후 각 사람 객체에서 관절을 추출 하는 방식이고, Bottom-down방식은 영상에서 모든 사람의 관절을 추출한 후, 특정한 포즈 또는 하나의 사람객체의 포즈로 그룹지어주는 방식 입니다.
이 기술은 사람의 관절 포인트를 추출함에 따라 현재 자세 상태뿐만 아니라 행위(연속적인 자세)에 대해서도 분석 할 수 있습니다. 뿐만 아니라 영상내에 사람이 어느 위치에 있던 추출 가능하기 때문에 Tracking도 가능하기 때문에 모델의 크기(파라미터)를 줄여 실시간에 적용한다면 다양한 기능을 구현 할 수 있습니다.
OpenPose논문의 마지막 부분에서는 사람의 신체가 아닌 경우에도 Key-points를 추출 할 수 있다고 언급하고 있습니다(HandPoseEstimation). 해당 논문에서는 [그림2]와 같이 차량의 루프, 범퍼, 타이어등을 관절 포인트로 정의하고 학습하면 승용차나 버스와 같은 차량에서 Key-points를 추출한 실험 결과를 보여주고 있고, DeepLabCut에서는 [그림3]과 같이 PoseEstimation을 동물에 적용하여 동물(혹은 곤충)의 신체에서 Key-points를 추출하는 Animal PoseEstimation모델을 공개 하였습니다.
[그림4]는 PoseEstimation모델을 이용하여 신체에서 18개 이상의 Key-points를 추출 하여 원본 영상과 커버 댄스 영상의 유사도를 비교하여 점수화 하기 위한 전체 구성도입니다. 코사인 기반의 유사도 공식과 전/후처리 알고리즘을 이용해 유사도의 신뢰도를 향상시키는 알고리즘을 적용 시켰습니다. 댄스 유사도를 측정하기 위해서는 다음과 같이 전제 조건이 필요 합니다. 첫째, 영상의 시작 시간을 최대한 동일하게 맞춰야 한다. 둘째, 촬영된 영상은 동일 fps로 촬영 되어야 한다. 일반적으로 동영상은 30fps로 촬영이 됩니다. 이 말은 초당 30개의 이미지가 촬영되고 이를 분석해야 하는데, 단순하게 0.5초 차이만으로 15개의 이미지가 차이 나기 때문에 정확한 결과 얻을 수 없습니다. 이 논문을 보면 영상간 시간 차이를 Dynamic Time Warping
(DTW)를 이용해 극복하는 방법론을 제시하고 있다. DTW는 속도 또는 길이에 따라 움직임이 다른 두 시계열간의 유사성(거리)를 측정하는 알고리즘[3]이다. 이 방법론을 적용한 코드를 이용하여 테스트해본 결과 일상 동작과는 다르게 거의 고정된 위치에서 비슷한 동작을 반복하는 춤의 경우 오히려 정확도가 떨어지는 결과를 보여주었다.
또한 촬영된 영상간의 fps가 다르면 전체 이미지의 개수가 다르기 때문에 두 영산을 분석하는데 어려움이 있습니다. 예를 들어, 30fps로 10초 동안 촬영된 영상의 총 개수는 300개이고, 60fps로 10초간 촬영된 영상의 총 개수는 600개 입니다. 물론 전처리를 통해 600개의 영상에서 짝수 번째로 촬영된 영상을 제거하여 동일한 이미지 개수를 맞춰 분석이 가능하지만 더 정확한 결과를 얻기 위해서는 동일한 fps로 촬영이 필요 합니다.
본 Minimum Viable Product(MVP)에서는 Keras based OpenPose모델은 모델의 크기가 커서 실시간 처리에 한계가 있었고, MobilenetV2를 적용하여 경량화된 모델을 사용하였습니다. 그래서, 쉽게 테스트 하기 위해 Pose-landmarker모델을 이용하면 실시간 처리가 가능한 PoseEstimation모델을 사용할 수 있습니다. PoseEstimation모델의 output(X축 값, Y축값, 정확도값)은 을 한쌍으로 Key-points 1개를 의미 합니다. 즉, 18개의 Key-points는 output(x축값, y축값, 정확도값)이 총 18개 입니다.
추출된 Key-points 중에서 모델의 종류에 상관없이 공통으로 추출 되고, 분석에 필요한 필수 Key-points를 [그림5]와 같이 총 15개로 정의하고 해당 Key-points를 이용하여 유사도를 측정 하였습니다. 전처리를 통해 영상에 등장하는 인물들의 크기와 위치에 대해 영상 크기(Pixel)에 대한 절대치를 적용하여 크기와 위치를 Regularization하여 처리 하였습니다.
PoseEstimation모델을 이용하면 15개의 Key-points가 추출되는데, 하나의 Key-points는 X와 Y의 좌표값의 쌍으로 이뤄져 있으므로, 총 30개의 데이터를 얻을 수 있습니다. 이 30개의 수치 데이터를 Vector값으로 변경하여 Cosine Similarity에 적용 하였습니다[4](예: [x1, y1, x2, y2, x3, y3, ..., x15, y15]). 데이터의 노이즈를 줄이기 위해 Vector값에 L2 Normalization(정규화)[5]를 적용하여 값의 크기를 0~1로 변경 하였습니다. 변경된 Vector값을 [그림6]과 같이 Cosine Similarity 공식을 적용하여 유사도를 측정 하였습니다.
PoseEstimation모델을 통해 추출된 각 Key-points의 정확도값은 모두 다른 값을 가지고 있습니다. 이미지에서 눈에 잘보이는 관절 부분의 정확도 값은 높게 나오는 반면, 장애물에 시야가 가려져 잘 안보이는 관절의 경우는 정확도값이 낮게 나옵니다. Application of Weighted Similarity[4]방식은 위에서 언급한 Cosine Similarity방식에서 각 Key-points에 해당되는 확률값을 적용하여 보다 정확한 유사도를 측정하기 위해 제시된 방법입니다. PoseEatimation모델을 통해 얻은 결과값인 각 Key-points 확률값(0~1)을 해당되는 Key-Points를 Cosine Similarity에 적용할때 곱해서 처리 합니다. 이렇게 구한 최종 유사도값이 단순하게 Cosine Similarity 보다 좋은 성능 보여주어 이 공식을 적용 하였습니다.
이 방식은 각도를 이용하여 자세를 분류하는 방법론[6] 입니다. 계산이 가능한 3개의 Key-points의 각도[7]를 모두 구한 후 비교하는 방식 입니다. 가장 쉬우면서 직관적인 방식으로 정지된 동작을 비교하는데 최적화된 방법론입니다. 요가나 헬스(코어 운동, 스쿼트 등)에서 정지된 자세의 정확도를 측정하기에 적합하고 많이 사용되고 있습니다. 하지만 본 MVP에서는 정지된 동작이 아닌 변화되는 동작을 일정 시간 동안 계속해서 비교해야 하기 때문에 좋은 성능을 보여주지 못했습니다.
사람의 관절을 추적하는 PoseEstimation모델을 이용해 Dance-cover에대한 춤 유사도를 구하는 간단한 방법을 소개했습니다. 아래의 영상은 MVP에서 테스트한 결과를 적용한 결과 입니다. Cosine Similarity로 나온 결과 값을 0~100점으로 치환하여 점수화 하였습니다. 점수를 치환하는 과정에서 가장 고려했던 부분은 동일한 춤을 췄을 때 점수가 높게 나오고, 다른 춤을 췄을 때 점수가 낮게 나오느냐 였습니다. 일반적인 유사도는 얼마나 유사한가에 대한 점에 초점이 잡혀있어, 동일하지 않은 경우는 어떤지에 대해 궁금한게 많았는데, 다행히 결과가 잘 나온것 같았습니다.
ClubMeta(영상)는 본 MVP에서 테스트한 댄스 유사도 측정 알고리즘을 적용한 Application 입니다. Youtube의 shorts, Tiktok처럼 동영상 기반 SNSApp입니다. 이 App이 다른 동영상 기반 SNS App과 다른 점은 커버 댄스에 초점이 맞춰져 있는 것입니다. 댄서가 자신의 춤에 대해 포인트안무를 살려 30초 이내로 짧게 촬영하여 Challenge로 등록하고 상금(shoes)을 등록하면, 일반 유저는 해당 춤을 따라하여 업로드하고, 투표 점수와 Cover-dance 유사도 측정을 통해 부여받은 점수를 통합하여 순위별로 보상을 받는 App입니다.
[1] A Comprehensive Guide on Human Pose Estimation
[4] Move Mirror: An AI Experiment with Pose Estimation in the Browser using TensorFlow.js
[5] [ML]정규화(normalization)와 표준화(standardization)는 왜 하는걸까?
[6] Pose classification options
[7] 세 점 사이의 각 구하기