발표자료 : https://docs.google.com/presentation/d/1vXGcHwAJxjAXV_m76dgl7abqPDun0TY_/edit?usp=sharing&ouid=116507288704586191771&rtpof=true&sd=true

논문링크 : VIBE: Video Inference for Human Body Pose and Shape Estimation

Implementation : https://github.com/mkocabas/VIBE

    오늘 소개드릴 논문은 VIBE: Video Inference for Human Body Pose and Shape Estimation입니다. CVPR 2020 accepted paper입니다.



1. Introduction

    먼저, VIBE가 등장하게 된 배경에 대해 설명드리도록 하겠습니다. 우선, single image로부터 3D human pose를 추정하려는 시도는 지금까지 매우 활발히 연구되어 왔습니다. 이러한 연구들은 여러 분야에서 매우 유용하게 사용될 수 있지만, 실제로 인간의 행위를 정확히 설명할 수 있는 것은 single image가 아니라 video입니다. 따라서 VIBE는 기존에 연구되어 왔던 single image에 대한 3D human pose estimation task를 video의 영역으로 확장하고자 등장하였습니다.

    사실 그동안 video에서 3D human pose를 추정하려는 시도가 없었던 것은 아닙니다. 해당 주제는 약 30년이상 논의되어 왔지만, 아래와 같은 문제점으로 인해 유의미한 성과를 내지 못하였습니다.

  • Lack of 2D-3D mapping annotations
    • 2D-3D mapaping annotation 데이터가 충분하지 않았으며, 심지어 single image에 대한 annotation조차 구하기 쉽지 않다는 문제가 있었습니다. 따라서 모델을 충분히 학습시킬 수 없었습니다.
  • Lack of in-the-wild datasets
    • 야외에서 촬영한 데이터셋이 부족했습니다. VIBE 이전의 연구들은 실내에서 촬영한 3D dataset과 2D GT를 결합하는 방식을 채택하였는데, 실내에서 촬영한 데이터들은 다양한 주제 및 모션이나 이미지의 복잡도를 표현하기에 한계가 있었습니다.


    따라서 VIBE는 이러한 기존 연구 방식의 문제점을 해결하고자, 오직 2D keypoint만을 사용하여 pose estimator를 훈련시키고, adversarial training을 통해 3D human shape과 pose를 생성해냅니다. 당시에, Video squence 분야에서 2D 어노테이션 데이터는 이미 충분히 존재하는 상황이었고, adversarial training을 위한 데이터셋은 AMASS라는 3D motion-capture 데이터셋을 사용하였다고 합니다. 이 때, AMASS 데이터 셋은 야외에서 촬영되었으며 사람의 움직임을 학습하기에 충분한 양이었기 때문에 VIBE가 좋은 성능을 낼 수 있었다고 합니다.



2. Architecture

    다음은 VIBE의 전체적인 모델 아키텍쳐입니다.

    VIBE의 Key idea는 HMR에서 영감을 받은 것이기 때문에, 전체적인 모델 아키텍쳐는 HMR과 크게 다르지 않습니다. HMR이나 GAN같은 경우는 이전 세미나에서 이미 다루었기 때문에 따로 자세히 설명하지는 않겠습니다.

    VIBE는 우선, 길이 T의 input video V가 주어지면, 얘를 CNN에 통과시켜 각 frame에 대한 feature map을 추출합니다. 이 때 추출된 feature map은 temporal encoder의 input으로 들어가 latent feature vector를 추정하고, 이를 바탕으로 regressor에서 최종적으로 SMPL 파라미터를 예측하게 됩니다. 위 figure에서는 regressor에 대한 부분이 따로 표현되어 있지 않은데, temporal encoder 뒤에 붙어있다고 이해하시면 될 것 같습니다.

    앞서 말씀드린 부분까지를 Generator의 범위로 정의하고, Generator에서 생성된 사람의 pose는 AMASS 데이터셋의 GT sample과 함께 Motion discriminator로 들어가 real한 사람의 motion인지에 대한 여부를 판별합니다. 각 부분에 대한 설명은 뒷 부분에서 좀 더 자세히 다루도록 하겠습니다.

