Source code for pyiqa.data.bapps_dataset

from PIL import Image
import os

import torch
from torch.utils import data as data

from pyiqa.utils.registry import DATASET_REGISTRY
from .base_iqa_dataset import BaseIQADataset

import pandas as pd


@DATASET_REGISTRY.register()
[docs] class BAPPSDataset(BaseIQADataset): """The BAPPS Dataset introduced by: Zhang, Richard and Isola, Phillip and Efros, Alexei A and Shechtman, Eli and Wang, Oliver The Unreasonable Effectiveness of Deep Features as a Perceptual Metric. CVPR2018 url: https://github.com/richzhang/PerceptualSimilarity Args: opt (dict): Config for train datasets with the following keys: phase (str): 'train' or 'val'. mode (str): - 2afc: load 2afc triplet data - jnd: load jnd pair data """
[docs] def init_path_mos(self, opt): if opt.get('override_phase', None) is None: self.phase = opt['phase'] else: self.phase = opt['override_phase'] self.dataset_mode = opt.get('mode', '2afc') target_img_folder = opt['dataroot_target'] self.dataroot = target_img_folder self.paths_mos = pd.read_csv(opt['meta_info_file']).values.tolist()
[docs] def get_split(self, opt): super().get_split(opt) val_types = opt.get('val_types', None) if self.dataset_mode == '2afc': self.paths_mos = [x for x in self.paths_mos if x[0] != 'jnd'] elif self.dataset_mode == 'jnd': self.paths_mos = [x for x in self.paths_mos if x[0] == 'jnd'] if val_types is not None: tmp_paths_mos = [] for item in self.paths_mos: for vt in val_types: if vt in item[1]: tmp_paths_mos.append(item) self.paths_mos = tmp_paths_mos
def __getitem__(self, index): is_jnd_data = self.paths_mos[index][0] == 'jnd' distA_path = os.path.join(self.dataroot, self.paths_mos[index][1]) distB_path = os.path.join(self.dataroot, self.paths_mos[index][2]) distA_pil = Image.open(distA_path).convert('RGB') distB_pil = Image.open(distB_path).convert('RGB') score = self.paths_mos[index][3] # original 0 means prefer p0, transfer to probability of p0 mos_label_tensor = torch.Tensor([score]) if not is_jnd_data: ref_path = os.path.join(self.dataroot, self.paths_mos[index][0]) ref_img_pil = Image.open(ref_path).convert('RGB') distA_tensor, distB_tensor, ref_tensor = self.trans( [distA_pil, distB_pil, ref_img_pil] ) else: distA_tensor, distB_tensor = self.trans([distA_pil, distB_pil]) if not is_jnd_data: return { 'ref_img': ref_tensor, 'distB_img': distB_tensor, 'distA_img': distA_tensor, 'mos_label': mos_label_tensor, 'img_path': ref_path, 'distB_path': distB_path, 'distA_path': distA_path, } else: return { 'distB_img': distB_tensor, 'distA_img': distA_tensor, 'mos_label': mos_label_tensor, 'distB_path': distB_path, 'distA_path': distA_path, }