-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdataValidator.py
60 lines (49 loc) · 2.75 KB
/
dataValidator.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
class dataValidator(object):
"""Class to validate corectness of keypoints dataset"""
def __init__(self, parent):
self.parent = parent
# rules agains which data is validated
self.validation_rules = dict()
self.initiate_rules()
def initiate_rules(self):
for side in ["RIGHT", "LEFT"]:
self.validation_rules[side + "_EYE_X"] = (lambda dataline:
dataline[side + "_EYE_LEFT"][0] < dataline[side + "_EYE_MIDDLE"][0] < dataline["RIGHT_EYE_RIGHT"][0])
self.validation_rules[side + "_BROW_X"] = (lambda dataline:
dataline[side + "_BROW_LEFT"][0] < dataline[side + "_BROW_RIGHT"][0])
self.validation_rules[side + "_BROW_VS_EYE_Y"] = (lambda dataline:
(dataline[side + "_BROW_LEFT"][1] < dataline[side + "_EYE_LEFT"][1] and
dataline[side + "_BROW_LEFT"][1] < dataline[side + "_EYE_MIDDLE"][1] and
dataline[side + "_BROW_LEFT"][1] < dataline[side + "_EYE_MIDDLE"][1] and
dataline[side + "_BROW_RIGHT"][1] < dataline[side + "_EYE_LEFT"][1] and
dataline[side + "_BROW_RIGHT"][1] < dataline[side + "_EYE_MIDDLE"][1] and
dataline[side + "_BROW_RIGHT"][1] < dataline[side + "_EYE_MIDDLE"][1])
)
self.validation_rules[side + "_EYE_VS_NOSE_Y"] = (lambda dataline:
(dataline[side + "_EYE_LEFT"][1] < dataline["NOSE"][1] and
dataline[side + "_EYE_MIDDLE"][1] < dataline["NOSE"][1] and
dataline[side + "_EYE_RIGHT"][1] < dataline["NOSE"][1]))
self.validation_rules["EYES_VS_NOSE_X"] = (lambda dataline:
dataline["LEFT_EYE_RIGHT"][0] < dataline["NOSE"][0] < dataline["RIGHT_EYE_LEFT"])
self.validation_rules["MOUTH_Y"] = (lambda dataline:
dataline["MOUTH_TOP"][1] < dataline["MOUTH_DOWN"][1])
self.validation_rules["MOUTH_X"] = (lambda dataline :
(dataline["MOUTH_LEFT"][0] < dataline["MOUTH_TOP"][0] < dataline["MOUTH_RIGHT"][0] and
dataline["MOUTH_LEFT"][0] < dataline["MOUTH_DOWN"][0] < dataline["MOUTH_RIGHT"][0]))
self.validation_rules["NOSE_VS_MOUTH_Y"] = (lambda dataline_dict:
dataline["NOSE"][1] < dataline["MOUTH_LEFT"][1] and
dataline["NOSE"][1] < dataline["MOUTH_RIGHT"][1] and
dataline["NOSE"][1] < dataline["MOUTH_TOP"][1])
def validate_dataset(self):
errors_stack = list()
for person in range(self.parent.NUMER_OF_PEOPLE):
for image in range(self.parent.IMAGES_OF_PERSON):
self.validate_dataline(self.parent.keypoints_data[person][image],
errors_stack, image, person)
return errors_stack
def validate_dataline(self, dataline, errors_stack, image_num, person_num):
for rule_name, rule in self.validation_rules.items():
if not rule(dataline):
errors_stack.append({"Rule" : rule_nam,
"Person" : person_num,
"Image" : image_num})