위 figure에서는 regressor에 대한 부분이 따로 표현되어 있지 않아서 어디에 포함되는 개념인지 살짝 혼동이 되었는데, 구현 코드와 논문에서는 regressor와 encoder를 서로 다른 개념으로 보고있기 때문에, GRU 뒤에 regressor가 숨어 있다고 이해하시면 될 것 같습니다.

        feature = self.encoder(feature)
        # (...)
        smpl_output = self.regressor(feature, J_regressor=J_regressor)

2-1. Generator

    Generator 부분에 대해 조금 더 자세히 살펴보도록 하겠습니다. Generator는 전체적으로 다음과 같은 흐름을 갖습니다.

\[I_t \to f(I_t) \to g(f_t) \to T \to \hat{\Theta}, \quad (t = 1, ..., T)\]

2-1-1. Feature extractor (CNN)

    우선, t는 frame number를 의미합니다. 앞서 잠깐 소개드렸던 듯이, input video $I_t$는 convolutional network $f$의 input으로 들어가게 됩니다. 이 때, CNN 아키텍쳐로는 ResNet50을 사용하며, 각 frame의 feature map $f_i$를 추출합니다. 이때 $f_i$는 (시퀀스x2048)의 디멘젼을 갖습니다($f_i \in \mathbb{R^{2048}}$). 아래는 CNN layer 중간쯤에서 visualize해본 feature map입니다.


2-1-2. Temporal Encoder (GRU)

    앞서 CNN에서 추출한 feature map은 Temporal Encoder $g$의 input으로 들어가게 됩니다. Temporal Encoder는 RNN계열 GRU와 Linear Layer(Gemm)로 이루어진 간단한 구조를 가지고 있습니다. 아래 figure는 Netron으로 visualize한 Temporal Encoder입니다(ONNX format). 여기서 주목해야할 점은 Temporal Encoder에 RNN기반 아키텍쳐인 GRU를 사용했다는 점입니다. 저자는 이에 대한 이유로, 앞 뒤 frame간의 관계에 대해 언급하였습니다. 다시 말해, human이 부분적으로 가려져 있거나 포즈가 모호한 상황에서 이전 frame의 정보가 도움이 될 수 있다는 것 입니다. 따라서 frame sequence에 대한 temporal한 정보를 고려하기 위해 GRU를 사용하였고, 이 부분이 HMR과 VIBE의 가장 큰 차이점이라고 할 수 있겠습니다.

    Temporal Encoder는 위에서 기술한 과정을 거친 뒤, 각 프레임에 대한 latent feature vector $g_i$를 output으로 출력합니다. 이 때, 각 $g_i$는 이전 frame의 영향을 받아 Temporal하게 출력된다는 점을 다시한번 기억해주세요!


2-1-3. Regressor

    그리고 예측된 latent feature vector gi는 regressor의 input으로 들어가게 됩니다. 공식 페이퍼에는 Regressor에 대한 부분이 자세히 언급되어 있지 않아서 따로 visualize를 해보았습니다. 아래 figure 기준 왼쪽이 original regressor이며, 오른쪽은 이를 간단히 도식화 한 것입니다. 편의상 뒷 부분의 post-processing 과정은 생략하고, 대략적인 개형만 표현한 것임을 참고해주시면 감사하겠습니다.

    Regressor는 k개의 layer를 거치며 SMPL 파라미터를 추정합니다. 이 때 input으로는 이전 Layer에서 추정한 SMPL 파라미터 $\Theta_{k}$와 이에 해당하는 latent feature vector $g_i$를 받아 $\Theta_{k+1}$을 새롭게 추정합니다. 그리고 $\Theta_{k+1}$는 다음 layer에서 $g_i$와 함께 input으로 들어가게 되고, 이 과정을 k번 반복하게 됩니다. 첫 iteration에서는 $\Theta_k$ 대신 SMPL 평균 $\bar{\Theta}$로 initialize되고, 각 Layer의 output $\hat{\Theta}$은 다음과 같이 출력됩니다.

    SMPL과 동일하게 pose parameter는 72개의 dimension을 갖고, shape parameter는 10개를 갖습니다. 당연한 이야기지만, 하나의 사람에 대해서 여러개의 pose를 추정하는 것이기 때문에 pose parameter는 frame 개수 $T$만큼 나오고, body shape parameter는 모든 sequence에 대해 average pooling을 해줘서 하나의 값으로 통일합니다. 아래는 이에 대한 official 코드입니다.

