ercanburak/EVREAL

mse and ssim

Closed this issue · 2 comments

I am now training a model based on event reconstruction images, but when evaluating, MSE and SSIM have not been able to achieve the desired results.For example, when I reproduced E2VID, the values ​​of mse and SSIM did not reach the effect of the paper, and the gap was even very large.. I would like to ask what changes you made before calculating MSE and SSIM?

Hi. I'm not sure what is the exact issue that you are encountering, but you might want to inspect the code in this repository to see how MSE and SSIM are calculated after inference. You can find related code in eval.py and eval_metrics.py scripts. With the code in this EVREAL repository, using a command such as python eval.py -m E2VID -d ECD -qm mse ssim should give you the same MSE and SSIM results as in Table 2 of our paper (for E2VID on ECD dataset).

Below is my evaluation code. I would like to know where my problem occurred and why I am unable to calculate a result that matches the paper.

`import argparse
import cv2
import glob
import numpy as np
from collections import OrderedDict
import os
import torch

import models
from src.utils_loss import LossFn, IntensityRescaler
from skimage.metrics import mean_squared_error as compare_mse
from skimage.metrics import structural_similarity as compare_ssim

def main():
parser = argparse.ArgumentParser()
parser.add_argument('--task', type=str, default='classical_sr', help='classical_sr, lightweight_sr, real_sr, '
'gray_dn, color_dn, jpeg_car, color_jpeg_car')
parser.add_argument('--folder_hr', type=str,
default='/media/njit5/39e16d05-05ba-46b4-bc9b-47b3c98f1d4f/zy/val/result/1',
help='input low-quality test image folder')
parser.add_argument('--folder_gt', type=str,
default='/media/njit5/39e16d05-05ba-46b4-bc9b-47b3c98f1d4f/zy/val/result/gt',
help='input ground-truth test image folder')
args = parser.parse_args()

torch.cuda.empty_cache()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

Lpips = models.PerceptualLoss(model='net-lin', net='alex', use_gpu=True)
# model.initialize(model='net-lin', net='alex', use_gpu=True)

Lpips.eval()
Lpips = Lpips.to(device)

save_dir = f'/media/njit5/39e16d05-05ba-46b4-bc9b-47b3c98f1d4f/zy/val/result'
os.makedirs(save_dir, exist_ok=True)

folder_gt = args.folder_gt

rescale = IntensityRescaler()
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))

test_results = OrderedDict()
test_results['mse'] = []
test_results['ssim'] = []
test_results['lpips'] = []
mse, ssim, lpips = 0, 0, 0

for idx, path in enumerate(sorted(glob.glob(os.path.join(folder_gt, '*')))):
# read image
imgname, img_lq, img_gt = get_image_pair(args, path) # image to HWC-BGR, float32

if img_gt is not None:

    img_gt = np.expand_dims(img_gt, axis=2)
    output = np.expand_dims(img_lq, axis=2)
    pred1 = torch.tensor(np.array(output)).permute(2, 0, 1).unsqueeze(0).float().to(device) / 255
    img1 = torch.tensor(np.array(img_gt)).permute(2, 0, 1).unsqueeze(0).float().to(device) / 255

    distance = Lpips(pred1, img1, normalize=True).mean()
    distance = distance.float()
    test_results['lpips'].append(distance)

    p = rescale(pred1)
    y = rescale(img1)

    p = p[0].detach().cpu().numpy().mean(0)
    y = y[0].detach().cpu().numpy().mean(0)

    p = np.uint8(cv2.normalize(p, None, 0, 255, cv2.NORM_MINMAX))
    y = np.uint8(cv2.normalize(y, None, 0, 255, cv2.NORM_MINMAX))

    y = clahe.apply(y)
    p = clahe.apply(p)

    ssim = compare_ssim(p, y, data_range=255, multichannel=False)
    mse = compare_mse(p / 255, y / 255)

    test_results['ssim'].append(ssim)
    test_results['mse'].append(mse)

    print('Testing {:d} {:20s} - SSIM: {:.6f}; MSE: {:.6f}; LPIPS: {:.4f};'.
          format(idx, imgname, ssim, mse, distance))`