import torch.utils.data as data import torch from PIL import Image import os import scipy.io import numpy as np import csv from openpyxl import load_workbook import cv2 class LIVEC(data.Dataset): def __init__(self, root, index, transform): imgpath = scipy.io.loadmat(os.path.join(root, 'Data', 'AllImages_release.mat')) imgpath = imgpath['AllImages_release'] imgpath = imgpath[7:1169] mos = scipy.io.loadmat(os.path.join(root, 'Data', 'AllMOS_release.mat')) labels = mos['AllMOS_release'].astype(np.float32) labels = labels[0][7:1169] sample, gt = [], [] for i, item in enumerate(index): sample.append(os.path.join(root, 'Images', imgpath[item][0][0])) gt.append(labels[item]) gt = normalization(gt) self.samples, self.gt = sample, gt self.transform = transform def __getitem__(self, index): """ Args: index (int): Index Returns: tuple: (sample, target) where target is class_index of the target class. """ img_tensor, gt_tensor = get_item(self.samples, self.gt, index, self.transform) return img_tensor, gt_tensor def __len__(self): length = len(self.samples) return length class Koniq10k(data.Dataset): def __init__(self, root, index, transform): imgname = [] mos_all = [] csv_file = os.path.join(root, 'koniq10k_distributions_sets.csv') with open(csv_file) as f: reader = csv.DictReader(f) for row in reader: imgname.append(row['image_name']) mos = np.array(float(row['MOS'])).astype(np.float32) mos_all.append(mos) sample, gt = [], [] for i, item in enumerate(index): sample.append(os.path.join(root, '1024x768', imgname[item])) gt.append(mos_all[item]) gt = normalization(gt) self.samples, self.gt = sample, gt self.transform = transform def __getitem__(self, index): """ Args: index (int): Index Returns: tuple: (sample, target) where target is class_index of the target class. """ img_tensor, gt_tensor = get_item(self.samples, self.gt, index, self.transform) return img_tensor, gt_tensor def __len__(self): length = len(self.samples) return length class SPAQ(data.Dataset): def __init__(self, root, index, transform): imgname = [] mos_all = [] csv_file = os.path.join(root, 'koniq10k_scores_and_distributions.csv') with open(csv_file) as f: reader = csv.DictReader(f) for row in reader: imgname.append(row['image_name']) mos = np.array(float(row['MOS_zscore'])).astype(np.float32) mos_all.append(mos) sample, gt = [], [] for i, item in enumerate(index): sample.append(os.path.join(root, '1024x768', imgname[item])) gt.append(labels[item]) gt = norm_target(gt) self.samples, self.gt = sample, gt self.samples, self.gt = sample, gt self.transform = transform def __getitem__(self, index): """ Args: index (int): Index Returns: tuple: (sample, target) where target is class_index of the target class. """ path, target = self.samples[index], self.gt[index] sample = pil_loader(path) sample = self.transform(sample) return sample, target def __len__(self): length = len(self.samples) return length class BID(data.Dataset): def __init__(self, root, index, transform): imgname = [] mos_all = [] xls_file = os.path.join(root, 'DatabaseGrades.xlsx') workbook = load_workbook(xls_file) booksheet = workbook.active rows = booksheet.rows count = 1 for row in rows: count += 1 img_num = booksheet.cell(row=count, column=1).value img_name = "DatabaseImage%04d.JPG" % (img_num) imgname.append(img_name) mos = booksheet.cell(row=count, column=2).value mos = np.array(mos) mos = mos.astype(np.float32) mos_all.append(mos) if count == 587: break sample, gt = [], [] for i, item in enumerate(index): sample.append(os.path.join(root, imgname[item])) gt.append(mos_all[item]) gt = normalization(gt) self.samples, self.gt = sample, gt self.transform = transform def __getitem__(self, index): """ Args: index (int): Index Returns: tuple: (sample, target) where target is class_index of the target class. """ img_tensor, gt_tensor = get_item(self.samples, self.gt, index, self.transform) return img_tensor, gt_tensor def __len__(self): length = len(self.samples) return length def get_item(samples, gt, index, transform): path, target = samples[index], gt[index] sample = load_image(path) samples = {'img': sample, 'gt': target } samples = transform(samples) return samples['img'], samples['gt'].type(torch.FloatTensor) def getFileName(path, suffix): filename = [] f_list = os.listdir(path) for i in f_list: if os.path.splitext(i)[1] == suffix: filename.append(i) return filename def load_image(img_path): d_img = cv2.imread(img_path, cv2.IMREAD_COLOR) d_img = cv2.resize(d_img, (224, 224), interpolation=cv2.INTER_CUBIC) d_img = cv2.cvtColor(d_img, cv2.COLOR_BGR2RGB) d_img = np.array(d_img).astype('float32') / 255 d_img = np.transpose(d_img, (2, 0, 1)) return d_img def normalization(data): data = np.array(data) range = np.max(data) - np.min(data) data = (data - np.min(data)) / range data = list(data.astype('float').reshape(-1, 1)) return data