본문 바로가기
Deep Learning/3D Reconstruction

[논문 리뷰] Deep3DFaceRecon: Accurate 3D Face Reconstruction with Weakly-Supervised Learning: From Single Image to Image Set (CVPRW 2019)

by kail9974 2021. 8. 31.

참조 1. 결과 이미지

3D Reconstruction을 위해서는 실사에 맞는 GT 3D 모델이 매우 많이 필요한데, 그런 데이터는 부족하다.

이 논문은 약한 지도 학습을 위한 low level, perceptual level 정보를 다루는 강건한 손실함수와 동일 인물의 여러 이미지로부터 보완 정보를 활용하는 방법을 제안한다.

이 방법을 통해 얼굴을 가리는 물체가 있거나 입을 크게 벌려 포즈의 변화가 커도 잘 동작하는 결과물을 보여준다.

공식 구현체는 3DMM으로 BFM09(Basel Face Model 2009)를 사용하였다.

2019년에 나온 논문이지만 Weakly Supervised Learning이라는 점에서 2021년 현재까지도 강점을 가지고 있어 깊게 읽어보았다.

Paper: https://arxiv.org/abs/1903.08527

Github

 

Introduction

2D 이미지로 3D Shape을 추정하는 것은 이미 많은 연구가 있었지만 실측 데이터가 부족해서 성능 저하에 시달렸다.

이를 극복하기 위한 비지도 학습 모델도 여럿 공개되었으며 이 논문도 비지도 학습을 통해 결과물을 만들어낸다.

모델을 학습하기 위해 중요한 것은 손실함수의 설정이고 올바른 손실함수를 설정하였다면 모델의 성능을 더 높이기 위한 방법을 고려하게 된다. 이 관점에서 저자의 접근 방식을 서술하면 다음과 같다.

 

3D Shape을 학습하는 것은 미분 가능한 Renderer를 만드는 것이 가장 핵심이며 이 렌더링 된 결과물을 2D로 투영하여 입력 이미지와의 오차로부터 학습한다.

3D Shape을 2D로 투영한 것과 입력 이미지의 오차는 흔히 이미지 간의 오차로 사용되는 Pixelwise l1, l2 loss를 사용할 수 있지만, 단순히 pixel 값을 맞추는 것은 local minima에 빠지거나 overfitting을 초래하게 된다.

이런 문제가 발생한 모델은 loss 자체는 낮지만 이상한 결과물을 보여준다거나(local minima) 결과물 그 자체는 괜찮아 보이지만 수정하면(광원을 바꾼다거나 pose를 수정하면) 이상해지는 결과물(overfitting)을 보게 될 것이다.

이를 방지하기 위해서는 pixelwise loss 뿐만 아니라 perceptual loss를 쓰는 것이 아주 큰 도움이 되며 이는 Fast Style Transfer 논문의 결과물에서 확실히 알 수 있다.

또 perceptual loss만 사용한다면 잠재 공간의 정보가 아닌 RGB 공간에서의 디테일한 정보를 학습하지 못하게 되고 마찬가지로 나쁜 결과를 얻게 된다.

저자는 pixel loss와 perceptual loss를 적절히 결합한 loss를 사용해서 좋은 결과물을 보여준다.

이와 함께 피부 색상은 광원이나 선글라스에 의해 왜곡되기 쉬운데 이런 왜곡을 피하기 위한 방법도 제안하고 있다.

 

3D Reconstruction 모델의 성능을 높이기 위한 방법 중 가장 단순하게 생각해 볼 수 있는 것은 동일한 identity를 갖는 이미지를 여러장 가지고 있다면 모든 정보를 활용하여 더 좋은 결과를 얻는 방법을 고안하는 것이다.

사실 이것은 너무나도 당연한 사실이지만 생각보다 쉬운 것은 아니다.

가장 단순히 생각했을 때 평균을 취해 모델에 적용하는 것이지만, 이 경우 저품질의 이미지를 걸러낼 수 없고 pose 정보도 반영되지 않는 등 문제가 발생한다.

