singleton logger and docstrings

This commit is contained in:
Sefik Ilkin Serengil 2024-04-08 20:11:09 +01:00
parent fb4da39961
commit 9a83068672
39 changed files with 168 additions and 98 deletions

View File

@ -17,7 +17,7 @@ import tensorflow as tf
# package dependencies
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.commons import logger as log
from deepface.modules import (
modeling,
representation,
@ -29,7 +29,7 @@ from deepface.modules import (
)
from deepface import __version__
logger = Logger(module="DeepFace")
logger = log.get_singletonish_logger()
# -----------------------------------
# configurations for dependencies
@ -88,7 +88,7 @@ def verify(
OpenFace, DeepFace, DeepID, Dlib, ArcFace, SFace and GhostFaceNet (default is VGG-Face).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).
@ -168,7 +168,7 @@ def analyze(
Set to False to avoid the exception for low-resolution images (default is True).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).
@ -272,7 +272,7 @@ def find(
Set to False to avoid the exception for low-resolution images (default is True).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
align (boolean): Perform alignment based on the eye positions (default is True).
@ -348,7 +348,7 @@ def represent(
(default is True).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
align (boolean): Perform alignment based on the eye positions (default is True).
@ -406,7 +406,7 @@ def stream(
OpenFace, DeepFace, DeepID, Dlib, ArcFace, SFace and GhostFaceNet (default is VGG-Face).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).
@ -454,7 +454,7 @@ def extract_faces(
as a string, numpy array (BGR), or base64 encoded images.
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
enforce_detection (boolean): If no face is detected in an image, raise an exception.
Set to False to avoid the exception for low-resolution images (default is True).
@ -520,7 +520,7 @@ def detectFace(
added to resize the image (default is (224, 224)).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
enforce_detection (boolean): If no face is detected in an image, raise an exception.
Set to False to avoid the exception for low-resolution images (default is True).

View File

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

View File

@ -1,10 +1,11 @@
import os
import gdown
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
logger = Logger(module="basemodels.ArcFace")
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
# pylint: disable=unsubscriptable-object

View File

@ -1,10 +1,10 @@
import os
import gdown
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log
logger = Logger(module="basemodels.DeepID")
logger = log.get_singletonish_logger()
tf_version = package_utils.get_tf_major_version()

View File

@ -4,10 +4,10 @@ import bz2
import gdown
import numpy as np
from deepface.commons import folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log
logger = Logger(module="basemodels.DlibResNet")
logger = log.get_singletonish_logger()
# pylint: disable=too-few-public-methods

View File

@ -1,10 +1,10 @@
import os
import gdown
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log
logger = Logger(module="basemodels.Facenet")
logger = log.get_singletonish_logger()
# --------------------------------
# dependency configuration

View File

@ -2,10 +2,10 @@ import os
import zipfile
import gdown
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log
logger = Logger(module="basemodels.FbDeepFace")
logger = log.get_singletonish_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.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="basemodels.GhostFaceNet")
logger = log.get_singletonish_logger()
tf_major = package_utils.get_tf_major_version()
if tf_major == 1:

View File

@ -2,10 +2,10 @@ import os
import gdown
import tensorflow as tf
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log
logger = Logger(module="basemodels.OpenFace")
logger = log.get_singletonish_logger()
tf_version = package_utils.get_tf_major_version()
if tf_version == 1:

View File

@ -1,15 +1,18 @@
# built-in dependencies
import os
from typing import Any, List
# 3rd party dependencies
import numpy as np
import cv2 as cv
import gdown
# project dependencies
from deepface.commons import folder_utils
from deepface.commons.logger import Logger
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons import logger as log
logger = Logger(module="basemodels.SFace")
logger = log.get_singletonish_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.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="basemodels.VGGFace")
logger = log.get_singletonish_logger()
# ---------------------------------------

View File

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

View File

@ -17,6 +17,9 @@ class Logger:
)
self.log_level = logging.INFO
# TODO: delete print before commit
print("Logger object created")
def info(self, message):
if self.log_level <= logging.INFO:
self.dump_log(f"{message}")
@ -39,3 +42,16 @@ 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

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

View File

@ -13,9 +13,9 @@ from deepface.detectors import (
Yolo,
YuNet,
)
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="deepface/detectors/DetectorWrapper.py")
logger = log.get_singletonish_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.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="detectors.DlibWrapper")
logger = log.get_singletonish_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.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="detectors.SsdWrapper")
logger = log.get_singletonish_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.logger import Logger
from deepface.commons import logger as log
logger = Logger()
logger = log.get_singletonish_logger()
# Model's weights paths
PATH = "/.deepface/weights/yolov8n-face.pt"

