Inception score
Frechet Distance
$$ d(X,Y) = (\mu_x - \mu_y)^2 + (\sigma_x - \sigma_y)^2 $$
$\mu$와 $\sigma$는 정규분포의 평균 및 표준 편차이며 $X,Y$는 두개의 정규분포
다변량 정규분포(multivariate normal distribution) 사이의 frechet distance
$$ ||\mu_x-\mu_y ||^2 + \text{Tr}(\Sigma_\text{x} + \Sigma_\text{y} - 2\sqrt{\Sigma_\text{x}\Sigma_\text{y}}) $$
$X,Y$는 두개의 다변량 정규분포로 실제와 가짜 임베딩
$\mu_x$와 $\mu_y$는 벡터 $X,Y$의 크기이며 $\sum_X$와 $\sum_Y$는 벡터의 공분산 행렬(covariance matrix)이다.
code
Pretrained Inception V3 불러오기
inception_model = tf.keras.applications.InceptionV3(include_top=False,
weights="imagenet",
pooling='avg')
실제 이미지와 생성된 이미지에 대한 임베딩 계산
최소 샘플 사이즈10,000을 권장함
def compute_embeddings(dataloader, count):
image_embeddings = []
for _ in tqdm(range(count)):
images = next(iter(dataloader))
embeddings = inception_model.predict(images)
image_embeddings.extend(embeddings)
return np.array(image_embeddings)
count = math.ceil(10000/BATCH_SIZE)
# compute embeddings for real images
real_image_embeddings = compute_embeddings(trainloader, count)
# compute embeddings for generated images
generated_image_embeddings = compute_embeddings(genloader, count)
real_image_embeddings.shape, generated_image_embeddings.shape
def calculate_fid(real_embeddings, generated_embeddings):
# calculate mean and covariance statistics
mu1, sigma1 = real_embeddings.mean(axis=0), np.cov(real_embeddings, rowvar=False)
mu2, sigma2 = generated_embeddings.mean(axis=0), np.cov(generated_embeddings, rowvar=False)
# calculate sum squared difference between means
ssdiff = np.sum((mu1 - mu2)**2.0)
# calculate sqrt of product between cov
covmean = linalg.sqrtm(sigma1.dot(sigma2))
# check and correct imaginary numbers from sqrt
if np.iscomplexobj(covmean):
covmean = covmean.real
# calculate score
fid = ssdiff + np.trace(sigma1 + sigma2 - 2.0 * covmean)
return fid
fid = calculate_fid(real_image_embeddings, generated_image_embeddings)
$$ MMD(p,q)=E_{x,x^{\prime}p}[K(x,x^{\prime})]+E_{x,x^{\prime}q}[K(x,x^{\prime})]-2E_{xp,x^{\prime}p}[K(x,x^{\prime})] $$