이를 위해 '신뢰도'를 추정하는 별도의 네트워크를 학습하여 신뢰도를 기반으로 여러 장의 이미지로부터 Identity 계수를 얻는 방법을 제안한다.

 

Models and Outputs

Figure 1. (a) Framework, R-Net: Reconstruction network, C-Net: Confidence subnetwork. (b) 단일 이미지에 대한 처리과정, 어떤 GT도 필요없으며 랜드마크나 피부 추정 같은 부차적인 정보만 있으면 됨. (c) 다중 이미지에 대한 처리과정, C-Net도 명확한 Label이 필요없음.

Figure 1 (a)에서 전체 구조를 볼 수 있는데 계수를 보면 이것이 누구인지, 표정은 어떤지, 피부 텍스쳐는 어떠한지 외에 광원과 얼굴 각도도 추정하는 것을 알 수 있다.

아래는 R-Net에서 이 값들을 각각 몇 차원의 벡터로 추정하는지와 R-Net의 최종 output은 어떠한지를 설명한다.

 

3D Face Model

먼저 3D Shape에 대한 계수를 살펴보자.

3D Face를 만들기 위한 계수 백터 $\alpha\in\mathbb{R}^{80}, \beta\in\mathbb{R}^{64}, \delta\in\mathbb{R}^{80}$에 대해서 얼굴 형태 S와 텍스쳐 T는
그 평균값 $\bar{S}, \bar{T}$와 identity, expression, texture의 PCA 값인 $B_{id}, B_{exp}, B_t$으로 다음과 같이 표현할 수 있다.

$$S=S(\alpha,\beta)=\bar{S}+B_{id}\alpha+B_{exp}\beta$$

$$T=T(\delta)=\bar{T}+B_t\delta$$

인류 평균의 얼굴에 그 사람의 특징과 표정을 더하여 최종 얼굴형을 도출하고
인류 평균의 피부에 그 사람의 피부에 필요한 값을 더하여 최종 피부를 추정한다고 생각하면 된다.

인류 평균값을 구할 수는 없으므로 BFM에서 $\bar{S}, B_{id}, \bar{T}, B_t$을 가져와서 사용하고 FaceWarehouse를 바탕으로 설계한 Cnn-based real-time dense face reconstruction with inverserendered photo-realistic face images에서 $B_{exp}$를 가져와서 사용한다.

 

참조 2. BFM의 모든 정점을 Rendering한 것. 참조 1의 GIF에는 귀와 목이 없다.

BFM은 남녀 각 100명의 얼굴을 Scan한 dataset이고, FaceWarehouse는 150명의 얼굴 표정을 Scan한 dataset이다.

총 53,490개의 정점이 있는데 이 논문에서는 귀와 목은 제외하여 약 36,000(67.3%)여개의 정점을 사용한다.

귀와 목은 사실 그렇게 중요하지 않기 때문에 제거해도 무방하며 그로써 연산 비용을 낮출 수 있다.

 

참조 3. FaceWarehouse의 Blendshape 생성 과정.

FaceWarehouse는 표정에 따른 3D Shape dataset이며 BFM과는 다른 topology의 3DMM이다.

입을 벌리거나 윙크를 하는 등 급격하게 변화하는 mesh에 대한 정보를 얻기 위해 사용한다.

 

Illumination Model

다음으로 빛에 의해 그림자가 생기는 등의 요인으로부터 나타나는 왜곡을 방지하기 위해 광원을 추정하는 부분이다.

빛이 어느 방향으로부터 오는지를 추정하는 것인데 이를 정확하게 맞추는 것은 아주 어려운 일이다.

어떤 물체가 있고 광원이 있을 때, 물체에는 빛이 부딪혀 반사될 것이고 반사된 빛이 우리의 눈에 들어와 망막에 상이 맺히게 된다. 그렇다면 물체로부터 반사된 모든 빛을 적분한다면 어디서 빛이 오는지 알 수 있게 된다.

하지만 물체 위의 모든 광선을 적분한다는 것은 연산량이 아주 많기 때문에 단순화 할 필요가 있다.