View File

@ -1,13 +1,18 @@
# built-in dependencies
import os
from typing import Any, List
# 3rd party dependencies
import cv2
import numpy as np
import gdown
# project dependencies
from deepface.commons import folder_utils
from deepface.models.Detector import Detector, FacialAreaRegion
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="detectors.YunetWrapper")
logger = log.get_singletonish_logger()
class YuNetClient(Detector):

View File

@ -3,10 +3,10 @@ import gdown
import numpy as np
from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.Demography import Demography
from deepface.commons import logger as log
logger = Logger(module="extendedmodels.Age")
logger = log.get_singletonish_logger()
# ----------------------------------------
# dependency configurations

View File

@ -1,12 +1,17 @@
# built-in dependencies
import os
# 3rd party dependencies
import gdown
import numpy as np
import cv2
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.Demography import Demography
logger = Logger(module="extendedmodels.Emotion")
# project dependencies
from deepface.commons import package_utils, folder_utils
from deepface.models.Demography import Demography
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
# -------------------------------------------
# pylint: disable=line-too-long

View File

@ -1,12 +1,17 @@
# built-in dependencies
import os
# 3rd party dependencies
import gdown
import numpy as np
# project dependencies
from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.Demography import Demography
from deepface.commons import logger as log
logger = Logger(module="extendedmodels.Gender")
logger = log.get_singletonish_logger()
# -------------------------------------
# pylint: disable=line-too-long

View File

@ -1,12 +1,17 @@
# built-in dependencies
import os
# 3rd party dependencies
import gdown
import numpy as np
# project dependencies
from deepface.basemodels import VGGFace
from deepface.commons import package_utils, folder_utils
from deepface.commons.logger import Logger
from deepface.models.Demography import Demography
from deepface.commons import logger as log
logger = Logger(module="extendedmodels.Race")
logger = log.get_singletonish_logger()
# --------------------------
# pylint: disable=line-too-long

View File

@ -34,7 +34,7 @@ def analyze(
Set to False to avoid the exception for low-resolution images (default is True).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).

View File

@ -10,9 +10,9 @@ from PIL import Image
from deepface.modules import preprocessing
from deepface.models.Detector import DetectedFace, FacialAreaRegion
from deepface.detectors import DetectorWrapper
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="deepface/modules/detection.py")
logger = log.get_singletonish_logger()
# pylint: disable=no-else-raise
@ -33,7 +33,7 @@ def extract_faces(
as a string, numpy array (BGR), or base64 encoded images.
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv)
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv)
enforce_detection (boolean): If no face is detected in an image, raise an exception.
Default is True. Set to False to avoid the exception for low-resolution images.

View File

