def cal_for_eval(self, gathered_outputs, gathered_batchdata): """ :param gathered_outputs: list of tensor, [B,C,H,W] :param gathered_batchdata: list of numpy, [B,C,H,W] :return: eval result """ crop_border = self.eval_cfg.crop_border gathered_outputs = gathered_outputs[0] # image gathered_batchdata = gathered_batchdata[-1] # label assert list(gathered_batchdata.shape) == list( gathered_outputs.shape), "{} != {}".format( list(gathered_batchdata.shape), list(gathered_outputs.shape)) res = [] sample_nums = gathered_outputs.shape[0] for i in range(sample_nums): output = tensor2img(gathered_outputs[i], min_max=(-0.5, 0.5)) output_y = bgr2ycbcr(output, y_only=True) gt = tensor2img(gathered_batchdata[i], min_max=(-0.5, 0.5)) gt_y = bgr2ycbcr(gt, y_only=True) eval_result = dict() for metric in self.eval_cfg.metrics: eval_result[metric + "_RGB"] = self.allowed_metrics[metric]( output, gt, crop_border) eval_result[metric + "_Y"] = self.allowed_metrics[metric]( output_y, gt_y, crop_border) res.append(eval_result) return res
def niqe(img, crop_border, input_order='HWC', convert_to='y'): """Calculate NIQE (Natural Image Quality Evaluator) metric. Ref: Making a "Completely Blind" Image Quality Analyzer. This implementation could produce almost the same results as the official MATLAB codes: http://live.ece.utexas.edu/research/quality/niqe_release.zip We use the official params estimated from the pristine dataset. We use the recommended block size (96, 96) without overlaps. Args: img (ndarray): Input image whose quality needs to be computed. The input image must be in range [0, 255] with float/int type. The input_order of image can be 'HW' or 'HWC' or 'CHW'. (BGR order) If the input order is 'HWC' or 'CHW', it will be converted to gray or Y (of YCbCr) image according to the ``convert_to`` argument. crop_border (int): Cropped pixels in each edge of an image. These pixels are not involved in the metric calculation. input_order (str): Whether the input order is 'HW', 'HWC' or 'CHW'. Default: 'HWC'. convert_to (str): Whether coverted to 'y' (of MATLAB YCbCr) or 'gray'. Default: 'y'. Returns: float: NIQE result. """ # we use the official params estimated from the pristine dataset. niqe_pris_params = np.load('mmedit/core/evaluation/niqe_pris_params.npz') mu_pris_param = niqe_pris_params['mu_pris_param'] cov_pris_param = niqe_pris_params['cov_pris_param'] gaussian_window = niqe_pris_params['gaussian_window'] img = img.astype(np.float32) if input_order != 'HW': img = reorder_image(img, input_order=input_order) if convert_to == 'y': img = bgr2ycbcr(img / 255., y_only=True) * 255. elif convert_to == 'gray': img = bgr2gray(img / 255., cv2.COLOR_BGR2GRAY) * 255. img = np.squeeze(img) if crop_border != 0: img = img[crop_border:-crop_border, crop_border:-crop_border] niqe_result = niqe_core(img, mu_pris_param, cov_pris_param, gaussian_window) return niqe_result