IADNet / eval.py
S-t-a-m-i's picture
Upload 48 files
badd373 verified
Raw
History Blame Contribute Delete
8.84 kB
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import argparse
from tqdm import tqdm
from data.data import *
from torchvision import transforms
from torch.utils.data import DataLoader
from loss.losses import *
from net.IADNet import IADNet
def unwrap_model(net):
return net.module if isinstance(net, torch.nn.DataParallel) else net
def _normalize_state_dict_keys(state_dict, target_has_module_prefix):
has_module_prefix = all(k.startswith("module.") for k in state_dict.keys())
if has_module_prefix == target_has_module_prefix:
return state_dict
if target_has_module_prefix:
return {f"module.{k}": v for k, v in state_dict.items()}
return {k[len("module."):]: v if k.startswith("module.") else v for k, v in state_dict.items()}
def load_checkpoint_flexible(model, model_path):
checkpoint = torch.load(model_path, map_location=lambda storage, loc: storage)
state_dict = checkpoint["state_dict"] if isinstance(checkpoint, dict) and "state_dict" in checkpoint else checkpoint
model_state_keys = model.state_dict().keys()
target_has_module_prefix = all(k.startswith("module.") for k in model_state_keys)
state_dict = _normalize_state_dict_keys(state_dict, target_has_module_prefix)
model.load_state_dict(state_dict, strict=True)
def eval(model, testing_data_loader, model_path, output_folder,norm_size=True,LOL=False,v2=False,unpaired=False,alpha=1.0,gamma=1.0):
torch.set_grad_enabled(False)
model_core = unwrap_model(model)
load_checkpoint_flexible(model, model_path)
print('Pre-trained model is loaded.')
model.eval()
print('Evaluation:')
if LOL:
model_core.trans.gated = True
elif v2:
model_core.trans.gated2 = True
model_core.trans.alpha = alpha
elif unpaired:
model_core.trans.gated2 = True
model_core.trans.alpha = alpha
for batch in tqdm(testing_data_loader):
with torch.no_grad():
if norm_size:
input, name = batch[0], batch[1]
else:
input, name, h, w = batch[0], batch[1], batch[2], batch[3]
input = input.cuda()
output = model(input**gamma)
if not os.path.exists(output_folder):
os.mkdir(output_folder)
output = torch.clamp(output.cuda(),0,1).cuda()
if not norm_size:
output = output[:, :, :h, :w]
output_img = transforms.ToPILImage()(output.squeeze(0))
output_img.save(output_folder + name[0])
torch.cuda.empty_cache()
print('===> End evaluation')
if LOL:
model_core.trans.gated = False
elif v2:
model_core.trans.gated2 = False
torch.set_grad_enabled(True)
if __name__ == '__main__':
eval_parser = argparse.ArgumentParser(description='Eval')
eval_parser.add_argument('--perc', action='store_true', help='trained with perceptual loss')
eval_parser.add_argument('--lol', action='store_true', help='output lolv1 dataset')
eval_parser.add_argument('--lol_v2_real', action='store_true', help='output lol_v2_real dataset')
eval_parser.add_argument('--lol_v2_syn', action='store_true', help='output lol_v2_syn dataset')
eval_parser.add_argument('--SICE_grad', action='store_true', help='output SICE_grad dataset')
eval_parser.add_argument('--SICE_mix', action='store_true', help='output SICE_mix dataset')
eval_parser.add_argument('--fivek', action='store_true', help='output FiveK dataset')
eval_parser.add_argument('--best_GT_mean', action='store_true', help='output lol_v2_real dataset best_GT_mean')
eval_parser.add_argument('--best_PSNR', action='store_true', help='output lol_v2_real dataset best_PSNR')
eval_parser.add_argument('--best_SSIM', action='store_true', help='output lol_v2_real dataset best_SSIM')
eval_parser.add_argument('--custome', action='store_true', help='output custome dataset')
eval_parser.add_argument('--custome_path', type=str, default='./YOLO')
eval_parser.add_argument('--unpaired', action='store_true', help='output unpaired dataset')
eval_parser.add_argument('--DICM', action='store_true', help='output DICM dataset')
eval_parser.add_argument('--LIME', action='store_true', help='output LIME dataset')
eval_parser.add_argument('--MEF', action='store_true', help='output MEF dataset')
eval_parser.add_argument('--NPE', action='store_true', help='output NPE dataset')
eval_parser.add_argument('--VV', action='store_true', help='output VV dataset')
eval_parser.add_argument('--alpha', type=float, default=1.0)
eval_parser.add_argument('--gamma', type=float, default=1.0)
eval_parser.add_argument('--unpaired_weights', type=str, default='./weights/LOLv2_syn/w_perc.pth')
ep = eval_parser.parse_args()
cuda = True
if cuda and not torch.cuda.is_available():
raise Exception("No GPU found, or need to change CUDA_VISIBLE_DEVICES number")
if not os.path.exists('./output'):
os.mkdir('./output')
norm_size = True
num_workers = 1
alpha = None
if ep.lol:
eval_data = DataLoader(dataset=get_eval_set("./datasets/LOLdataset/eval15/low"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/LOLv1/'
if ep.perc:
weight_path = './weights/LOLv1/w_perc.pth'
else:
weight_path = './weights/LOLv1/wo_perc.pth'
elif ep.lol_v2_real:
eval_data = DataLoader(dataset=get_eval_set("./datasets/LOLv2/Real_captured/Test/Low"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/LOLv2_real/'
if ep.best_GT_mean:
weight_path = './weights/LOLv2_real/w_perc.pth'
alpha = 0.84
elif ep.best_PSNR:
weight_path = './weights/LOLv2_real/best_PSNR.pth'
alpha = 0.8
elif ep.best_SSIM:
weight_path = './weights/LOLv2_real/best_SSIM.pth'
alpha = 0.82
elif ep.lol_v2_syn:
eval_data = DataLoader(dataset=get_eval_set("./datasets/LOLv2/Synthetic/Test/Low"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/LOLv2_syn/'
if ep.perc:
weight_path = './weights/LOLv2_syn/w_perc.pth'
else:
weight_path = './weights/LOLv2_syn/wo_perc.pth'
elif ep.SICE_grad:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/SICE/SICE_Grad"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/SICE_grad/'
weight_path = './weights/SICE.pth'
norm_size = False
elif ep.SICE_mix:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/SICE/SICE_Mix"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/SICE_mix/'
weight_path = './weights/SICE.pth'
norm_size = False
elif ep.fivek:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/FiveK/test/input"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/fivek/'
weight_path = './weights/fivek.pth'
norm_size = False
elif ep.unpaired:
if ep.DICM:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/DICM"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/DICM/'
elif ep.LIME:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/LIME"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/LIME/'
elif ep.MEF:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/MEF"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/MEF/'
elif ep.NPE:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/NPE"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/NPE/'
elif ep.VV:
eval_data = DataLoader(dataset=get_SICE_eval_set("./datasets/VV"), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/VV/'
elif ep.custome:
eval_data = DataLoader(dataset=get_SICE_eval_set(ep.custome_path), num_workers=num_workers, batch_size=1, shuffle=False)
output_folder = './output/custome/'
alpha = ep.alpha
norm_size = False
weight_path = ep.unpaired_weights
eval_net = IADNet().cuda()
eval(eval_net, eval_data, weight_path, output_folder,norm_size=norm_size,LOL=ep.lol,v2=ep.lol_v2_real,unpaired=ep.unpaired,alpha=alpha,gamma=ep.gamma)