link : https://github.com/mkocabas/VIBE/blob/master/lib/models/spin.py#L252

        pred_pose = init_pose
        pred_shape = init_shape
        pred_cam = init_cam
        for i in range(n_iter):
            xc = torch.cat([x, pred_pose, pred_shape, pred_cam], 1)

            # some fc layers ...

            pred_pose = self.decpose(xc) + pred_pose
            pred_shape = self.decshape(xc) + pred_shape
            pred_cam = self.deccam(xc) + pred_cam


  • cf) SMPL parameter
    • SMPL 파라미터에 대한 첨언입니다.
    • 자세한 내용은 SMPL paper를 참고해주시면 감사하겠습니다.

    • pose parameter
      • $\theta \in \mathbb{R}^{72}$
      • 72개의 pose 파라미터를 사용하며, global body rotation과 23개의 joint retation을 포함합니다.
    • shape parameter
      • $\beta \in \mathbb{R}^{10}$
      • 10개의 shape parameter를 사용합니다.



2-2. Discriminator

    SMLP 파라미터로 생성된 3D mesh는 다시 Motion Discriminator로 들어가 AMASS GT sample과 matching을 해주게 됩니다. 아래 figure는 discriminator가 없을 경우 생기는 문제를 나타내고 있습니다. generator에서 생성된 3D mesh를 바로 2D key point에 매칭시킨 것인데, 2D key point에는 잘 매핑되었지만, 정상적인 사람의 포즈에는 제대로 매핑이 되지 않은 모습을 확인할 수 있습니다. 따라서 HMR에서는 이러한 문제점을 해결하기 위해 reprojection loss와 더불어 Discriminator를 도입하였고, VIBE도 이러한 HMR의 흐름을 동일하게 가져갑니다.


2-2-2. Motion discriminator

    그러나 VIBE는, HMR과는 조금 다르게 single image에 대한 matching만으로는 pose sequence를 다루기에는 불충분하다고 주장합니다. pose의 시퀀스를 고려하지 않은 채 단일 이미지에 대해서만 테스트를 하게 되면, 각 프레임에서의 pose는 유효할 수 있어도 시퀀스간의 포즈가 자연스럽게 연결되지 않을 수도 있게 됩니다. 따라서 VIBE는 이러한 문제를 해결하기 위해 motion discriminator $\mathcal{D}_M$을 도입합니다.

\[\mathcal{G} \to \hat{\Theta} \to f_M(\hat{\Theta_i}) \to h_i \to attn \to p\]

    위 figure는 motion discriminator의 구조를 도식화한 것입니다. 앞서 설명드린 Genorator와 유사하게, Motion discriminator 또한 GRU를 사용함으로써 모델이 시퀀스 정보를 반영할 수 있도록 합니다. input으로는 Generator에서 생성한 $\hat{\Theta}$을 받으며, 이를 multi-layer GRU $f_M$에 넘겨줌으로써 각 time step i에 대해 latent code $h_i$를 추정합니다. 여기서 주목할 점은, $[h_1, …, h_T]$에 대한 aggregate를 위해 self-attention을 사용했다는 것입니다. 각 프레임끼리의 self-attention을 통해, pose matching에 있어서 각 프레임의 중요도를 학습할 수 있게 되고, 이를 바탕으로 더 중요한 프레임에 높은 가중치를 부여할 수 있게 됩니다. attention weight는 아래와 같이 계산됩니다.

    계산된 latent code $h_i$hi는 attention 함수에 들어간 뒤 sigmoid function을 거쳐 attention weight로 계산됩니다. 그리고 이렇게 계산된 attention weight는 $h_i$와 다시 곱해지고, 모든 sequence에 대해 더해 최종적으로 $r$을 출력하게 됩니다. 이 때 $r$은 $\hat{\Theta}$이 Real인지에 대한 0~1사이의 확률값을 의미합니다.



