def calcola_confusion_matrix(pl): batch_size = pl["batch_size"] device = pl["device"] dims = pl["dims"] stats1 = {} # calcolo le statistiche della directory for ld1 in pl["dir1"]: path_ld1 = pl["prefix1"] + ld1 print("Calcolo statistica directory: " + ld1) m, s = calcola_statistiche_del_path(path_ld1, batch_size, dims, device) stats1[ld1] = (m, s) stats2 = {} for ld2 in pl["dir2"]: path_ld2 = pl["prefix2"] + ld2 print("Calcolo statistica directory: " + ld2) m, s = calcola_statistiche_del_path(path_ld2, batch_size, dims, device) stats2[ld2] = (m, s) matrice = np.zeros((len(pl["dir1"]), len(pl["dir2"]))) for i in range(len(pl["dir1"])): ld1 = pl["dir1"][i] for j in range(i, len(pl["dir2"])): ld2 = pl["dir2"][j] dd = fid.calculate_frechet_distance(stats1[ld1][0], stats1[ld1][1], stats2[ld2][0], stats2[ld2][1]) print(" distanza fra " + ld1 + " e " + ld2 + " = " + str(dd)) matrice[i][j] = dd matrice[j][i] = dd return matrice
def calc_average_fid_and_blur(model, dloader): fid = 0 blur = 0 model.eval() for batch_ind, (data, _) in enumerate(dloader): if model.confs['CUDA']: data = data.cuda() data = torch.autograd.Variable(data.view(1, 1, 28, 28)) #data.unsqueeze(0) print(data.shape) recon_x, _, _ = model.forward(data) blur += calc_blur(recon_x).data[0] recon_x = recon_x.view( 1, recon_x.shape[1] * recon_x.shape[2] * recon_x.shape[3]) #recon_x.unsqueeze() data = data.view(1, data.shape[1] * data.shape[2] * data.shape[3]) recon_acts_mean = np.mean(recon_x.data.cpu().numpy(), axis=0) recon_acts_sig = np.cov(recon_x.data.cpu().numpy(), rowvar=False) data_acts_mean = np.mean(data.data.cpu().numpy(), axis=0) data_acts_sig = np.cov(data.data.cpu().numpy(), rowvar=False) #print(recon_acts_sig) # Source: https://github.com/mseitzer/pytorch-fid fid += calculate_frechet_distance(data_acts_mean, data_acts_sig, recon_acts_mean, recon_acts_sig, eps=1e-8) #print(fid) print(blur) print('Fid: {}'.format(fid / len(dloader.dataset))) print('Blur: {}'.format(blur / len(dloader.dataset)))
mu_fake_vggface, sigma_fake_vggface = _compute_statistics_from_pred_arr( fake_pred_arr_vggface) mu_recon_vggface, sigma_recon_vggface = _compute_statistics_from_pred_arr( recon_pred_arr_vggface) mu_wrong_vggface, sigma_wrong_vggface = _compute_statistics_from_pred_arr( wrong_pred_arr_vggface) # here we use training stat for FID with open('training_stat_FID.pickle', 'rb') as f: training_stat = pickle.load(f) mu_real, mu_real_aligned, mu_real_vggface, \ sigma_real, sigma_real_aligned, sigma_real_vggface = \ training_stat['mu_real'], training_stat['mu_real_aligned'], training_stat['mu_real_vggface'], \ training_stat['sigma_real'], training_stat['sigma_real_aligned'], training_stat['sigma_real_vggface'] fid_real_fake = calculate_frechet_distance(mu_real, sigma_real, mu_fake, sigma_fake) fid_real_recon = calculate_frechet_distance(mu_real, sigma_real, mu_recon, sigma_recon) fid_real_wrong = calculate_frechet_distance(mu_real, sigma_real, mu_wrong, sigma_wrong) fid_real_fake_aligned = calculate_frechet_distance(mu_real_aligned, sigma_real_aligned, mu_fake_aligned, sigma_fake_aligned) fid_real_recon_aligned = calculate_frechet_distance(mu_real_aligned, sigma_real_aligned, mu_recon_aligned, sigma_recon_aligned) fid_real_wrong_aligned = calculate_frechet_distance(mu_real_aligned, sigma_real_aligned,
mu_real_aligned, sigma_real_aligned = _compute_statistics_from_pred_arr( real_pred_arr_aligned) mu_fake_aligned, sigma_fake_aligned = _compute_statistics_from_pred_arr( fake_pred_arr_aligned) mu_recon_aligned, sigma_recon_aligned = _compute_statistics_from_pred_arr( recon_pred_arr_aligned) with open('training_stat_FID.pickle', 'rb') as f: training_stat = pickle.load(f) mu_real, mu_real_aligned, mu_real_vggface, \ sigma_real, sigma_real_aligned, sigma_real_vggface = \ training_stat['mu_real'], training_stat['mu_real_aligned'], training_stat['mu_real_vggface'], \ training_stat['sigma_real'], training_stat['sigma_real_aligned'], training_stat['sigma_real_vggface'] fid_real_fake = calculate_frechet_distance(mu_real, sigma_real, mu_fake, sigma_fake) fid_real_recon = calculate_frechet_distance(mu_real, sigma_real, mu_recon, sigma_recon) fid_real_fake_aligned = calculate_frechet_distance( mu_real_aligned, sigma_real_aligned, mu_fake_aligned, sigma_fake_aligned) fid_real_recon_aligned = calculate_frechet_distance( mu_real_aligned, sigma_real_aligned, mu_recon_aligned, sigma_recon_aligned) predicts_fake = [] predicts_recon = [] predicts_fake_aligned = [] predicts_recon_aligned = [] for i in range(num_imgs):