개요
문제점들
Facial landmark detection 분야에서 SOTA 모델들을 사용해 봤으면 알겠지만 다들 성능이 시원지 않습니다. 대략적인 얼굴 모양은 잡아주지만, 디테일이 전혀 살지 않습니다. 눈을 감는 것이 잘 잡히지 않는다거나, 입술 모양의 위치가 부정확하다거나, 다양한 문제가 발생하는데요... 가장 큰 문제 중 하나는 결국 데이터입니다. 학계에서 주로 사용하는 데이터 (300W, WFLW 등등)는 사람이 label을 하는데 consistent 하게 얼굴 landmark를 label 하는 것이 결코 쉽지 않습니다. 특히 얼굴 경계에 해당하는 landmark는 정확히 어느 위치에 점을 찍어야 하는지가 애매하기 때문에 ambiguity가 심각하고, 이것이 open source data중 큰 문제 중 하나입니다. (부정확한 label, 데이터 분포 문제 등등 다른 문제도 있지만)
논문의 아이디어
"STAR Loss: Reducing Semantic Ambiguity in Facial Landmark Detection" (github page)이라는 논문에서는 이러한 데이터의 한계점을 극복하는 한 가지 방법으로 STAR loss를 제안하였습니다. 저자들이 아이디어를 얻게 된 배경은 다음과 같습니다 (밑에 그림 참고). facial landmark를 예측할 때 사용되는 heat map의 분포를 보면 (heat map: landmark의 위치를 나타내기 위해서 사용되는 중간 결과) heat map의 분포를 보면, 위치가 애매한 landmark 같은 경우 애매한 방향을 따라서 (예를 들어 얼굴 landmark 같은 경우 얼굴 contour 방향) 표준편차가 높습니다. 반면 눈 코너에 해당되는 46번 landmark 같은 경우 상대적으로 명확하기 때문에 isotropic gaussian 같은 분포를 보입니다.
heat map 분포의 표준편차가 큰 방향으로 발생하는 loss에 너무 집중하는 것이 무의미하기 때문에, 이렇한 이유로 커지는 loss를 suppress 해주겠다는 것이 기본적인 아이디어입니다.
방법
기본적으로 알아야할 배경지식
이미지에서 landmark를 예측하기 위해서 다양한 방식들이 있는데 soft-Argmax라는 방식이 인기가 있는 방법 중 하나입니다.
"Numerical Coordinate Regression with Convolutional Neural Networks"이라는 논문에서 제안한 방식인데 (2018년) 그림을 보면 이해하기 쉽습니다.
위 그림에서 Z는 landmark의 위치를 확률적으로 나타낸 이미지입니다. X는 각 pixel의 x 값, Y는 각 pixel의 y 값을 나타낸 이미지입니다.
따라서 위 heat map을 해석하면 landmark의 위치는 x=0.4, y=0.0이 됩니다.
STAR Loss 논문에서도 기본적으로 이러한 방법으로 landmark의 위치를 표현합니다:
이렇게 얻은 위치와 ground truth (GT) landmark 위치 사이 거리를 최소화하는 방식으로 loss를 구현하는 것이 기본적인 landmark regression 방식이고, STAR Loss 논문에서도 큰 토대는 같습니다:
참고로 Eq (1) & Eq (2)만 사용하면 확률 분포의 standard deviation이 너무 작아질 수 있기 때문에 확률 분포의 표준편차에 대한 regularization이 들어가야 더 좋은 성능이 나옵니다 ("Numerical Coordinate Regression with Convolutional Neural Networks" 논문 참고). STAR Loss는 이러한 regularization이 필요가 없지만 추가하면 약간 이득을 본다고 합니다 (논문 ablation study 참고).
STAR Loss
전처리 작업
1. heat map 분포의 모양이 중요하기 때문에 우선 covariance matrix를 구합니다:
- 여기서 \( V_1=\sum_i h_i\)이고 (heat map이 normalized 되었다고 가정하지 않았기 때문에 필요한 normalization constant),
- \( \mu, y_i\)는 이전 섹션에 식 (1) 참고.
이 식은 sample bias의 문제가 있어서 unbiased covariance matrix를 사용하게 되는데, 다음과 같이 표현됩니다 (Bessel's correction 참고):
밑에서는 \( \Sigma = \Sigma_{ub}\)라고 생각하시면 됩니다.
2. Eigenvalue decomposition을 해줍니다:
여기서 V는 eigenvector, L는 eigenvalue로 구성됩니다:
\[ \begin{align} L=diag(\lambda_1, \lambda_2) \in \mathbb{R}^{2\times 2}\\ V = [v_1, v_2] \in \mathbb{R}^{2\times 2} \end{align} \]
참고: \( (v_1, \lambda_1)\): first principal component, \( (v_2, \lambda_2)\): second principal component.
principal component 계산 값을 그림으로 보면 다음과 같다고 합니다
얼굴 contour에 해당되는 landmark같은 경우 principal component들을 보면 예상대로 첫 번째 principal component (eigenvalue, 즉 표준편차가 더 큰 방향)는 얼굴 경계를 따라 형성이 됩니다.
Loss 계산하는 방법
단순하게는 다음과 같이 계산을 해볼 수 있습니다:
기본적으로 식 (2)와 같지만 loss를 principal component 방향으로 쪼갠 후 각 방향의 표준편차로 나눠줍니다.
하지만 단순히 이렇게 계산하게되면 \( lambda_{1,2}\)가 커지면서 loss를 줄일 수 있기 때문에 조금 변형이 필요한데
1. 식 (6)에서 \( \lambda_{1,2}\)에 대한 gradient는 계산하지 않도록 gradient detach를 (torch.Tensor.,detach)해줍니다
2. 다음과 같이 regularization을 해줍니다
참고로 식 7은 표준편차를 작게 유도하지만 식 (6)은 표준편차를 크게 유도하기 때문에 (gradient이 detach 되었지만 heat map은 학습이 됨으로...) 표준편차에 대한 regularization이 됩니다.
실험
구체적인 실험 방법은 논문 참고.
loss function를 STAR Loss 버전으로 바꾸면 성능이 좋아진다고 합니다:
단순한 Hourglass network로도 SOTA를 찍을 수 있습니다: