Source code for qualia2.data.fimlp

# -*- coding: utf-8 -*- 
from .. import to_cpu
from ..core import *
from .dataset import *
from .transforms import Compose, ToTensor, Normalize
import matplotlib.pyplot as plt

[docs]class FIMLP(Dataset): '''FIMLP Dataset\n Args: normalize (bool): If true, the intensity value of a specific pixel in a specific image will be rescaled from [0, 255] to [0, 1]. Default: True flatten (bool): If true, data will have a shape of [N, 96*96]. Default: False Shape: - data: [N, 1, 96, 96] if flatten [N, 96*96] Label: Only x and y of the eyes center, nose tip and mouth center will be used as a label by default due to its small number of missing values. Landmarks Missing left_eye_center_x 10 left_eye_center_y 10 right_eye_center_x 13 right_eye_center_y 13 # left_eye_inner_corner_x 4778 # left_eye_inner_corner_y 4778 # left_eye_outer_corner_x 4782 # left_eye_outer_corner_y 4782 # right_eye_inner_corner_x 4781 # right_eye_inner_corner_y 4781 # right_eye_outer_corner_x 4781 # right_eye_outer_corner_y 4781 # left_eyebrow_inner_end_x 4779 # left_eyebrow_inner_end_y 4779 # left_eyebrow_outer_end_x 4824 # left_eyebrow_outer_end_y 4824 # right_eyebrow_inner_end_x 4779 # right_eyebrow_inner_end_y 4779 # right_eyebrow_outer_end_x 4813 # right_eyebrow_outer_end_y 4813 nose_tip_x 0 nose_tip_y 0 # mouth_left_corner_x 4780 # mouth_left_corner_y 4780 # mouth_right_corner_x 4779 # mouth_right_corner_y 4779 # mouth_center_top_lip_x 4774 # mouth_center_top_lip_y 4774 mouth_center_bottom_lip_x 33 mouth_center_bottom_lip_y 33 ''' def __init__(self, train=True, transforms=Compose([ToTensor(), Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])]), target_transforms=None): self.divide = 6000 super().__init__(train, transforms, target_transforms)
[docs] def prepare(self): self._download() if self.train: self.label, _ = self._load_label(self.root) self.data, _ = self._load_data(self.root) else: _, self.label = self._load_label(self.root) _, self.data = self._load_data(self.root)
def _download(self): if not os.path.exists(self.root+'/'): os.makedirs(self.root+'/') else: return import kaggle kaggle.api.authenticate() kaggle.api.dataset_download_files('drgilermo/face-images-with-marked-landmark-points', path=self.root, unzip=True) def _load_data(self, path): if gpu: import numpy data = np.asarray(numpy.moveaxis(numpy.load(path+'/face_images.npz', 'r')['face_images'], -1, 0)) else: data = np.moveaxis(np.load(path+'/face_images.npz', 'r')['face_images'], -1, 0) data = data[self.data_mask] return data[:self.divide].reshape(-1,1,96,96), data[self.divide:].reshape(-1,1,96,96) def _load_label(self, path): import numpy data = numpy.genfromtxt(path+'/facial_keypoints.csv', delimiter=',', filling_values=0)[1:] if gpu: data = np.asarray(data) # select x and y of the eyes center, nose tip and mouth center label = np.zeros((7049,8)) label[:,0:4] = data[:,0:4] label[:,4:6] = data[:,20:22] label[:,6:8] = data[:,28:] self.data_mask = np.all(label>0, axis=1) label = label[self.data_mask] return label[:self.divide]/96.0, label[self.divide:]/96.0
[docs] def show(self, row=5, col=5): H, W = 96, 96 img = np.zeros((H*row, W*col)) label_x = np.zeros((row, col, 4)) label_y = np.zeros((row, col, 4)) for r in range(row): for c in range(col): idx = random.randint(0, len(self.data)-1) img[r*H:(r+1)*H, c*W:(c+1)*W] = self.data[idx].reshape(H,W)/255 label_x[r:(r+1), c:(c+1)] = self.label[idx,0::2]*W + c*W label_y[r:(r+1), c:(c+1)] = self.label[idx,1::2]*H + r*H plt.imshow(to_cpu(img), cmap='gray', interpolation='nearest') plt.scatter(to_cpu(label_x.reshape(-1)),to_cpu(label_y.reshape(-1)),marker='o',c='r',s=10) plt.axis('off') plt.show()