Pose Estimation & Landmark Extraction
- 영상 처리 : OpenCV
- Landmark 추출 : Google MediaPipe (https://google.github.io/mediapipe/solutions/pose.html)
1 Frame 당 33개 Landmark Data에 대해
- X : Landmark의 X 축 좌표. [0:1] 의 값으로 Normalized
- Y : Landmark의 Y 축 좌표. [0:1] 의 값으로 Normalized
- Z : 카메라와 수직을 이루며 피사체의 left_hip - right_hip 사이의 원점을 통과하는 가상의 depth 좌표.
카메라와 가까운 쪽으로 음수 값을 가지는 Experimental 한 값
- V (Visibility) Factor : [0:1]의 값을 가지며 Landmark에 대한 가시성을 나타내는 값.
(가려져 표시되지 않는다면 0)
영상 전체를 Frame by Frame으로 순회하며 Landmark 추출 Pandas 파이썬 패키지 이용 Dataframe 으로 담아 csv파일로 저장
https://youtu.be/OjCwLatUff8
Vectorization
요가 영상은 고정된 특정 포즈를 취하는 Posing 구간과 A포즈에서 B포즈로 포즈가 바뀌는 Transition 구간으로 나누어짐.
즉, Landmark의 “변화량”을 기준으로 정적인 구간을 구분해 낼 수 있다고 추론.
따라서, X,Y 축 랜드마크 데이터를 가지고 변화량 데이터를 생성.(Z축 데이터는 제외)
1. 가려서 보이지 않는 Landmark 값 = 신뢰도가 떨어진다고 판단 Vector 그래프의 Jitter의 요소를 줄이기 위해
Visibility Factor를 데이터에 가중치로 활용하기로 함
변화량 값에 곱해줄 가중치로 사용하려고 하기에 벡터 연산에 쓰일 두 Landmark 값중 하나라도 신뢰성이 떨어지면 연산된 벡터 값도 신뢰성이 떨어질거라고 판단, 더 작은 V-factor로 가져와서 Dimension Matching
2. X 축 33개 Landmark Column ——— Concatenate——— Y 축 33개 Landmark Colum
- DataFrame 1칸 Shift하여 Diff값 구한뒤, Dimension Matching된 V-Factor DataFrame 참조하여 V-Factor값이 0.9 이하인 값에 대하여 Landmark Data 0으로 치환.
3. V값 가중치 적용된 Concatenated DataFrame에 대해 Euclidean vector 연산 통해 Vectorization 하여 X축, Y축 각 33개 Landmark에 대한 벡터요소를 하나의 벡터로 합산
4. 합산된 벡터 데이터를 표준편차(std) = 1 , 평균(mean) = 0을 갖도록 하는 Standard Normalization 으로 정규화
Smoothing
Smoothing Method
1. Savitzky-Golay aka.SAVGOL Filter (사비츠키-골레이) (scipy.signal) <- 해당 필터로 진행

2. Moving Average Method
a. SMA : Simple Moving Average Method

b. CMA : Cumulative Moving Average Method

c. EMA : Exponential Moving Average Method

3. Gaussian Filter

Posing 구간 분리
1. Peak Find (scipy.signal)
전제1 : Peak 기준으로 나눠진 왼쪽, 오른쪽 구간은 서로 다른 포즈이다.
전제2 : Peak 사이 구간의 Status는 2가지로 구별된다.
- Transition Only (Cluster에 앞서서 pre-processing 통해 제거)
- Posing + Transition (Clustering 통해 구별 가능)
2. Pre-processing : Peak to Peak 구간의 분류
핵심 전제 : 운동 영상의 경우 Posing 을 유지하는 시간이 Pose가 전환되는 Transition 시간 보다 압도적으로 길다.
*Standard Normalization 을 거치면 전체 데이터의 mean = 0 , std = 1 로 정규화 된다.
→ Posing 구간에서는 변화량이 적기 때문에 Flatten 구간의 데이터는 -1 에 가깝게 분포되어 있다.
만약 Peak to Peak 구간에 Posing 구간이 포함되어 있다면 아래의 식을 만족한다.
(Peak to Peak 구간의 mean 값) - (Peak to Peak 구간 std) < -1
그렇지 않다면, 해당 구간은 Transition 상태만 있는 구간 일 것이다.
3. Clustering (K-means (scikit-learn)) : Posing 과 Transition이 혼재되어 있는 구간에서의 분류
기본적으로 변화량 데이터를 다루고 있기에, Transition 구간의 데이터 값들의 군집은
Flatten 구간(Posing)의 군집보다 더 큰 값을 가진다.
핵심 전제에 의해, 구간의 mean 값에 대해 Posing 군집의 기여도가 훨씬 크므로, 분류된 두개의 군집에서
최대값을 가지는 데이터를 군집의 대표 데이터로 선택한뒤,
구간 mean값 과의 거리가 먼 군집을 Transition 군집으로, 가까운 군집을 Posing 군집으로 본다.
4. Posing 구간 추출
변화량 데이터 또한 시계열 데이터이므로 Posing 군집에서 x축 최소 값과, x 축 최대값 데이터가
곧 영상에서의 Posing 구간의 시작 프레임과 끝 프레임이다.
'Dev_Note > Krafton Jungle' 카테고리의 다른 글
[Python] MediaPipe Pose Detection Config Options (0) | 2023.02.09 |
---|---|
아이디어 피칭 방법과 순서 (0) | 2023.01.29 |
vue.js + electron 개발 환경 세팅 (0) | 2023.01.24 |
[Outdated!] Tensorflow 개발환경 세팅 (0) | 2023.01.21 |
OpenCV 개발환경 세팅 (0) | 2023.01.20 |