# built-in dependencies from typing import Any # project dependencies from deepface.basemodels import ( VGGFace, OpenFace, FbDeepFace, DeepID, ArcFace, SFace, Dlib, Facenet, GhostFaceNet ) from deepface.extendedmodels import Age, Gender, Race, Emotion def build_model(model_name: str) -> Any: """ This function builds a deepface model Parameters: model_name (string): face recognition or facial attribute model VGG-Face, Facenet, OpenFace, DeepFace, DeepID for face recognition Age, Gender, Emotion, Race for facial attributes Returns: built model class """ # singleton design pattern global model_obj models = { "VGG-Face": VGGFace.VggFaceClient, "OpenFace": OpenFace.OpenFaceClient, "Facenet": Facenet.FaceNet128dClient, "Facenet512": Facenet.FaceNet512dClient, "DeepFace": FbDeepFace.DeepFaceClient, "DeepID": DeepID.DeepIdClient, "Dlib": Dlib.DlibClient, "ArcFace": ArcFace.ArcFaceClient, "SFace": SFace.SFaceClient, "GhostFaceNet": GhostFaceNet.GhostFaceNetClient, "Emotion": Emotion.EmotionClient, "Age": Age.ApparentAgeClient, "Gender": Gender.GenderClient, "Race": Race.RaceClient, } if not "model_obj" in globals(): model_obj = {} if not model_name in model_obj.keys(): model = models.get(model_name) if model: model_obj[model_name] = model() else: raise ValueError(f"Invalid model_name passed - {model_name}") return model_obj[model_name]