mirror of
https://github.com/serengil/deepface.git
synced 2025-06-07 03:55:21 +00:00
issue 131 normalization
This commit is contained in:
parent
b4631f1562
commit
e4484ac309
@ -66,7 +66,7 @@ def build_model(model_name):
|
|||||||
|
|
||||||
return model_obj[model_name]
|
return model_obj[model_name]
|
||||||
|
|
||||||
def verify(img1_path, img2_path = '', model_name = 'VGG-Face', distance_metric = 'cosine', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, prog_bar = True):
|
def verify(img1_path, img2_path = '', model_name = 'VGG-Face', distance_metric = 'cosine', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, prog_bar = True, normalization = 'base'):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This function verifies an image pair is same person or different persons.
|
This function verifies an image pair is same person or different persons.
|
||||||
@ -161,12 +161,16 @@ def verify(img1_path, img2_path = '', model_name = 'VGG-Face', distance_metric =
|
|||||||
img1_representation = represent(img_path = img1_path
|
img1_representation = represent(img_path = img1_path
|
||||||
, model_name = model_name, model = custom_model
|
, model_name = model_name, model = custom_model
|
||||||
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
||||||
, align = align)
|
, align = align
|
||||||
|
, normalization = normalization
|
||||||
|
)
|
||||||
|
|
||||||
img2_representation = represent(img_path = img2_path
|
img2_representation = represent(img_path = img2_path
|
||||||
, model_name = model_name, model = custom_model
|
, model_name = model_name, model = custom_model
|
||||||
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
||||||
, align = align)
|
, align = align
|
||||||
|
, normalization = normalization
|
||||||
|
)
|
||||||
|
|
||||||
#----------------------
|
#----------------------
|
||||||
#find distances between embeddings
|
#find distances between embeddings
|
||||||
@ -458,7 +462,7 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race'] , models =
|
|||||||
|
|
||||||
return resp_obj
|
return resp_obj
|
||||||
|
|
||||||
def find(img_path, db_path, model_name ='VGG-Face', distance_metric = 'cosine', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, prog_bar = True):
|
def find(img_path, db_path, model_name ='VGG-Face', distance_metric = 'cosine', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, prog_bar = True, normalization = 'base'):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This function applies verification several times and find an identity in a database
|
This function applies verification several times and find an identity in a database
|
||||||
@ -571,7 +575,9 @@ def find(img_path, db_path, model_name ='VGG-Face', distance_metric = 'cosine',
|
|||||||
representation = represent(img_path = employee
|
representation = represent(img_path = employee
|
||||||
, model_name = model_name, model = custom_model
|
, model_name = model_name, model = custom_model
|
||||||
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
||||||
, align = align)
|
, align = align
|
||||||
|
, normalization = normalization
|
||||||
|
)
|
||||||
|
|
||||||
instance.append(representation)
|
instance.append(representation)
|
||||||
|
|
||||||
@ -613,7 +619,9 @@ def find(img_path, db_path, model_name ='VGG-Face', distance_metric = 'cosine',
|
|||||||
target_representation = represent(img_path = img_path
|
target_representation = represent(img_path = img_path
|
||||||
, model_name = model_name, model = custom_model
|
, model_name = model_name, model = custom_model
|
||||||
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
, enforce_detection = enforce_detection, detector_backend = detector_backend
|
||||||
, align = align)
|
, align = align
|
||||||
|
, normalization = normalization
|
||||||
|
)
|
||||||
|
|
||||||
for k in metric_names:
|
for k in metric_names:
|
||||||
distances = []
|
distances = []
|
||||||
@ -704,7 +712,7 @@ def find(img_path, db_path, model_name ='VGG-Face', distance_metric = 'cosine',
|
|||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def represent(img_path, model_name = 'VGG-Face', model = None, enforce_detection = True, detector_backend = 'opencv', align = True):
|
def represent(img_path, model_name = 'VGG-Face', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, normalization = 'base'):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This function represents facial images as vectors.
|
This function represents facial images as vectors.
|
||||||
@ -722,6 +730,8 @@ def represent(img_path, model_name = 'VGG-Face', model = None, enforce_detection
|
|||||||
|
|
||||||
detector_backend (string): set face detector backend as retinaface, mtcnn, opencv, ssd or dlib
|
detector_backend (string): set face detector backend as retinaface, mtcnn, opencv, ssd or dlib
|
||||||
|
|
||||||
|
normalization (string): normalize the input image before feeding to model
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Represent function returns a multidimensional vector. The number of dimensions is changing based on the reference model. E.g. FaceNet returns 128 dimensional vector; VGG-Face returns 2622 dimensional vector.
|
Represent function returns a multidimensional vector. The number of dimensions is changing based on the reference model. E.g. FaceNet returns 128 dimensional vector; VGG-Face returns 2622 dimensional vector.
|
||||||
"""
|
"""
|
||||||
@ -741,6 +751,13 @@ def represent(img_path, model_name = 'VGG-Face', model = None, enforce_detection
|
|||||||
, detector_backend = detector_backend
|
, detector_backend = detector_backend
|
||||||
, align = align)
|
, align = align)
|
||||||
|
|
||||||
|
#---------------------------------
|
||||||
|
#custom normalization
|
||||||
|
|
||||||
|
img = functions.normalize_input(img = img, normalization = normalization)
|
||||||
|
|
||||||
|
#---------------------------------
|
||||||
|
|
||||||
#represent
|
#represent
|
||||||
embedding = model.predict(img)[0].tolist()
|
embedding = model.predict(img)[0].tolist()
|
||||||
|
|
||||||
|
@ -104,6 +104,57 @@ def detect_face(img, detector_backend = 'opencv', grayscale = False, enforce_det
|
|||||||
else:
|
else:
|
||||||
raise ValueError("Face could not be detected. Please confirm that the picture is a face photo or consider to set enforce_detection param to False.")
|
raise ValueError("Face could not be detected. Please confirm that the picture is a face photo or consider to set enforce_detection param to False.")
|
||||||
|
|
||||||
|
def normalize_input(img, normalization = 'base'):
|
||||||
|
|
||||||
|
#issue 131 declares that some normalization techniques improves the accuracy
|
||||||
|
|
||||||
|
if normalization == 'base':
|
||||||
|
return img
|
||||||
|
else: #@trevorgribble recommend the following idea
|
||||||
|
|
||||||
|
img *= 255 #restore input in scale of [0, 255] because it was normalized in scale of [0, 1] in preprocess_face
|
||||||
|
|
||||||
|
if normalization == 'Facenet':
|
||||||
|
mean, std = img.mean(), img.std()
|
||||||
|
img = (img - mean) / std
|
||||||
|
|
||||||
|
elif normalization == 'v1':
|
||||||
|
#BGR mean subtraction / 255 normalization
|
||||||
|
img[..., 0]-= 131.0912
|
||||||
|
img[..., 1] -= 103.8827
|
||||||
|
img[..., 2] -= 91.4953
|
||||||
|
img = img[..., ::-1]
|
||||||
|
img /= 255
|
||||||
|
|
||||||
|
elif(normalization =="v2"):
|
||||||
|
#RGB mean subtraction / 255 normalization
|
||||||
|
img[..., 0]-= 131.0912
|
||||||
|
img[..., 1] -= 103.8827
|
||||||
|
img[..., 2] -= 91.4953
|
||||||
|
img /= 255
|
||||||
|
|
||||||
|
elif(normalization =="v3"):
|
||||||
|
#BGR mean subtraction normalization
|
||||||
|
img[..., 0]-= 131.0912
|
||||||
|
img[..., 1] -= 103.8827
|
||||||
|
img[..., 2] -= 91.4953
|
||||||
|
img = img[..., ::-1]
|
||||||
|
|
||||||
|
elif(normalization =="v4"):
|
||||||
|
#RGB mean subtraction normalization
|
||||||
|
img[..., 0]-= 131.0912
|
||||||
|
img[..., 1] -= 103.8827
|
||||||
|
img[..., 2] -= 91.4953
|
||||||
|
|
||||||
|
elif(normalization=="v6"):
|
||||||
|
# simply / 127.5 - 1 (similar to facenet 2018 model preprocessing step as @iamrishab posted)
|
||||||
|
img /= 127.5
|
||||||
|
img -= 1
|
||||||
|
|
||||||
|
#-----------------------------
|
||||||
|
|
||||||
|
return img
|
||||||
|
|
||||||
def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_detection = True, detector_backend = 'opencv', return_region = False, align = True):
|
def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_detection = True, detector_backend = 'opencv', return_region = False, align = True):
|
||||||
|
|
||||||
#img might be path, base64 or numpy array. Convert it to numpy whatever it is.
|
#img might be path, base64 or numpy array. Convert it to numpy whatever it is.
|
||||||
@ -155,7 +206,7 @@ def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_dete
|
|||||||
|
|
||||||
#normalizing the image pixels
|
#normalizing the image pixels
|
||||||
|
|
||||||
img_pixels = image.img_to_array(img)
|
img_pixels = image.img_to_array(img) #what this line doing? must?
|
||||||
img_pixels = np.expand_dims(img_pixels, axis = 0)
|
img_pixels = np.expand_dims(img_pixels, axis = 0)
|
||||||
img_pixels /= 255 #normalize input in [0, 1]
|
img_pixels /= 255 #normalize input in [0, 1]
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user