3. Loss

3-1. Discriminator

    Motion discriminator는 다음과 같은 Loss를 갖습니다.

\[L_{D_M} = \mathbb{E}_{\Theta \sim p_R}[(\mathcal{D}_M(\Theta)-1)^2] + \mathbb{E}_{\Theta \sim p_G}[(\mathcal{D}_M(\hat{\Theta}))^2]\]

    여기서, $p_R$은 AMASS 데이터셋으로부터 추출한 real motion sequence의 분포이며, $p_G$는 generator가 생성한 sequence의 분포를 나타냅니다. 따라서 discriminator의 loss는, real data에 대한 output에는 반비례하며, fake data에 대한 output에는 비례하여 커집니다. 이 부분이 처음 봤을때는 잘 와닿지 않을 수 있을 수도 있을 것 같아서 아래와 같이 간단하게 다시 표현을 해보았습니다.

\[\begin{matrix} objective &= (1)& Min(L_{D_M}) \\ &= (2)& Min[\mathcal{D}_M(\Theta)-1] + Min[\mathcal{D}_M(\hat{\Theta})] \\ &= (3)& \mathcal{D}_M(\Theta) \to 1 \quad and \quad \mathcal{D}_M(\hat{\Theta}) \to 0 \end{matrix}\]

    Discriminator는 위 Loss를 최소화하는 것을 목표로 가지고 학습을 진행하게 되므로, $(2)$와 같이 수식을 다시 표현할 수 있게 됩니다. $(2)$번 수식을 최소화 하기 위해서는 real data에 대한 discriminator는 1에 가까워져야 하고, fake data에 대한 output은 0에 가까워져야 합니다. 다시 말해, DM는 real 이미지에 대해서는 1을, fake 이미지에 대해서는 0을 출력하도록 학습되며, Loss는 각 분포에 대한 Expectation value의 합으로 계산됩니다. real data는 real로, fake data는 fake로 구분할 수 있도록 학습이 된다고 이해하시면 될 것 같습니다.



3-2. Generator

    Generator의 Loss는 다음과 같이 계산됩니다. Generator의 loss는 다음과 같이 크게 4가지 loss로 나누어져 있습니다. 각 term에 대해 조금 더 자세히 살펴보도록 하겠습니다.

\[L_{\mathcal{G}} = L_{3D} + L_{2D} + L_{SMPL} + L_{adv}\\\\\]
  • Adversarial Loss

        Adversarial Loss에 대한 수식은 다음과 같습니다. 위에서도 설명드렸듯이, 해당 Loss를 Minimize하기 위해서는 fake data에 대한 discriminator의 output이 1에 수렴해야 한다는 것을 유추할 수 있습니다. 다시 말해서, Generator에서 생성된 fake sequence를 discriminator에 넣었을 때, discriminator가 이를 real image로 인식하게끔 학습이 된다는 것을 의미합니다. 따라서, 학습이 진행될수록 Generator는 Discriminator를 속이기 위해 더 진짜같은 이미지를 만들고, Discriminator는 이를 구별해내기 위해 더 정교해진다고 할 수 있습니다.

\[L_{adv} = \mathbb{E}_{\Theta~p_G}[(\mathcal{D}_M(\hat{\Theta})-1)^2]\]

2D keypoint loss3D keypoint loss는 각 keypoint간의 L2 loss로 구해지며, SMPL loss는 shape parameter와 pose parameter간의 L2 loss로 구해집니다. 이 때, shape parameter는 average pooling을 해주었기 때문에 하나의 값에 대해서만 loss를 구하고, pose parameter는 모든 frame에 대해 loss를 구해 전부 더해주게 됩니다.

  • 3D Loss