구면 조화 함수(Spherical Harmonics, envmapinverse rendering)를 사용하면 연산을 단순화할 수 있으며 이는 Fourier Transform 처럼 1개의 파장을 $n$개의 주파수로 분해할 수 있듯이 각 광원에 대한 정보를 $n^2$개의 주요 parameter로 추정하는 것으로 생각하면 될 것 같다.

(구면 조화 함수는 구면좌표계에서의 Laplace Transform으로 보면 되며, 지름을 제외한 극각 $\theta$와 방위각 $\phi$에 대한 일반해를 의미한다. 구면 조화 함수는 이 글을 읽어보길 바란다. https://patapom.com/blog/SHPortal/)

 

광원을 추정하기 위해서 얼굴을 Lambertian 표면으로 가정한다.

Labmbertian 표면은 모든 방향으로 같은 세기의 빛을 반사하는 표면인데, 현실과 같은 난반사를 연산하면 그 비용이 너무나도 크기 때문에 난반사를 표현할 때 사용되는 방법이다.

3D Shape의 정점 $s_i$를 Normal vector $n_i$와 텍스쳐 $t_i$를 갖고 있는 점으로 정의하자.

Normal vector는 관측자에게 들어오는 광량을 알 수 있게 해주며 텍스쳐는 그 지점의 픽셀 색상 정보를 갖고 있다.
이 때 Radiosity는 band 값 B(구면 조화 함수의 $l$에 해당함)와 구면 조화 함수 $\Phi_b : \mathbb{R}^3 \rightarrow \mathbb{R}$에 대해서 다음과 같다.

$$C(n_i,t_i|\gamma)=t_i\cdot\sum_{b=1}^{B^2} \gamma_b \Phi_b(n_i)$$

논문에서 광원은 band 값 B를 3으로 설정한 단색광($\gamma\in\mathbb{R}^9, \because B=3, B^2=9$) 3개를 가정하고 추정한다.
결과적으로 단색광 3개이므로 광원 parameter는 27개가 된다.

 

Camera Model

광원을 추정했듯이 관측자인 카메라가 어디서 바라보고 있는지도 중요하다.

3D를 2D로 투영해서 경험적으로 정의한 초점거리를 추정하는 카메라 모델을 사용하는데 x, y축으로 얼마나 차이나는지와 z축으로는 얼마나 차이나는지를 추정한다.

카메라를 통해 사진에서 인물의 얼굴 Pose는 각도 roll, pitch, yaw와 위치 x, y, z 에 의해 결정된다.

 

Summary

어떤 사람인지 $\alpha$ 80차원, 표정은 어떤지 $\beta$ 64차원, 피부는 어떤지 $\delta$ 80차원이므로

Face 계수 = $\alpha, \beta, \delta$ 총 224차원

각 광원 계수 9차원에 대해서 3개의 광원을 가정하여

광원 계수 = $\gamma$ 총 27차원

각도 3차원 위치 3차원으로

Pose 계수 = $p$ 총 6차원

결과적으로 R-Net은 257차원의 출력을 가지며 Backbone으로 ResNet-50을 사용하여 위 계수를 추정한다.

 

Hybrid Loss

Introduction에서 설명했듯이 pixelwise loss, perceptual loss 둘 중 하나만 쓰는 것은 성능이 나쁘며 이를 적절하게 통합하여 사용하는 것이 중요하다.

최종 출력인 이미지 공간상에서 연산가능한 Image-level loss로 광도 오차와 피부영역 mask를 사용하며 또 landmark 정보를 사용하여 content 정보를 학습할 수 있도록 보조한다.

개인적으로는 피부 mask와 landmark를 함께 쓰는 것보다 segmentation 모델 하나를 쓰는 것이 오히려 더 좋지 않을까 싶은 의문이 들긴 했다.

 

Robust Photometric Loss (Image-level Loss)

Figure 2. skin attention mask 사용 유무 (Top: X, Bottom: O), 선글라스나 머리카락에 의한 피부색 오추정을 방지한다.

입력 이미지 $I$와 Reconstructed 이미지 $I'$ 간의 조밀한 광도 오차를 계산한 loss.

픽셀 인덱스 $i$와 재투영된 얼굴 영역 $\mathcal{M}$, 피부 색상에 대한 Attention Mask $A$ 대해서 수식은 다음과 같다.

$$L_{photo}(x)=\frac{\sum\nolimits_{i\in \mathcal{M}} A_i \cdot \lVert I_i - I_i'(x) \rVert_2}{\sum\nolimits_{i\in \mathcal{M}} A_i}$$

 

여기서 사용되는 피부에 대한 Attention Mask $A$는 선글라스와 같은 물체가 있거나 수염이나 진한 화장같은 피부 정보에 noise가 많은 이미지에 대해서 강건함을 얻기 위한 것이다.

각 픽셀에 대해서 피부색일 확률 $P_i$를 계산하여 mask를 얻는다.

피부일 확률을 연산하기 위해 피부색 데이터와 Gaussian Mixture Models을 사용하여 Naive Bayes 분류기를 학습하는데 출력이 0.5보다 작은 부분은 그대로 두고 나머지를 1로 주어 mask를 설정한다.

이렇게 학습한 피부 mask를 사용하면 복잡한 segmentation 모델 없이도 잘 학습된다고 한다.

 

Landmark Loss (Image-level Loss)

weak supervision으로 피부에 대한 정보 외에 Landmark도 사용한다. Pretrained face align 모델을 사용하며 입력 이미지의 68개 landmark $\{ q_n \}$과 Reconstructed 이미지의 3D landmark 정점을 2D로 투영한 $\{ q_n' \}$의 오차를 계산한다.

$$L_{lan}(x)=\frac{1}{N}\sum_{n=1}^N \omega_n \lVert q_n - q_n'(x) \rVert^2$$

여기서 $\omega_n$은 각 landmark에 대한 weight다. (나머지는 1로 주고 안쪽입술과 코에 대해서만 20을 주었다고 한다.)

 

Perceptual Loss

Figure 3. Perceptual loss의 사용 유무 (Top: X, Bottom: O), 숫자는 Photometric error를 의미하는데 error가 적다고 해서 shape이 좋은 것은 아님을 알 수 있다.

잠재 공간에서의 Loss를 계산하는 것인데, 얼마나 '사람이라는 것 그 자체'에 대한 정보를 잘 보존하느냐를 보는 것이다.
Perceptual loss를 계산하기 위해서는 해당 도메인에 맞는 아주 많은 양의 데이터를 학습한 모델이 필요하다.

이를 위해 인터넷에서 수집한 5만명의 사람에 대한 사진 300만장을 사용하여 FaceNet을 학습하였다고 한다.

Fast Style Transfer에서 VGG를 통해서 계산되는 Perceptual loss와 같은 개념이다.

$$L_{per}(x)=1-\frac{<f(I),f(I'(x))>}{\lVert f(I) \rVert \cdot \lVert f(I'(x)) \rVert}$$

여기서 $<\cdot,\cdot>$는 내적을 의미한다.

 

Regularization

위의 loss만 사용함으로써 과적합이 되어 얼굴형과 텍스쳐가 변성되는 것을 방지하기 위한 penalty도 적용한다.

앞서 추정한 3DMM 계수 $\alpha, \beta, \gamma$를 이용하여 다음 loss를 추가한다.

$$L_{coef}(x)=\omega_\alpha \lVert \alpha \rVert^2 + \omega_\beta \lVert \beta \rVert^2 + \omega_\gamma \lVert \delta \rVert^2$$

$$\omega_\alpha=1.0, \omega_\beta=0.8, \omega_\gamma=1.7e-3$$

 

또 BFM의 텍스쳐는 머리카락이 얼굴을 가리는 등(ambient occlusion)의 일부 shading이 있으므로 이것으로부터 영향을 받지 않는 피부 albedo를 만들 필요가 있다.

이를 위해 미리 설정한 피부 영역 $\mathcal{R}$에 대한 텍스쳐의 variance에 penalty로 reflectance loss를 설정한다.

$$L_{tex}(x)=\sum\nolimits_{c\in\{ r, g, b \}} var(T_c, \mathcal{R}(x))$$

얼굴 전체에서 피부 기댓값을 빼서 분산을 계산한 것이다.

 

Hybrid Loss - Summary

$$L(x) = w_{photo}L_{photo}(x) + w_{lan}L_{lan}(x) + w_{per}L_{per}(x) + w_{coef}L_{coef}(x) + w_{tex}L_{tex}(x)$$

 

Gamma Loss

이 부분은 논문에 서술되어 있지 않으나 공개된 Code에 적용되어 있는 loss다.

광원이 단색광임을 확실시하기 위한 광원계수 gamma에 대한 regularization이다.

$$L_{gamma}(x)= \frac{1}{n} \sum_{i=1}^n \left( \gamma_i - \bar{\gamma_i} \right) $$

Multi-Image Reconstruction

학습을 위한 loss의 설계를 마무리했다면, 성능을 높이기 위해서 더 많은 정보를 사용하려면 어떻게 해야하는지를 설명한다. 더 많은 정보 즉, 동일 identity의 이미지 여러장을 활용하기 위한 방법이다.

이미지 여러장을 사용하기 위해서 각각의 이미지가 얼마나 신뢰할만한지(품질은 괜찮은지, 같은 사람인지 등) 평가하기 위한 Network를 학습한다.

이 Network가 C-Net이며 각 이미지의 R-Net 출력으로 얻은 3D Shape 계수로부터 신뢰도 $c\in \mathbb{R}^{80}$을 출력으로 가진다.

 

각각의 이미지 $\alpha$계수 $\alpha^j$에 대해 이미지 여러장의 공통 $\alpha$계수를 $\alpha_{aggr}$이라 할 때 수식은 다음과 같다.

$$\alpha_{aggr}=(\sum\nolimits_j c^j \odot \alpha^j) \oslash (\sum\nolimits_j c^j)$$

$\odot$ = Elementwise Product

$\oslash$ = Elementwise Division

각각의 이미지에 대한 신뢰도 $c^j$를 계산하는 것이 C-Net이다.

 

Label-Free Training

C-Net을 학습 할 때 label 없이 단순히 각 이미지에 대한 출력 계수들의 Loss를 평균내어 학습한다.

대신 각 이미지의 $\alpha$가 사용되는 것이 아니라 $\alpha_{aggr}$이 사용되며 그에 따라 c가 학습이 된다.

 

Confidence-Net Structure

C-Net은 R-Net의 앞쪽 레이어의 feature map과 뒤쪽 레이어의 feature map을 재활용하는 가벼운 Network다.

 

Experiments

이미지 입력 해상도는 224이며 ImageNet으로 pretrain 한 Resnet-50에  CelebA, 300W-LP, I-JBA, LFW, LS3D 등 다양한 dataset에서 약 26만장의 사진을 사용하여 학습했다.

Table 1. reconstruction error(mm)에 대한 ablation 실험, 모든 loss를 다 쓰는 것이 가장 성능이 좋음
Figure 4. 다른 Unsupervised Model과의 비교. Deep3DFaceRecon이 더 뛰어나다.
Figure 8. 다른 Self-supervised 모델과의 비교. 얼굴을 가리는 선글라스나 안경에 대해 훨씬 뛰어난 결과를 보여준다.
Figure 12. In-The-Wild 이미지에 대해 Confidence 순으로 정렬한 것과 그 결과물.

결론

  • 3DMM에 대한 평균값, Expression 정보만 가져오고 나머지는 모두 알아서 학습하도록 만든 모델
  • GT를 안쓰는 대신 Landmark와 Skin 정보를 사용하여 weakly supervised learning
  • GT를 쓴 모델보다도 뛰어난 결과물

개인적인 생각

  • 다른 주제의 논문이지만 Face-to-Parameter 같은 경우 landmark보다 segmentation을 사용했을 때가 훨씬 좋은 결과가 나왔다고 했기에 피부 모델 + Landmark 모델 대신 Segmentation 모델만 사용하면 결과가 어떨지 궁금함.

댓글