Skip to content

Commit c19bb86

Browse files
added kaggle comp solution for facial keypoint
1 parent 8136ee1 commit c19bb86

File tree

7 files changed

+27449
-0
lines changed

7 files changed

+27449
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import torch
2+
import albumentations as A
3+
from albumentations.pytorch import ToTensorV2
4+
import cv2
5+
6+
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
7+
LEARNING_RATE = 1e-4
8+
WEIGHT_DECAY = 5e-4
9+
BATCH_SIZE = 64
10+
NUM_EPOCHS = 100
11+
NUM_WORKERS = 4
12+
CHECKPOINT_FILE = "b0_4.pth.tar"
13+
PIN_MEMORY = True
14+
SAVE_MODEL = True
15+
LOAD_MODEL = True
16+
17+
# Data augmentation for images
18+
train_transforms = A.Compose(
19+
[
20+
A.Resize(width=96, height=96),
21+
A.Rotate(limit=15, border_mode=cv2.BORDER_CONSTANT, p=0.8),
22+
A.IAAAffine(shear=15, scale=1.0, mode="constant", p=0.2),
23+
A.RandomBrightnessContrast(contrast_limit=0.5, brightness_limit=0.5, p=0.2),
24+
A.OneOf([
25+
A.GaussNoise(p=0.8),
26+
A.CLAHE(p=0.8),
27+
A.ImageCompression(p=0.8),
28+
A.RandomGamma(p=0.8),
29+
A.Posterize(p=0.8),
30+
A.Blur(p=0.8),
31+
], p=1.0),
32+
A.OneOf([
33+
A.GaussNoise(p=0.8),
34+
A.CLAHE(p=0.8),
35+
A.ImageCompression(p=0.8),
36+
A.RandomGamma(p=0.8),
37+
A.Posterize(p=0.8),
38+
A.Blur(p=0.8),
39+
], p=1.0),
40+
A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.1, rotate_limit=0, p=0.2, border_mode=cv2.BORDER_CONSTANT),
41+
A.Normalize(
42+
mean=[0.4897, 0.4897, 0.4897],
43+
std=[0.2330, 0.2330, 0.2330],
44+
max_pixel_value=255.0,
45+
),
46+
ToTensorV2(),
47+
], keypoint_params=A.KeypointParams(format="xy", remove_invisible=False),
48+
)
49+
50+
51+
val_transforms = A.Compose(
52+
[
53+
A.Resize(height=96, width=96),
54+
A.Normalize(
55+
mean=[0.4897, 0.4897, 0.4897],
56+
std=[0.2330, 0.2330, 0.2330],
57+
max_pixel_value=255.0,
58+
),
59+
ToTensorV2(),
60+
], keypoint_params=A.KeypointParams(format="xy", remove_invisible=False),
61+
)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import numpy as np
2+
import pandas as pd
3+
import os
4+
from PIL import Image
5+
6+
7+
def extract_images_from_csv(csv, column, save_folder, resize=(96, 96)):
8+
if not os.path.exists(save_folder):
9+
os.makedirs(save_folder)
10+
11+
for idx, image in enumerate(csv[column]):
12+
image = np.array(image.split()).astype(np.uint8)
13+
image = image.reshape(resize[0], resize[1])
14+
img = Image.fromarray(image, 'L')
15+
img.save(save_folder+f"img_{idx}.png")
16+
17+
18+
csv = pd.read_csv("test.csv")
19+
extract_images_from_csv(csv, "Image", "data/test/")

0 commit comments

Comments
 (0)