논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

Hand Pose Estimation via Latent 2.5D Heatmap Regression

1 Introduction

3D로 손의 자세를 추정하는 일은 손의 키 포인트를 추정해야 함과 동시에 그 깊이 또한 추정해야 하기 때문에 어려움이 많습니다. 더군다나 손은 모양의 많은 변화가 있으며, 그 스스로 가려질 수도 있고 손의 정확한 자세를 표현하는 것 자체가 복잡한 일입니다.

이 논문의 목표는 RGB 이미지가 주어졌을 때 손의 키포인트들의 카메라에 대해 상대적인 3D 좌표를 추정하는 것입니다. 단안 카메라에서 정확한 3D 자세를 추정하는 것은 스케일과 깊이 간의 모호성 때문에 ill-posed한 문제이므로 이 문제를 둘로 나누어 모호성을 없애고자 하였습니다. 이를 위해 2.5D 자세를 표현하는 방법과 이 2.5D 로부터 3D 자세를 복원하는 방법을 제안하였습니다. 2.5D 표현은 손 키포인트들의 입력 이미지 상에서의 2D 좌표와 루트(root) 키포인트로부터의 scale normalization된 상대적인 깊이 값으로 구성됩니다. 이 scale normalization은 기준이되는 한 bone이 3D 공간에서 항상 같은 길이를 가지도록 수행하였습니다.

또한 이미지로부터 2.5D 포즈를 추정하는 CNN 구조를 제안하였습니다. 이 구조에서는 2D 키포인트 위치 추정을 위한 히트맵과 깊이 추정을 위한 각 키포인트의 깊이 맵을 추정합니다.

2 Related Work

3 Hand Pose Estimation

RGB 이미지가 주어졌을 때, $K=21$개의 손 키포인트의 2D와 3D 위치를 추정해야 합니다. 2D 자세는 $\mathbf{p} = \{ p_k \}_{k \in K}$로, 3D 자세는 $\mathbf{P} = \{ P_k \}_{k \in K}$로 표현하고자 합니다. 여기서 $p_k = ( x_k, y_k) \in \mathbb{R}^2$는 2D 픽셀 좌표를, $P_k = (X_k, Y_k, Z_k) \in \mathbb{R}^3 $ 은 카메라 좌표계에서의 mm 단위 3D 좌표를 나타냅니다. 카메라 내부 파라미터(intrinsic parameter) $\mathcal{K}$가 주어질 경우, 2D 좌표와 3D좌표와의 관계는 다음과 같습니다.

$$ Z_k \begin{pmatrix} x_k \\ y_k \\ z_k \end{pmatrix} = \mathcal{K} \begin{pmatrix} X_k \\ Y_k \\ Z_k \\ 1 \end{pmatrix} = \mathcal{K} \begin{pmatrix} X_k \\ Y_k \\ Z_{root} + Z_k^r \\ 1 \end{pmatrix}, \ k \in 1, \cdots, K $$

여기서 $Z_{root}$는 루트 키포인트의 깊이로 $Z_k^r$을 루트 키포인트에 대한 상대 깊이로 표현하기 위함입니다.

3.1 2.5D Pose Representation

이미지가 주어지면 3D 손 자세를 계산하는 함수가 있으면 좋겠지만, 앞에서 언급한 모호성 때문에 이는 불가능합니다. 따라서 이러한 모호성을 제거한 2.5D 자세 표현을 먼저 추정하고 이로부터 3D 자세를 복원하는 방법을 선택하였습니다.

2D 자세는 $\mathbf{P}_k^{2.5D} = \{ P_k^{2.5D} \}_{k \in K}, P_k^{2.5D} = (x_k, y_k, Z_k^r)$로 표현하도록 합니다. 여기서 $x_k, y_k$는 이미지의 픽셀 좌표계를 그대로 쓰고, $Z_k^r$만 루트 키포인트의 상대 깊이를 사용하도록 하였습니다. 여기에서 크기 모호성을 제거하기 위하여 3D 자세를 scale-nomarlize하도록 합니다.

$$ \hat{\mathbf{P}} = \frac{C}{s} \cdot \mathbf{P} $$

