Update Logger singleton creation, add test and docstring

This commit is contained in:
kremnik 2024-08-02 05:53:08 +03:00
parent 6d33c1d8be
commit 59e8d52b63
43 changed files with 118 additions and 105 deletions

1
.gitignore vendored
View File

@ -6,6 +6,7 @@ Pipfile
Pipfile.lock Pipfile.lock
.mypy_cache/ .mypy_cache/
.idea/ .idea/
.vscode/
deepface.egg-info/ deepface.egg-info/
tests/dataset/*.pkl tests/dataset/*.pkl
tests/*.ipynb tests/*.ipynb

View File

@ -16,7 +16,7 @@ import tensorflow as tf
# package dependencies # package dependencies
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.commons import logger as log from deepface.commons.logger import Logger
from deepface.modules import ( from deepface.modules import (
modeling, modeling,
representation, representation,
@ -29,7 +29,7 @@ from deepface.modules import (
) )
from deepface import __version__ from deepface import __version__
logger = log.get_singletonish_logger() logger = Logger()
# ----------------------------------- # -----------------------------------
# configurations for dependencies # configurations for dependencies

View File

@ -5,9 +5,9 @@ from flask_cors import CORS
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.api.src.modules.core.routes import blueprint from deepface.api.src.modules.core.routes import blueprint
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def create_app(): def create_app():

View File

@ -1,9 +1,9 @@
from flask import Blueprint, request from flask import Blueprint, request
from deepface import DeepFace from deepface import DeepFace
from deepface.api.src.modules.core import service from deepface.api.src.modules.core import service
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
blueprint = Blueprint("routes", __name__) blueprint = Blueprint("routes", __name__)

View File

@ -3,9 +3,9 @@ import gdown
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=unsubscriptable-object # pylint: disable=unsubscriptable-object

View File

@ -2,9 +2,9 @@ import os
import gdown import gdown
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
tf_version = package_utils.get_tf_major_version() tf_version = package_utils.get_tf_major_version()

View File

@ -5,9 +5,9 @@ import gdown
import numpy as np import numpy as np
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods

View File

@ -2,9 +2,9 @@ import os
import gdown import gdown
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# -------------------------------- # --------------------------------
# dependency configuration # dependency configuration

View File

@ -3,9 +3,9 @@ import zipfile
import gdown import gdown
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# -------------------------------- # --------------------------------
# dependency configuration # dependency configuration

View File

@ -8,9 +8,9 @@ import tensorflow as tf
# project dependencies # project dependencies
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
tf_major = package_utils.get_tf_major_version() tf_major = package_utils.get_tf_major_version()
if tf_major == 1: if tf_major == 1:

View File

@ -3,9 +3,9 @@ import gdown
import tensorflow as tf import tensorflow as tf
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
tf_version = package_utils.get_tf_major_version() tf_version = package_utils.get_tf_major_version()
if tf_version == 1: if tf_version == 1:

View File

@ -10,9 +10,9 @@ import gdown
# project dependencies # project dependencies
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=line-too-long, too-few-public-methods # pylint: disable=line-too-long, too-few-public-methods

View File

@ -5,9 +5,9 @@ import numpy as np
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.modules import verification from deepface.modules import verification
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# --------------------------------------- # ---------------------------------------

View File

@ -5,9 +5,9 @@ import os
import gdown import gdown
# project dependencies # project dependencies
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def download_external_file(file_name: str, exact_file_path: str, url: str) -> None: def download_external_file(file_name: str, exact_file_path: str, url: str) -> None:

View File

@ -1,8 +1,8 @@
import os import os
from pathlib import Path from pathlib import Path
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def initialize_folder() -> None: def initialize_folder() -> None:

View File

@ -4,8 +4,24 @@ from datetime import datetime
# pylint: disable=broad-except # pylint: disable=broad-except
class Logger: class Logger:
def __init__(self, module=None): """
self.module = module A Logger class for logging messages with a specific log level.
The class follows the singleton design pattern, ensuring that only one
instance of the Logger is created. The parameters of the first instance
are preserved across all instances.
"""
__instance = None
def __new__(cls):
if cls.__instance is None:
cls.__instance = super(Logger, cls).__new__(cls)
return cls.__instance
def __init__(self):
if not hasattr(self, "_singleton_initialized"):
self._singleton_initialized = True # to prevent multiple initializations
log_level = os.environ.get("DEEPFACE_LOG_LEVEL", str(logging.INFO)) log_level = os.environ.get("DEEPFACE_LOG_LEVEL", str(logging.INFO))
try: try:
self.log_level = int(log_level) self.log_level = int(log_level)
@ -39,16 +55,3 @@ class Logger:
def dump_log(self, message): def dump_log(self, message):
print(f"{str(datetime.now())[2:-7]} - {message}") print(f"{str(datetime.now())[2:-7]} - {message}")
def get_singletonish_logger():
# singleton design pattern
global model_obj
if not "model_obj" in globals():
model_obj = {}
if "logger" not in model_obj.keys():
model_obj["logger"] = Logger(module="Singleton")
return model_obj["logger"]

View File

@ -2,9 +2,9 @@
import tensorflow as tf import tensorflow as tf
# package dependencies # package dependencies
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def get_tf_major_version() -> int: def get_tf_major_version() -> int:

View File

@ -10,9 +10,9 @@ import gdown
# project dependencies # project dependencies
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.models.Detector import Detector, FacialAreaRegion from deepface.models.Detector import Detector, FacialAreaRegion
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=c-extension-no-member # pylint: disable=c-extension-no-member

View File

@ -15,9 +15,9 @@ from deepface.detectors import (
YuNet, YuNet,
CenterFace, CenterFace,
) )
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def build_model(detector_backend: str) -> Any: def build_model(detector_backend: str) -> Any:

View File

@ -5,9 +5,9 @@ import gdown
import numpy as np import numpy as np
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.models.Detector import Detector, FacialAreaRegion from deepface.models.Detector import Detector, FacialAreaRegion
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
class DlibClient(Detector): class DlibClient(Detector):

View File

@ -7,9 +7,9 @@ import numpy as np
from deepface.detectors import OpenCv from deepface.detectors import OpenCv
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.models.Detector import Detector, FacialAreaRegion from deepface.models.Detector import Detector, FacialAreaRegion
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=line-too-long, c-extension-no-member # pylint: disable=line-too-long, c-extension-no-member

View File

@ -4,9 +4,9 @@ import numpy as np
import gdown import gdown
from deepface.models.Detector import Detector, FacialAreaRegion from deepface.models.Detector import Detector, FacialAreaRegion
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# Model's weights paths # Model's weights paths
PATH = "/.deepface/weights/yolov8n-face.pt" PATH = "/.deepface/weights/yolov8n-face.pt"

View File

@ -10,9 +10,9 @@ import gdown
# project dependencies # project dependencies
from deepface.commons import folder_utils from deepface.commons import folder_utils
from deepface.models.Detector import Detector, FacialAreaRegion from deepface.models.Detector import Detector, FacialAreaRegion
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
class YuNetClient(Detector): class YuNetClient(Detector):

View File

@ -4,9 +4,9 @@ import numpy as np
from deepface.basemodels import VGGFace from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.Demography import Demography from deepface.models.Demography import Demography
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# ---------------------------------------- # ----------------------------------------
# dependency configurations # dependency configurations

View File

@ -9,9 +9,9 @@ import cv2
# project dependencies # project dependencies
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.Demography import Demography from deepface.models.Demography import Demography
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# ------------------------------------------- # -------------------------------------------
# pylint: disable=line-too-long # pylint: disable=line-too-long

View File

@ -9,9 +9,9 @@ import numpy as np
from deepface.basemodels import VGGFace from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.Demography import Demography from deepface.models.Demography import Demography
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# ------------------------------------- # -------------------------------------
# pylint: disable=line-too-long # pylint: disable=line-too-long

View File

@ -9,9 +9,9 @@ import numpy as np
from deepface.basemodels import VGGFace from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils from deepface.commons import package_utils, folder_utils
from deepface.models.Demography import Demography from deepface.models.Demography import Demography
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# -------------------------- # --------------------------
# pylint: disable=line-too-long # pylint: disable=line-too-long

View File

@ -11,9 +11,9 @@ from deepface.modules import modeling
from deepface.models.Detector import DetectedFace, FacialAreaRegion from deepface.models.Detector import DetectedFace, FacialAreaRegion
from deepface.detectors import DetectorWrapper from deepface.detectors import DetectorWrapper
from deepface.commons import image_utils from deepface.commons import image_utils
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=no-else-raise # pylint: disable=no-else-raise

View File

@ -12,9 +12,9 @@ from tqdm import tqdm
# project dependencies # project dependencies
from deepface.commons import image_utils from deepface.commons import image_utils
from deepface.modules import representation, detection, verification from deepface.modules import representation, detection, verification
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def find( def find(

View File

@ -10,9 +10,9 @@ import cv2
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# dependency configuration # dependency configuration
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"

View File

@ -8,9 +8,9 @@ import numpy as np
# project dependencies # project dependencies
from deepface.modules import representation, detection, modeling from deepface.modules import representation, detection, modeling
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def verify( def verify(

View File

@ -9,9 +9,10 @@ import cv2
import numpy as np import numpy as np
# project dependencies # project dependencies
from deepface.commons import folder_utils, file_utils, logger as log from deepface.commons import folder_utils, file_utils
from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# pylint: disable=line-too-long, too-few-public-methods # pylint: disable=line-too-long, too-few-public-methods
class Fasnet: class Fasnet:

View File

@ -7,9 +7,9 @@ import cv2
from deepface import DeepFace from deepface import DeepFace
from deepface.modules import verification from deepface.modules import verification
from deepface.models.FacialRecognition import FacialRecognition from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# ---------------------------------------------- # ----------------------------------------------
# build face recognition model # build face recognition model

View File

@ -3,9 +3,9 @@ import cv2
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
detectors = ["opencv", "mtcnn"] detectors = ["opencv", "mtcnn"]

View File

@ -4,9 +4,9 @@ import unittest
# project dependencies # project dependencies
from deepface.api.src.app import create_app from deepface.api.src.app import create_app
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
class TestVerifyEndpoint(unittest.TestCase): class TestVerifyEndpoint(unittest.TestCase):

View File

@ -4,9 +4,9 @@ import numpy as np
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def test_enabled_enforce_detection_for_non_facial_input(): def test_enabled_enforce_detection_for_non_facial_input():

View File

@ -9,9 +9,9 @@ import pytest
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import image_utils from deepface.commons import image_utils
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
detectors = ["opencv", "mtcnn"] detectors = ["opencv", "mtcnn"]

View File

@ -9,9 +9,9 @@ import pandas as pd
from deepface import DeepFace from deepface import DeepFace
from deepface.modules import verification from deepface.modules import verification
from deepface.commons import image_utils from deepface.commons import image_utils
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
threshold = verification.find_threshold(model_name="VGG-Face", distance_metric="cosine") threshold = verification.find_threshold(model_name="VGG-Face", distance_metric="cosine")

View File

@ -3,9 +3,9 @@ import cv2
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def test_standard_represent(): def test_standard_represent():

8
tests/test_singleton.py Normal file
View File

@ -0,0 +1,8 @@
from deepface.commons.logger import Logger
logger = Logger()
def test_singleton_same_object():
assert Logger() == Logger()
logger.info("✅ id's of instances of \"singletoned\" class Logger are the same")

View File

@ -4,9 +4,9 @@ import cv2
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
models = ["VGG-Face", "Facenet", "Facenet512", "ArcFace", "GhostFaceNet"] models = ["VGG-Face", "Facenet", "Facenet512", "ArcFace", "GhostFaceNet"]
metrics = ["cosine", "euclidean", "euclidean_l2"] metrics = ["cosine", "euclidean", "euclidean_l2"]

View File

@ -3,9 +3,9 @@ import json
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
def test_version(): def test_version():

View File

@ -3,9 +3,9 @@ import matplotlib.pyplot as plt
# project dependencies # project dependencies
from deepface import DeepFace from deepface import DeepFace
from deepface.commons import logger as log from deepface.commons.logger import Logger
logger = log.get_singletonish_logger() logger = Logger()
# some models (e.g. Dlib) and detectors (e.g. retinaface) do not have test cases # some models (e.g. Dlib) and detectors (e.g. retinaface) do not have test cases
# because they require to install huge packages # because they require to install huge packages