본문 바로가기
Deep Learning

[DL] GAN을 평가하는 방법 - IS, FID, LPIPS

by JJuOn 2022. 2. 20.

이번 포스팅에서는 GAN을 평가하는 데 주로 사용되는 metric인 IS, FID 그리고 LPIPS에 대해 알아보도록 하겠습니다.

GAN은 두가지 관점에서 평가됩니다.

  • Quality: 실제 이미지와 유사한 이미지가 생성되는가
  • Diversity: 여러 noise vector에 걸쳐 다양한 이미지가 생성되는가


앞으로 소개해 드릴 metric들은 위 두가지 관점에서 GAN을 평가하기 위해 사용됩니다.


Inception Score (IS)

IS는 ImageNet pretrained model인 inception-v3를 이용하여 GAN을 측정합니다. IS를 계산하기 위해 두가지 확률이 필요한데 하나는 조건부 확률 \(P(y|x)\)로 생성된 이미지 x에 대해서 어떤 클래스에 속할지 예측하는 것입니다. 고품질의 이미지를 생성할 수록, 하나의 클래스에만 속할 확률이 높아 엔트로피가 낮게 측정될 것입니다. 두번째로 필요한 확률은 주변 확률입니다. 주변 확률은 \(P(y)=\int_zP(y|G(z))\)로 여러 noise vector에 대해서 예측된 class들을 의미합니다. 만약 GAN이 diverse한 이미지를 생성한다면 엔트로피가 \(P(y)\) 가 uniform 하게 나올것이며, 높은 엔트로피를 갖게됩니다. IS를 계산하기 위해서 조건부 확률과 주변 확률의 KL-divergence를 계산해줍니다. 따라서 최종 IS는 아래와 같습니다.

\[IS=\exp(\mathbb{E}_{{x}\sim{p_{data}}}D_{KL}(P(y|x)\Vert{P(y)}))\]


Frechet Inception Distance (FID)

FID를 측정하기 위해 ImageNet으로 pretrain된 Inception-v3 모델이 필요합니다.
Inception-v3 모델을 feature extractor로 사용하여 실제 이미지와 생성된 이미지 사이의 activation map을 추출합니다. Activation map을 통해 multivariate gaussian distribution을 구할 수 있습니다. 그럼 이제 실제 이미지의 확률 분포와와 생성된 이미지의 확률 분포 사이의 Wassertein-2 distance를 측정하여 FID를 구할 수 있습니다:

\[FID=d^2=\Vert{\mu_1-\mu_2}\Vert^2_2-Tr(\Sigma_1+\Sigma_2-2\Sigma_1\Sigma_2)\]

여기서 \(\mu, \Sigma\) 는 각각 mean과 covariance matrix를 의미합니다. 그리고 Tr은 matrix에서 주 대각선의 합입니다.

FID가 낮게 나온 생성된 이미지는 실제 이미지와 확률 분포적으로 유사하다고 볼 수 있습니다.
따라서 GAN의 FID가 낮게 측정될 수록 high-quality의 이미지를 생성한다고 평가됩니다.

Pytorch의 경우 https://github.com/mseitzer/pytorch-fid의 라이브러리를 주로 사용합니다.


Learned Perceptual Image Patch Similarity (LPIPS)

LPIPS는 비교적 초기의 ImageNet classsification 모델인 AlexNet, VGG, SqueezeNet을 사용합니다. LPIPS는 "The Unresonable Effectiveness of Deep Features as a Perceptual Metric"에서 처음 소개된 것인데, 기존의 IS나 FID와는 다르게 유사도를 사람의 인식에 기반하여 측정하려 시도했습니다. 그 과정에서 AlexNet, VGG, SqueezeNet의 feature map이 사람의 인식과 유사하기 때문에 이를 활용하고자 하였습니다.

두 이미지 \(x\), \(x_0\)가 주어졌을 때, ImageNet으로 pretrain된 network의 몇몇 layer \(l\)에서의 activation map \(\hat{y}^l_{hw}, \hat{y}^l_{0hw}\)을 얻어 Euclidean distance 계산한 후 \(w^l\)로 scaling한 다음 channel-wise averaging을 한 값을 \(l\)에 대해 평균을 내면 LPIPS가 얻어집니다. 수식으로 표현하면 아래와 같습니다.

\[LPIPS=\sum_l{\cfrac{1}{H_lW_l}}\sum_{h,w}{\Vert{w^l{\odot}(\hat{y}^l_{hw}-\hat{y}^l_{0hw})}\Vert}^2_2\]

낮은 LPIPS는 두 이미지가 perceptually similar하다고 볼 수 있습니다.
Pytorch의 경우 https://github.com/richzhang/PerceptualSimilarity의 라이브러리를 주로 사용합니다.


References

[1] https://m.blog.naver.com/chrhdhkd/222013835684
[2] https://github.com/mseitzer/pytorch-fid
[3] https://arxiv.org/abs/1801.03924
[4] https://github.com/richzhang/PerceptualSimilarity

댓글