여기서 $s=||P_n - P_{parent(n)}||_2$ 으로 각 3D 자세에 독립적으로 계산됩니다. 이렇게 하면 키포인트 쌍 $(n, parent(n))$ 쌍은 동일한 거리 $C$를 가지도록 됩니다. 결과적으로 nomarlize된 키포인트의 2.5D 표현은 $ \hat{P}_k^{2.5D} = (x_k, y_k, \hat{Z}_k^r)$가 됩니다.

3.2 3D Pose Reconstruction from 2.5D

이제 2.5D 자세가 주어지면, 여기서 scale normalize된 3D 포즈를 계산하여야 하는데 이를 위해서는 루트 키포인트의 깊이 $\hat{Z}_{root}$를 알아야 합니다.

2.5D 자세와 카메라 내부 파라미터가 주어지면, 다음을 만족하는 3D 자세를 계산할 수 있습니다.

$$ (\hat{X}_n - \hat{X}_m)^2 + (\hat{Y}_n - \hat{Y}_m)^2 + (\hat{Z}_n - \hat{Z}_m)^2 = C^2$$

여기서 $(n, m = parent(n))$은 normalization에 사용된 키포인트 쌍을 의미합니다. 이 식을 2D로의 투영 좌표로 다시 쓰게 되면, $ (x_n \hat{Z}_n - x_m \hat{Z}_m)^2 + (y_n \hat{Z}_n - y_m \hat{Z}_m)^2 + (\hat{Z}_n - \hat{Z}_m)^2 = C^2$가 되고, 이를 정리하면,

$$ a = (x_n - x_m)^2 + (y_n - y_m)^2 \\ b = \hat{Z}_n^r (x_n^2 + y_n^2 - x_n x_m - y_n y_m) + \hat{Z}_m^r (x_m^2 + y_m^2 - x_n x_m - y_n y_m) \\ c = (x_n \hat{Z}_n^r - x_m \hat{Z}_m^r)^2 + (y_n \hat{Z}_n^r - y_m \hat{Z}_m^r)^2 + (\hat{Z}_n^r - \hat{Z}_m^r)^2 - C^2 $$

$$ \hat{z}_{root} = 0.5 (-b + \sqrt{b^2 - 4ac)} / a) $$

로 정리할 수 있습니다.

이 논문에서는 $C = 1$을 사용하였고, 검지 손가락의 시작되는 지점(MCP)와 손바닥(root) 사이의 거리를 스케일 $s$를 계산하는데 사용하였습니다.

3.3 Scale Recovery

여기까지 하면 손의 2D 자세와 scale normalize된 3D 자세 $\hat{\mathbf{P}}$를 얻을 수 있습니다. 여기에서 손의 절대 좌표로 된 자세 3D $\mathbf{P}$를 계산하려면 손 전체의 스케일을 알아야 합니다. 하지만 시나리오 상 이를 알 방법어 없기 때문에 추정해서 사용하도록 합니다.

$$ \hat{s} = \underset{s}{\operatorname{argmin}} \sum_{k, l \in \varepsilon} ( s \cdot || \hat{P}_k - \hat{P}_l || - \mu_{kl})^2 $$

여기서 $\mu_{kl}$은 트레이닝 데이터에서의 키포인트 $k$와 $l$간 평균 거리입니다.$\varepsilon$은 손의 kinematic 구조입니다.

4 2.5D Pose Regression

RGB 이미지에서 2.5D 자세를 알아내기 위해 CNN을 이용합니다. 4.1에서 간단한 모델을 설명한 뒤, 4.2에서 제안하는 구조를 설명할 것입니다. 모든 구조에서는 동일한 로스 함수를 사용합니다. 이 로스 함수는 $\mathcal{L}_{xy}$와 $\mathcal{L}_{\hat{Z}^r}$로 이루어져 있으며 각각 2D 자세와 루트에 상대(root-relative)적 깊이를 추정하도록 합니다.

$$ \mathcal{L}(\hat{\mathbf{P}}^{2.5D}) = \mathcal{L}_{xy}(\mathbf{p}, \mathbf{p}_{gt}) + \alpha \mathcal{L}_{\hat{Z}^r} ( \hat{\mathbf{Z}}^r, \hat{\mathbf{Z}}^{r, gt})$$

이 로스 함수를 이용하면 학습할 때에 여러 소스를 이용할 수 있습니다. 실제 이미지 데이터로부터 2D 자세 학습하고, 합성된 이미지로는 3D 자세를 학습하는 식입니다.

4.1 Direct 2.5D Heatmap Regression

여기에서는 2.5D 자세를 추정할 수 있는 간단한 히트맵 표현을 제안합니다. 이것은 2D 키포인트 히트맵 $H^{2D}$와 깊이 맵 $H^{\hat{z}^r}$로 구성됩니다. 2D 히트맵은 각 픽셀 위치에 대한 likelihood로 표현하지만, 깊이 맵은 scale normalize되고 루트에 상대적인 깊이를 추정하도록 합니다.

CNN은 $2K$ 채널을 출력하는데 처음 $K$ 채널은 2D 해트맵을, 나중 $K$채널은 깊이를 추정하도록 합니다. 타겟 히트맵 $H_k^{2D, gt}$는 다음과 같이 정의됩니다.

$$ H_k^{2D, gt} (p) = \exp \big( - \frac{||p - p_k^{gt} ||}{ \sigma^2 } \big), p \in \Omega $$

$\sigma$는 히트맵의 표준편차를 조절하는 파라미터이고, $\Omega$는 이미지의 모든 픽셀 집합을 의미합니다.

깊이 히트맵의 타겟은 다음과 같이 정의합니다.

$$ H_k^{\hat{z}^r} = \hat{\Z}_k^{r, gt} \cdot H_k^{2D, gt} $$

인퍼런스 후의 2D 키포인트는 maximum likelihood로 결정합니다.

$$ p_k = \underset{p}{\operatorname{argmax}} H_k^{2D}(p) $$

이 픽셀에 대한 깊이 또한 얻을 수 있습니다.

$$ \hat{Z}_k^r = H_k^{\hat{z}^r} (p_k)$$

4.2 Latent 2.5D Heatmap Regression

앞에서처럼 단순히 2.5D 히트맵을 추정하는 것은 몇가지 단점이 있습니다. 먼저 히트맵 자체가 손으로 디자인되어 이상적이지 않습니다. 예를 들면 $\sigma$가 모든 키포인트에서 고정된 값을 사용되므로 학습될 수 없습니다. 이상적으로 이 값은 각 키포인트마다 다르게 사용해야 합니다. 다시 말하면 손가락 끝과 매우 정교하지만 손바닥은 굉장히 넓은 범위를 가지기 때문입니다. 두번째로 가우시안 분포는 2D 키포인트를 위해서 사용된 것이지만, 깊이 추정에는 맞지 않습니다. 손바닥과 같은 지점에서는 넓은 영역에서 거의 같은 값을 가지게 될 것이니다. 따라서 이러한 문제를 극복하기 위한 새로운 latent 표현을 제안합니다.

2D 히트맵에서는 각 포인트에 대하여 지역(spatial) softmax normalization을 적용하여 확률 맵을 생성합니다.

$$ H_k^{2D} (p) = \frac{ \exp ( \beta_k H_k^{*2D} (p))} {\sum_{p' \in \Omega} \exp (\beta_k H_k^{*2D}(p'))} $$

$\beta_k$는 learnable parameter로 히트맵의 퍼진 정보를 조절하는 파라미터입니다. 최종적으로 2D 키포인트 위치는 모든 2D 픽셀 좌표에 가중치 합으로 계산됩니다.

$$ p_k = \sum_{p \in \Omega} H_k^{2D}(p) \cdot p $$

또한 이에 대한 깊이는 다음과 같이 두 추정 값의 Hadamar product로 계산됩니다.

$$ \hat{Z}_k^r = \sum_{p \in Omega} H_k^{2D} (p) \circ H_k^{*\hat{z}^r} (p) $$

5 Experiments

6 Conclusion


Add a Comment Trackback