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
.mypy_cache/
.idea/
.vscode/
deepface.egg-info/
tests/dataset/*.pkl
tests/*.ipynb

View File

@ -16,7 +16,7 @@ import tensorflow as tf
# package dependencies
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 (
modeling,
representation,
@ -29,7 +29,7 @@ from deepface.modules import (
)
from deepface import __version__
logger = log.get_singletonish_logger()
logger = Logger()
# -----------------------------------
# configurations for dependencies

View File

@ -5,9 +5,9 @@ from flask_cors import CORS
# project dependencies
from deepface import DeepFace
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():

View File

@ -1,9 +1,9 @@
from flask import Blueprint, request
from deepface import DeepFace
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__)

View File

@ -3,9 +3,9 @@ import gdown
from deepface.commons import package_utils, folder_utils
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

View File

@ -2,9 +2,9 @@ import os
import gdown
from deepface.commons import package_utils, folder_utils
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()

View File

@ -5,9 +5,9 @@ import gdown
import numpy as np
from deepface.commons import folder_utils
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

View File

@ -2,9 +2,9 @@ import os
import gdown
from deepface.commons import package_utils, folder_utils
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

View File

@ -3,9 +3,9 @@ import zipfile
import gdown
from deepface.commons import package_utils, folder_utils
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

View File

@ -8,9 +8,9 @@ import tensorflow as tf
# project dependencies
from deepface.commons import package_utils, folder_utils
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()
if tf_major == 1:

View File

@ -3,9 +3,9 @@ import gdown
import tensorflow as tf
from deepface.commons import package_utils, folder_utils
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()
if tf_version == 1:

View File

@ -10,9 +10,9 @@ import gdown
# project dependencies
from deepface.commons import folder_utils
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

View File

@ -5,9 +5,9 @@ import numpy as np
from deepface.commons import package_utils, folder_utils
from deepface.modules import verification
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
# 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:

View File

@ -1,8 +1,8 @@
import os
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:

View File

@ -4,18 +4,34 @@ from datetime import datetime
# pylint: disable=broad-except
class Logger:
def __init__(self, module=None):
self.module = module
log_level = os.environ.get("DEEPFACE_LOG_LEVEL", str(logging.INFO))
try:
self.log_level = int(log_level)
except Exception as err:
self.dump_log(
f"Exception while parsing $DEEPFACE_LOG_LEVEL."
f"Expected int but it is {log_level} ({str(err)})."
"Setting app log level to info."
)
self.log_level = logging.INFO
"""
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))
try:
self.log_level = int(log_level)
except Exception as err:
self.dump_log(
f"Exception while parsing $DEEPFACE_LOG_LEVEL."
f"Expected int but it is {log_level} ({str(err)})."
"Setting app log level to info."
)
self.log_level = logging.INFO
def info(self, message):
if self.log_level <= logging.INFO:
@ -39,16 +55,3 @@ class Logger:
def dump_log(self, 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
# 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:

View File

@ -10,9 +10,9 @@ import gdown
# project dependencies
from deepface.commons import folder_utils
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

View File

@ -15,9 +15,9 @@ from deepface.detectors import (
YuNet,
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:

View File

@ -5,9 +5,9 @@ import gdown
import numpy as np
from deepface.commons import folder_utils
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):

View File

@ -7,9 +7,9 @@ import numpy as np
from deepface.detectors import OpenCv
from deepface.commons import folder_utils
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

View File

@ -4,9 +4,9 @@ import numpy as np
import gdown
from deepface.models.Detector import Detector, FacialAreaRegion
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
PATH = "/.deepface/weights/yolov8n-face.pt"

View File

@ -10,9 +10,9 @@ import gdown
# project dependencies
from deepface.commons import folder_utils
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):

View File

@ -4,9 +4,9 @@ import numpy as np
from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils
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

View File

@ -9,9 +9,9 @@ import cv2
# project dependencies
from deepface.commons import package_utils, folder_utils
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

View File

@ -9,9 +9,9 @@ import numpy as np
from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils
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

View File

@ -9,9 +9,9 @@ import numpy as np
from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils
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

View File

@ -11,9 +11,9 @@ from deepface.modules import modeling
from deepface.models.Detector import DetectedFace, FacialAreaRegion
from deepface.detectors import DetectorWrapper
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

View File

@ -12,9 +12,9 @@ from tqdm import tqdm
# project dependencies
from deepface.commons import image_utils
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(

View File

@ -10,9 +10,9 @@ import cv2
# project dependencies
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
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"

View File

@ -8,9 +8,9 @@ import numpy as np
# project dependencies
from deepface.modules import representation, detection, modeling
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(

View File

@ -9,9 +9,10 @@ import cv2
import numpy as np
# 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
class Fasnet:

View File

@ -7,9 +7,9 @@ import cv2
from deepface import DeepFace
from deepface.modules import verification
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

View File

@ -3,9 +3,9 @@ import cv2
# project dependencies
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"]

View File

@ -4,9 +4,9 @@ import unittest
# project dependencies
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):

View File

@ -4,9 +4,9 @@ import numpy as np
# project dependencies
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():

View File

@ -9,9 +9,9 @@ import pytest
# project dependencies
from deepface import DeepFace
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"]

View File

@ -9,9 +9,9 @@ import pandas as pd
from deepface import DeepFace
from deepface.modules import verification
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")

View File

@ -3,9 +3,9 @@ import cv2
# project dependencies
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():

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
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"]
metrics = ["cosine", "euclidean", "euclidean_l2"]

View File

@ -3,9 +3,9 @@ import json
# project dependencies
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():

View File

@ -3,9 +3,9 @@ import matplotlib.pyplot as plt
# project dependencies
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
# because they require to install huge packages