@ -11,11 +11,11 @@ from tqdm import tqdm
from PIL import Image
# project dependencies
from deepface.commons.logger import Logger
from deepface.commons import package_utils
from deepface.modules import representation, detection, verification
from deepface.commons import logger as log
logger = Logger(module="deepface/modules/recognition.py")
logger = log.get_singletonish_logger()
def find(
@ -52,7 +52,7 @@ def find(
Default is True. Set to False to avoid the exception for low-resolution images.
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8'.
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip'.
align (boolean): Perform alignment based on the eye positions.

View File

@ -33,7 +33,7 @@ def represent(
Default is True. Set to False to avoid the exception for low-resolution images.
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8'.
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip'.
align (boolean): Perform alignment based on the eye positions.

View File

@ -10,9 +10,9 @@ import cv2
# project dependencies
from deepface import DeepFace
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="commons.realtime")
logger = log.get_singletonish_logger()
# dependency configuration
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
@ -43,7 +43,7 @@ def analysis(
OpenFace, DeepFace, DeepID, Dlib, ArcFace, SFace and GhostFaceNet (default is VGG-Face).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).
@ -182,7 +182,7 @@ def search_identity(
model_name (str): Model for face recognition. Options: VGG-Face, Facenet, Facenet512,
OpenFace, DeepFace, DeepID, Dlib, ArcFace, SFace and GhostFaceNet (default is VGG-Face).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).
Returns:
@ -349,7 +349,7 @@ def grab_facial_areas(
Args:
img (np.ndarray): image itself
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
threshold (int): threshold for facial area, discard smaller ones
Returns
result (list): list of tuple with x, y, w and h coordinates
@ -414,7 +414,7 @@ def perform_facial_recognition(
db_path (string): Path to the folder containing image files. All detected faces
in the database will be considered in the decision-making process.
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv).
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv).
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).
model_name (str): Model for face recognition. Options: VGG-Face, Facenet, Facenet512,

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.logger import Logger
from deepface.commons import logger as log
logger = Logger(module="deepface/modules/verification.py")
logger = log.get_singletonish_logger()
def verify(
@ -45,7 +45,7 @@ def verify(
OpenFace, DeepFace, DeepID, Dlib, ArcFace, SFace and GhostFaceNet (default is VGG-Face).
detector_backend (string): face detector backend. Options: 'opencv', 'retinaface',
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv)
'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' or 'skip' (default is opencv)
distance_metric (string): Metric for measuring similarity. Options: 'cosine',
'euclidean', 'euclidean_l2' (default is cosine).

View File

@ -1,13 +1,15 @@
# 3rd party dependencies
import matplotlib.pyplot as plt
import numpy as np
import cv2
# project dependencies
from deepface import DeepFace
from deepface.modules import verification
from deepface.models.FacialRecognition import FacialRecognition
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = Logger()
logger = log.get_singletonish_logger()
# ----------------------------------------------
# build face recognition model

View File

@ -1,8 +1,12 @@
# 3rd party dependencies
import cv2
from deepface import DeepFace
from deepface.commons.logger import Logger
logger = Logger("tests/test_analyze.py")
# project dependencies
from deepface import DeepFace
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
detectors = ["opencv", "mtcnn"]

View File

@ -1,10 +1,12 @@
import unittest
from deepface.commons.logger import Logger
from deepface.api.src.app import create_app
# built-in dependencies
import base64
import unittest
# project dependencies
from deepface.api.src.app import create_app
from deepface.commons import logger as log
logger = Logger("tests/test_api.py")
logger = log.get_singletonish_logger()
class TestVerifyEndpoint(unittest.TestCase):

View File

@ -1,9 +1,12 @@
# 3rd party dependencies
import pytest
import numpy as np
from deepface import DeepFace
from deepface.commons.logger import Logger
logger = Logger("tests/test_enforce_detection.py")
# project dependencies
from deepface import DeepFace
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
def test_enabled_enforce_detection_for_non_facial_input():

View File

@ -1,11 +1,14 @@
# 3rd party dependencies
import numpy as np
import base64
import pytest
# project dependencies
from deepface import DeepFace
from deepface.modules import preprocessing
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = Logger("tests/test_extract_faces.py")
logger = log.get_singletonish_logger()
detectors = ["opencv", "mtcnn"]

View File

@ -1,12 +1,18 @@
# built-in dependencies
import os
# 3rd party dependencies
import cv2
import pandas as pd
# project dependencies
from deepface import DeepFace
from deepface.modules import verification
from deepface.modules import recognition
from deepface.commons.logger import Logger
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
logger = Logger("tests/test_find.py")
threshold = verification.find_threshold(model_name="VGG-Face", distance_metric="cosine")

View File

@ -1,9 +1,11 @@
# built-in dependencies
import cv2
# project dependencies
from deepface import DeepFace
from deepface.commons.logger import Logger
logger = Logger("tests/test_represent.py")
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
def test_standard_represent():
img_path = "dataset/img1.jpg"

View File

@ -1,10 +1,12 @@
# 3rd party dependencies
import pytest
import cv2
# project dependencies
from deepface import DeepFace
from deepface.commons.logger import Logger
logger = Logger("tests/test_facial_recognition_models.py")
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
models = ["VGG-Face", "Facenet", "Facenet512", "ArcFace", "GhostFaceNet"]
metrics = ["cosine", "euclidean", "euclidean_l2"]

View File

@ -1,8 +1,11 @@
# built-in dependencies
import json
from deepface import DeepFace
from deepface.commons.logger import Logger
logger = Logger("tests/test_version.py")
# project dependencies
from deepface import DeepFace
from deepface.commons import logger as log
logger = log.get_singletonish_logger()
def test_version():

View File

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