forked from ENGI9805-COMPUTER-VISION/Term-Project
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtest_benchmark.py
executable file
·85 lines (69 loc) · 3.21 KB
/
test_benchmark.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import os
from math import log10
import numpy as np
import pandas as pd
import streamlit as st
import torch
import torchvision.utils as utils
from torch.autograd import Variable
from torch.utils.data import DataLoader
from tqdm import tqdm
import pytorch_ssim
from data_utils import TestDatasetFromFolder, display_transform
from model import Generator
@st.cache()
def test_benchmark(upscale_factor, epoch_num):
model_name = 'netG_epoch_{}_100.pth'.format(upscale_factor)
results = {'Set5': {'psnr': [], 'ssim': []}, 'Set14': {'psnr': [], 'ssim': []}, 'BSD100': {'psnr': [], 'ssim': []},
'Urban100': {'psnr': [], 'ssim': []}, 'SunHays80': {'psnr': [], 'ssim': []}}
model = Generator(upscale_factor).eval()
if torch.cuda.is_available():
model = model.cuda()
model.load_state_dict(torch.load('epochs/' + model_name, map_location=torch.device('cpu')))
test_set = TestDatasetFromFolder('data/test', upscale_factor=upscale_factor)
test_loader = DataLoader(dataset=test_set, num_workers=4, batch_size=1, shuffle=False)
test_bar = tqdm(test_loader, desc='[testing benchmark datasets]')
out_path = 'benchmark_results/SRF_' + str(upscale_factor) + '/'
if not os.path.exists(out_path):
os.makedirs(out_path)
for image_name, lr_image, hr_restore_img, hr_image in test_bar:
image_name = image_name[0]
# volatile is no longer available
# lr_image = Variable(lr_image, volatile=True)
# hr_image = Variable(hr_image, volatile=True)
# image = Variable(ToTensor()(lr_image), volatile=True).unsqueeze(0)
with torch.no_grad():
lr_image = Variable(lr_image)
hr_image = Variable(hr_image)
if torch.cuda.is_available():
lr_image = lr_image.cuda()
hr_image = hr_image.cuda()
sr_image = model(lr_image)
mse = ((hr_image - sr_image) ** 2).data.mean()
psnr = 10 * log10(1 / mse)
ssim = pytorch_ssim.ssim(sr_image, hr_image).data.item()
test_images = torch.stack(
[display_transform()(hr_restore_img.squeeze(0)), display_transform()(hr_image.data.cpu().squeeze(0)),
display_transform()(sr_image.data.cpu().squeeze(0))])
image = utils.make_grid(test_images, nrow=3, padding=5)
utils.save_image(image, out_path + image_name.split('.')[0] + '_psnr_%.4f_ssim_%.4f.' % (psnr, ssim) +
image_name.split('.')[-1], padding=5)
# save psnr\ssim
results[image_name.split('_')[0]]['psnr'].append(psnr)
results[image_name.split('_')[0]]['ssim'].append(ssim)
out_path = 'statistics/'
saved_results = {'psnr': [], 'ssim': []}
for item in results.values():
psnr = np.array(item['psnr'])
ssim = np.array(item['ssim'])
if (len(psnr) == 0) or (len(ssim) == 0):
psnr = 'N/A'
ssim = 'N/A'
else:
psnr = psnr.mean()
ssim = ssim.mean()
saved_results['psnr'].append(psnr)
saved_results['ssim'].append(ssim)
data_frame = pd.DataFrame(saved_results, results.keys())
data_frame.to_csv(out_path + 'srf_' + str(upscale_factor) + '_test_results.csv', index_label='DataSet')
return data_frame