Merge pull request #188 from vjsyong/master

Retrieve bounding box from analysis
This commit is contained in:
Sefik Ilkin Serengil 2021-02-17 20:02:44 +03:00 committed by GitHub
commit 8af418d052
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 12 deletions

1
.gitignore vendored
View File

@ -15,3 +15,4 @@ deepface/basemodels/__pycache__/*
deepface/extendedmodels/__pycache__/*
deepface/subsidiarymodels/__pycache__/*
tests/dataset/*.pkl
Age_Gender_Retail_Analysis.ipynb

View File

@ -282,6 +282,12 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race']
The function returns a dictionary. If img_path is a list, then it will return list of dictionary.
{
"region": {
'x': 230,
'y': 120,
'w': 36,
'h': 45
}
"age": 28.66,
"gender": "woman",
"dominant_emotion": "neutral",
@ -363,6 +369,10 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race']
img_224 = None # Set to prevent re-detection
region = [] # x, y, w, h of the detected face region
region_labels = ['x', 'y', 'w', 'h']
#facial attribute analysis
for index in pbar:
action = actions[index]
@ -370,7 +380,12 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race']
if action == 'emotion':
emotion_labels = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']
img = functions.preprocess_face(img = img_path, target_size = (48, 48), grayscale = True, enforce_detection = enforce_detection, detector_backend = detector_backend)
img, region = functions.preprocess_face(img = img_path, target_size = (48, 48), grayscale = True, enforce_detection = enforce_detection, detector_backend = detector_backend, return_region = True)
resp_obj["region"] = {}
for i, parameter in enumerate(region_labels):
resp_obj["region"][parameter] = region[i]
emotion_predictions = models['emotion'].predict(img)[0,:]
@ -387,7 +402,13 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race']
elif action == 'age':
if img_224 is None:
img_224 = functions.preprocess_face(img = img_path, target_size = (224, 224), grayscale = False, enforce_detection = enforce_detection, detector_backend = detector_backend)
img_224, region = functions.preprocess_face(img = img_path, target_size = (224, 224), grayscale = False, enforce_detection = enforce_detection, detector_backend = detector_backend, return_region = True)
resp_obj["region"] = {}
for i, parameter in enumerate(region_labels):
resp_obj["region"][parameter] = region[i]
age_predictions = models['age'].predict(img_224)[0,:]
apparent_age = Age.findApparentAge(age_predictions)
@ -395,7 +416,12 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race']
elif action == 'gender':
if img_224 is None:
img_224 = functions.preprocess_face(img = img_path, target_size = (224, 224), grayscale = False, enforce_detection = enforce_detection, detector_backend = detector_backend)
img_224, region = functions.preprocess_face(img = img_path, target_size = (224, 224), grayscale = False, enforce_detection = enforce_detection, detector_backend = detector_backend, return_region = True)
resp_obj["region"] = {}
for i, parameter in enumerate(region_labels):
resp_obj["region"][parameter] = region[i]
gender_prediction = models['gender'].predict(img_224)[0,:]
@ -408,10 +434,15 @@ def analyze(img_path, actions = ['emotion', 'age', 'gender', 'race']
elif action == 'race':
if img_224 is None:
img_224 = functions.preprocess_face(img = img_path, target_size = (224, 224), grayscale = False, enforce_detection = enforce_detection, detector_backend = detector_backend) #just emotion model expects grayscale images
img_224, region = functions.preprocess_face(img = img_path, target_size = (224, 224), grayscale = False, enforce_detection = enforce_detection, detector_backend = detector_backend, return_region = True) #just emotion model expects grayscale images
race_predictions = models['race'].predict(img_224)[0,:]
race_labels = ['asian', 'indian', 'black', 'white', 'middle eastern', 'latino hispanic']
resp_obj["region"] = {}
for i, parameter in enumerate(region_labels):
resp_obj["region"][parameter] = region[i]
sum_of_predictions = race_predictions.sum()
resp_obj["race"] = {}

View File

@ -206,7 +206,7 @@ def detect_face(img, detector_backend = 'opencv', grayscale = False, enforce_det
if len(faces) > 0:
x,y,w,h = faces[0] #focus on the 1st face found in the image
detected_face = img[int(y):int(y+h), int(x):int(x+w)]
return detected_face
return detected_face, [x, y, w, h]
else: #if no face detected
@ -260,7 +260,7 @@ def detect_face(img, detector_backend = 'opencv', grayscale = False, enforce_det
detected_face = base_img[int(top*aspect_ratio_y):int(bottom*aspect_ratio_y), int(left*aspect_ratio_x):int(right*aspect_ratio_x)]
return detected_face
return detected_face, [int(left*aspect_ratio_x), int(top*aspect_ratio_y), int(right*aspect_ratio_x) - int(left*aspect_ratio_x), int(bottom*aspect_ratio_y) - int(top*aspect_ratio_y)]
else: #if no face detected
@ -283,7 +283,7 @@ def detect_face(img, detector_backend = 'opencv', grayscale = False, enforce_det
detected_face = img[top:bottom, left:right]
return detected_face
return detected_face, [left, right, right - left, bottom - top]
else: #if no face detected
@ -302,7 +302,7 @@ def detect_face(img, detector_backend = 'opencv', grayscale = False, enforce_det
detection = detections[0]
x, y, w, h = detection["box"]
detected_face = img[int(y):int(y+h), int(x):int(x+w)]
return detected_face
return detected_face, [x, y, w, h]
else: #if no face detected
if not enforce_detection:
@ -436,7 +436,7 @@ def align_face(img, detector_backend = 'opencv'):
return img #return img anyway
def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_detection = True, detector_backend = 'opencv'):
def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_detection = True, detector_backend = 'opencv', return_region = False):
#img_path = copy.copy(img)
@ -444,7 +444,7 @@ def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_dete
img = load_image(img)
base_img = img.copy()
img = detect_face(img = img, detector_backend = detector_backend, grayscale = grayscale, enforce_detection = enforce_detection)
img, region = detect_face(img = img, detector_backend = detector_backend, grayscale = grayscale, enforce_detection = enforce_detection)
#--------------------------
@ -468,7 +468,10 @@ def preprocess_face(img, target_size=(224, 224), grayscale = False, enforce_dete
img_pixels = np.expand_dims(img_pixels, axis = 0)
img_pixels /= 255 #normalize input in [0, 1]
return img_pixels
if return_region == True:
return img_pixels, region
else:
return img_pixels
def find_input_shape(model):