import numpy as np from numpy.linalg import norm as l2norm #from easydict import EasyDict class Face(dict): def __init__(self, d=None, **kwargs): if d is None: d = {} if kwargs: d.update(**kwargs) for k, v in d.items(): setattr(self, k, v) # Class attributes #for k in self.__class__.__dict__.keys(): # if not (k.startswith('__') and k.endswith('__')) and not k in ('update', 'pop'): # setattr(self, k, getattr(self, k)) def __setattr__(self, name, value): if isinstance(value, (list, tuple)): value = [self.__class__(x) if isinstance(x, dict) else x for x in value] elif isinstance(value, dict) and not isinstance(value, self.__class__): value = self.__class__(value) super(Face, self).__setattr__(name, value) super(Face, self).__setitem__(name, value) __setitem__ = __setattr__ def __getattr__(self, name): return None @property def embedding_norm(self): if self.embedding is None: return None return l2norm(self.embedding) @property def normed_embedding(self): if self.embedding is None: return None return self.embedding / self.embedding_norm @property def sex(self): if self.gender is None: return None return 'M' if self.gender==1 else 'F'