Skip to content

Commit 357a397

Browse files
authored
Merge pull request #1156 from serengil/feat-task-2803-resize-moved-to-representation
Feat task 2803 moving find embedding methods to super if not require additional logic
2 parents 0f89272 + 504dc3c commit 357a397

12 files changed

+27
-103
lines changed

deepface/basemodels/ArcFace.py

-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
from typing import List
21
import os
32
import gdown
4-
import numpy as np
53
from deepface.commons import package_utils, folder_utils
64
from deepface.commons.logger import Logger
75
from deepface.models.FacialRecognition import FacialRecognition
@@ -56,18 +54,6 @@ def __init__(self):
5654
self.input_shape = (112, 112)
5755
self.output_shape = 512
5856

59-
def find_embeddings(self, img: np.ndarray) -> List[float]:
60-
"""
61-
find embeddings with ArcFace model
62-
Args:
63-
img (np.ndarray): pre-loaded image in BGR
64-
Returns
65-
embeddings (list): multi-dimensional vector
66-
"""
67-
# model.predict causes memory issue when it is called in a for loop
68-
# embedding = model.predict(img, verbose=0)[0].tolist()
69-
return self.model(img, training=False).numpy()[0].tolist()
70-
7157

7258
def load_model(
7359
url="https://github.com/serengil/deepface_models/releases/download/v1.0/arcface_weights.h5",

deepface/basemodels/DeepID.py

-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
from typing import List
21
import os
32
import gdown
4-
import numpy as np
53
from deepface.commons import package_utils, folder_utils
64
from deepface.commons.logger import Logger
75
from deepface.models.FacialRecognition import FacialRecognition
@@ -52,18 +50,6 @@ def __init__(self):
5250
self.input_shape = (47, 55)
5351
self.output_shape = 160
5452

55-
def find_embeddings(self, img: np.ndarray) -> List[float]:
56-
"""
57-
find embeddings with DeepId model
58-
Args:
59-
img (np.ndarray): pre-loaded image in BGR
60-
Returns
61-
embeddings (list): multi-dimensional vector
62-
"""
63-
# model.predict causes memory issue when it is called in a for loop
64-
# embedding = model.predict(img, verbose=0)[0].tolist()
65-
return self.model(img, training=False).numpy()[0].tolist()
66-
6753

6854
def load_model(
6955
url="https://github.com/serengil/deepface_models/releases/download/v1.0/deepid_keras_weights.h5",

deepface/basemodels/Dlib.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ def __init__(self):
2323
self.input_shape = (150, 150)
2424
self.output_shape = 128
2525

26-
def find_embeddings(self, img: np.ndarray) -> List[float]:
26+
def forward(self, img: np.ndarray) -> List[float]:
2727
"""
28-
find embeddings with Dlib model - different than regular models
28+
Find embeddings with Dlib model.
29+
This model necessitates the override of the forward method
30+
because it is not a keras model.
2931
Args:
3032
img (np.ndarray): pre-loaded image in BGR
3133
Returns

deepface/basemodels/Facenet.py

-26
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
from typing import List
21
import os
32
import gdown
4-
import numpy as np
53
from deepface.commons import package_utils, folder_utils
64
from deepface.commons.logger import Logger
75
from deepface.models.FacialRecognition import FacialRecognition
@@ -56,18 +54,6 @@ def __init__(self):
5654
self.input_shape = (160, 160)
5755
self.output_shape = 128
5856

59-
def find_embeddings(self, img: np.ndarray) -> List[float]:
60-
"""
61-
find embeddings with FaceNet-128d model
62-
Args:
63-
img (np.ndarray): pre-loaded image in BGR
64-
Returns
65-
embeddings (list): multi-dimensional vector
66-
"""
67-
# model.predict causes memory issue when it is called in a for loop
68-
# embedding = model.predict(img, verbose=0)[0].tolist()
69-
return self.model(img, training=False).numpy()[0].tolist()
70-
7157

7258
class FaceNet512dClient(FacialRecognition):
7359
"""
@@ -80,18 +66,6 @@ def __init__(self):
8066
self.input_shape = (160, 160)
8167
self.output_shape = 512
8268

83-
def find_embeddings(self, img: np.ndarray) -> List[float]:
84-
"""
85-
find embeddings with FaceNet-512d model
86-
Args:
87-
img (np.ndarray): pre-loaded image in BGR
88-
Returns
89-
embeddings (list): multi-dimensional vector
90-
"""
91-
# model.predict causes memory issue when it is called in a for loop
92-
# embedding = model.predict(img, verbose=0)[0].tolist()
93-
return self.model(img, training=False).numpy()[0].tolist()
94-
9569

9670
def scaling(x, scale):
9771
return x * scale

deepface/basemodels/FbDeepFace.py

-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
from typing import List
21
import os
32
import zipfile
43
import gdown
5-
import numpy as np
64
from deepface.commons import package_utils, folder_utils
75
from deepface.commons.logger import Logger
86
from deepface.models.FacialRecognition import FacialRecognition
@@ -56,18 +54,6 @@ def __init__(self):
5654
self.input_shape = (152, 152)
5755
self.output_shape = 4096
5856

59-
def find_embeddings(self, img: np.ndarray) -> List[float]:
60-
"""
61-
find embeddings with OpenFace model
62-
Args:
63-
img (np.ndarray): pre-loaded image in BGR
64-
Returns
65-
embeddings (list): multi-dimensional vector
66-
"""
67-
# model.predict causes memory issue when it is called in a for loop
68-
# embedding = model.predict(img, verbose=0)[0].tolist()
69-
return self.model(img, training=False).numpy()[0].tolist()
70-
7157

7258
def load_model(
7359
url="https://github.com/swghosh/DeepFace/releases/download/weights-vggface2-2d-aligned/VGGFace2_DeepFace_weights_val-0.9034.h5.zip",

deepface/basemodels/GhostFaceNet.py

-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
# built-in dependencies
22
import os
3-
from typing import List
43

54
# 3rd party dependencies
65
import gdown
7-
import numpy as np
86
import tensorflow as tf
97

108
# project dependencies
@@ -72,11 +70,6 @@ def __init__(self):
7270
self.output_shape = 512
7371
self.model = load_model()
7472

75-
def find_embeddings(self, img: np.ndarray) -> List[float]:
76-
# model.predict causes memory issue when it is called in a for loop
77-
# embedding = model.predict(img, verbose=0)[0].tolist()
78-
return self.model(img, training=False).numpy()[0].tolist()
79-
8073

8174
def load_model():
8275
model = GhostFaceNetV1()

deepface/basemodels/OpenFace.py

-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
from typing import List
21
import os
32
import gdown
43
import tensorflow as tf
5-
import numpy as np
64
from deepface.commons import package_utils, folder_utils
75
from deepface.commons.logger import Logger
86
from deepface.models.FacialRecognition import FacialRecognition
@@ -39,18 +37,6 @@ def __init__(self):
3937
self.input_shape = (96, 96)
4038
self.output_shape = 128
4139

42-
def find_embeddings(self, img: np.ndarray) -> List[float]:
43-
"""
44-
find embeddings with OpenFace model
45-
Args:
46-
img (np.ndarray): pre-loaded image in BGR
47-
Returns
48-
embeddings (list): multi-dimensional vector
49-
"""
50-
# model.predict causes memory issue when it is called in a for loop
51-
# embedding = model.predict(img, verbose=0)[0].tolist()
52-
return self.model(img, training=False).numpy()[0].tolist()
53-
5440

5541
def load_model(
5642
url="https://github.com/serengil/deepface_models/releases/download/v1.0/openface_weights.h5",

deepface/basemodels/SFace.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ def __init__(self):
2525
self.input_shape = (112, 112)
2626
self.output_shape = 128
2727

28-
def find_embeddings(self, img: np.ndarray) -> List[float]:
28+
def forward(self, img: np.ndarray) -> List[float]:
2929
"""
30-
find embeddings with SFace model - different than regular models
30+
Find embeddings with SFace model
31+
This model necessitates the override of the forward method
32+
because it is not a keras model.
3133
Args:
3234
img (np.ndarray): pre-loaded image in BGR
3335
Returns

deepface/basemodels/VGGFace.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,20 @@ def __init__(self):
4747
self.input_shape = (224, 224)
4848
self.output_shape = 4096
4949

50-
def find_embeddings(self, img: np.ndarray) -> List[float]:
50+
def forward(self, img: np.ndarray) -> List[float]:
5151
"""
52-
find embeddings with VGG-Face model
52+
Generates embeddings using the VGG-Face model.
53+
This method incorporates an additional normalization layer,
54+
necessitating the override of the forward method.
55+
5356
Args:
5457
img (np.ndarray): pre-loaded image in BGR
5558
Returns
5659
embeddings (list): multi-dimensional vector
5760
"""
5861
# model.predict causes memory issue when it is called in a for loop
5962
# embedding = model.predict(img, verbose=0)[0].tolist()
63+
6064
# having normalization layer in descriptor troubles for some gpu users (e.g. issue 957, 966)
6165
# instead we are now calculating it with traditional way not with keras backend
6266
embedding = self.model(img, training=False).numpy()[0].tolist()

deepface/models/FacialRecognition.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from abc import ABC, abstractmethod
1+
from abc import ABC
22
from typing import Any, Union, List, Tuple
33
import numpy as np
44
from deepface.commons import package_utils
@@ -18,7 +18,12 @@ class FacialRecognition(ABC):
1818
input_shape: Tuple[int, int]
1919
output_shape: int
2020

21-
22-
@abstractmethod
23-
def find_embeddings(self, img: np.ndarray) -> List[float]:
24-
pass
21+
def forward(self, img: np.ndarray) -> List[float]:
22+
if not isinstance(self.model, Model):
23+
raise ValueError(
24+
"You must overwrite forward method if it is not a keras model,"
25+
f"but {self.model_name} not overwritten!"
26+
)
27+
# model.predict causes memory issue when it is called in a for loop
28+
# embedding = model.predict(img, verbose=0)[0].tolist()
29+
return self.model(img, training=False).numpy()[0].tolist()

deepface/modules/representation.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def represent(
104104
# custom normalization
105105
img = preprocessing.normalize_input(img=img, normalization=normalization)
106106

107-
embedding = model.find_embeddings(img)
107+
embedding = model.forward(img)
108108

109109
resp_obj = {}
110110
resp_obj["embedding"] = embedding

tests/face-recognition-how.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323

2424
img1 = DeepFace.extract_faces(img_path="dataset/img1.jpg", target_size=target_size)[0]["face"]
2525
img1 = np.expand_dims(img1, axis=0) # to (1, 224, 224, 3)
26-
img1_representation = model.find_embeddings(img1)
26+
img1_representation = model.forward(img1)
2727

2828
img2 = DeepFace.extract_faces(img_path="dataset/img3.jpg", target_size=target_size)[0]["face"]
2929
img2 = np.expand_dims(img2, axis=0)
30-
img2_representation = model.find_embeddings(img2)
30+
img2_representation = model.forward(img2)
3131

3232
img1_representation = np.array(img1_representation)
3333
img2_representation = np.array(img2_representation)

0 commit comments

Comments
 (0)