-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpreprocess.py
117 lines (96 loc) · 3.54 KB
/
preprocess.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
import json
import matplotlib as mpl
from matplotlib import pyplot as plt
import numpy as np
from numpy import asarray
from PIL import Image
from mtcnn import MTCNN
from names import women, men
from util import read_dict_from_json, get_one_image_file, save_as_json
from wiki import create_name_filename_map
# change image size as needed
required_size = (120, 120)
def extract_face(filename, required_size):
image = Image.open(filename)
image = image.convert('RGB')
pixels = asarray(image)
detector = MTCNN()
results = detector.detect_faces(pixels)
# extract the bounding box from the first face found
if results != []:
x1, y1, width, height = results[0]['box']
x1, y1 = abs(x1), abs(y1)
x2, y2 = x1 + width, y1 + height
# extract the face
face = pixels[y1:y2, x1:x2]
image = Image.fromarray(face)
image = image.resize(required_size)
face_array = asarray(image)
return face_array
def plot_gallery(folders, titles, rows, cols, filename):
"""Plot a gallery of portraits"""
mpl.rcParams['font.size'] = 10
mpl.rcParams['figure.figsize'] = (1.8 * cols, 2.4 * rows)
# specify folder to plot
folders = os.listdir()
i = 1
for folder in folders:
name = folder.replace('_', ' ')
if name in titles:
os.chdir(folder)
files = os.listdir(os.getcwd())
path = [file for file in files if file != '.DS_Store'][0]
try:
face = extract_face(path, required_size)
# print(i, face.shape)
except Exception as err:
print(name, err)
pass
plt.subplot(rows, cols, i, frameon=False, xticks=[], yticks=[])
plt.xlabel(name.upper(), labelpad=5)
plt.tight_layout()
try:
plt.imshow(face, cmap=plt.cm.gray)
except Exception as err:
print(name, err)
pass
finally:
os.chdir('..')
i += 1
plt.show()
# TODO: add save function
def save_img(filename, face):
plt.imsave(filename, face)
def extract_img(imgpath, folder):
for index, person in peopledict.items():
if person['wikiquery'] == folder:
face = extract_face(imgpath, required_size)
try:
filename = os.path.join(
save_dir, person['name'].replace(' ', '_') + '_mtcnn.jpg')
save_img(filename, face)
person.update({'faceExtraction': filename})
peopledict.update({index: person})
except Exception as err:
print(err)
pass
finally:
save_as_json(save_dir + '/' +
'einsatz1941_extracted.json', peopledict)
if __name__ == '__main__':
target_folder = 'men'
save_dir = 'men_extracted'
# create name-filename map
folder_map = create_name_filename_map('./men')
peopledict = read_dict_from_json('men.json')
# if output directory doesn't exist, creates it
if not os.path.exists(save_dir):
os.mkdir(save_dir)
for key, person in peopledict.items():
filename = person['filename'].split('/')[0] + '_extracted'
extension = os.path.splitext(person['filename'])[1]
extracted_face_filename = save_dir + '/' + filename + extension
face = extract_face(target_folder+'/' +
person['filename'], required_size)
save_img(extracted_face_filename, face)