\[L_{3D} = \sum^{T}_{t=1}{\lVert X_t - \hat{X}_t \rVert_2}\]
  • 2D Loss
\[L_{2D} = \sum^{T}_{t=1}{\lVert x_t - \hat{x}_t \rVert_2}\]
  • SMPL Loss
\[L_{SMPL} = \lVert \beta - \hat{\beta} \rVert_2 + \sum^{T}_{t=1}{\lVert \theta_t - \hat{\theta}_t \rVert_2}\]



4. Experiments

    다음은 실험 결과입니다. 먼저, 테스트에는 3개의 데이터셋이 사용되었습니다. 먼저, 3DPW 데이터셋은 60개의 video 시퀀스에 대해 18명의 사람이 등장하는 데이터 셋이고, MPI-INF-3DHP 데이터셋은 총 8명의 사람이 2개의 outfit으로 8개의 action을 하는 데이터셋입니다. 마지막으로 human 3.6 million 데이터셋은 이름 그대로 3.6 million개의 3d human pose를 담고 있는 데이터셋입니다.

    다음으로, loss의 측정은 크게 4가지의 방법을 사용하였습니다. 먼저, MPJPEMean Per Joint Position Error의 약자로써, 각 관절에 대한 오차를 mm단위로 측정한 것입니다. 다음으로 PA-MPJPE는, joint에 먼저 PA(Procrustes analysis)를 적용하여 rotation과 scale을 제거한 뒤, MPJPE를 측정한 loss입니다. 다음으로 PVEPer Vertex Error의 약자로 vertex간의 거리를 측정한 loss이며, 마지막으로 Accel loss는 position간의 acceleration을 측정하는 loss인데, 각 frame끼리 얼마나 부드럽게 연결되어있는지를 측정하는 loss입니다.

4-1. in-the-wild dataset

    여기서 주목할 점은, VIBE가 기존에 challenging task였던 in-the-wild한 데이터셋에 대해서 눈에 띄게 좋은 performance를 달성했다는 것입니다. MPJPE와 PVE Loss가 낮게 나오는 것은, 이전 sequence가 다음 sequence를 예측하는 데 도움을 줄 수 있다는 저자의 가설을 반증한다고 할 수 있겠습니다.

4-2. 3DPW dataset

    VIBE는 훈련 시 3DPW dataset을 사용하였는데, 이전 연구에서는 이를 사용하지 않았습니다. 따라서 direct comparation은 VIBE와 이전 연구들간의 직접적인 비교를 위해 3DPW를 사용하지 않고 훈련한 버전입니다.

    본 논문에서 저자는 훈련 시 3DPW를 사용하는 것이 in-the-wild performance를 증가시킬 것이라고 주장하였는데, 해당 table을 보시면 실제로 3DPW를 사용하여 추가 훈련을 하였을 때 performance가 더 좋아지는 것을 확인할 수 있습니다.

4-3. Accel loss

    그런데 frame간 smoothness는 VIBE보다 temporal HMR이 더 높은 것을 확인할 수 있습니다. 저자는 이에 대해서 temporal HMR이 더 공격적인 smoothing 전략을 사용하였고, 이러한 smoothness와 accuracy와는 trade-off관계가 존재한다고 설명하였습니다.

    다음은 Temporal HMR과 VIBE의 performance를 비교한 figure인데, 위쪽(VIBE)에 비해 아래쪽(Temporal-HMR)의 performance가 더 떨어지는 것을 확인할 수 있습니다. 이를 바탕으로 Temporal-HMR은 over-smoothing 되었으며, VIBE는 적절한 균형점을 찾았다고 해석할 수 있습니다.

4-4. Ablation table

    다음은 self attention에 대한 ablation table입니다. 그냥 concat을 해주는 것보다 frame간 attention을 구해주는 것이 더 좋은 performance를 보이는 것을 확인할 수 있습니다.

댓글남기기