|
| 1 | +import pandas as pd |
| 2 | +import numpy as np |
| 3 | +import config |
| 4 | +import matplotlib.pyplot as plt |
| 5 | +from torch.utils.data import DataLoader, Dataset |
| 6 | + |
| 7 | + |
| 8 | +class FacialKeypointDataset(Dataset): |
| 9 | + def __init__(self, csv_file, train=True, transform=None): |
| 10 | + super().__init__() |
| 11 | + self.data = pd.read_csv(csv_file) |
| 12 | + self.category_names = ['left_eye_center_x', 'left_eye_center_y', 'right_eye_center_x', 'right_eye_center_y', 'left_eye_inner_corner_x', 'left_eye_inner_corner_y', 'left_eye_outer_corner_x', 'left_eye_outer_corner_y', 'right_eye_inner_corner_x', 'right_eye_inner_corner_y', 'right_eye_outer_corner_x', 'right_eye_outer_corner_y', 'left_eyebrow_inner_end_x', 'left_eyebrow_inner_end_y', 'left_eyebrow_outer_end_x', 'left_eyebrow_outer_end_y', 'right_eyebrow_inner_end_x', 'right_eyebrow_inner_end_y', 'right_eyebrow_outer_end_x', 'right_eyebrow_outer_end_y', 'nose_tip_x', 'nose_tip_y', 'mouth_left_corner_x', 'mouth_left_corner_y', 'mouth_right_corner_x', 'mouth_right_corner_y', 'mouth_center_top_lip_x', 'mouth_center_top_lip_y', 'mouth_center_bottom_lip_x', 'mouth_center_bottom_lip_y'] |
| 13 | + self.transform = transform |
| 14 | + self.train = train |
| 15 | + |
| 16 | + def __len__(self): |
| 17 | + return self.data.shape[0] |
| 18 | + |
| 19 | + def __getitem__(self, index): |
| 20 | + if self.train: |
| 21 | + image = np.array(self.data.iloc[index, 30].split()).astype(np.float32) |
| 22 | + labels = np.array(self.data.iloc[index, :30].tolist()) |
| 23 | + labels[np.isnan(labels)] = -1 |
| 24 | + else: |
| 25 | + image = np.array(self.data.iloc[index, 1].split()).astype(np.float32) |
| 26 | + labels = np.zeros(30) |
| 27 | + |
| 28 | + ignore_indices = labels == -1 |
| 29 | + labels = labels.reshape(15, 2) |
| 30 | + |
| 31 | + if self.transform: |
| 32 | + image = np.repeat(image.reshape(96, 96, 1), 3, 2).astype(np.uint8) |
| 33 | + augmentations = self.transform(image=image, keypoints=labels) |
| 34 | + image = augmentations["image"] |
| 35 | + labels = augmentations["keypoints"] |
| 36 | + |
| 37 | + labels = np.array(labels).reshape(-1) |
| 38 | + labels[ignore_indices] = -1 |
| 39 | + |
| 40 | + return image, labels.astype(np.float32) |
| 41 | + |
| 42 | + |
| 43 | +if __name__ == "__main__": |
| 44 | + ds = FacialKeypointDataset(csv_file="data/train_4.csv", train=True, transform=config.train_transforms) |
| 45 | + loader = DataLoader(ds, batch_size=1, shuffle=True, num_workers=0) |
| 46 | + |
| 47 | + for idx, (x, y) in enumerate(loader): |
| 48 | + plt.imshow(x[0][0].detach().cpu().numpy(), cmap='gray') |
| 49 | + plt.plot(y[0][0::2].detach().cpu().numpy(), y[0][1::2].detach().cpu().numpy(), "go") |
| 50 | + plt.show() |
0 commit comments