mirror of
https://github.com/serengil/deepface.git
synced 2025-06-08 04:25:21 +00:00
Added dominant_gender and probabilities for man / woman results in analyze function
This commit is contained in:
parent
98cccf133a
commit
3f29c6a606
@ -294,7 +294,11 @@ def analyze(img_path, actions = ('emotion', 'age', 'gender', 'race') , models =
|
||||
{
|
||||
"region": {'x': 230, 'y': 120, 'w': 36, 'h': 45},
|
||||
"age": 28.66,
|
||||
"gender": "woman",
|
||||
"dominant_gender": "Woman",
|
||||
"gender": {
|
||||
'Woman': 99.99407529830933,
|
||||
'Man': 0.005928758764639497,
|
||||
}
|
||||
"dominant_emotion": "neutral",
|
||||
"emotion": {
|
||||
'sad': 37.65260875225067,
|
||||
@ -417,14 +421,19 @@ def analyze(img_path, actions = ('emotion', 'age', 'gender', 'race') , models =
|
||||
if img_224 is None:
|
||||
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)
|
||||
|
||||
gender_prediction = models['gender'].predict(img_224)[0,:]
|
||||
gender_predictions = models['gender'].predict(img_224)[0,:]
|
||||
|
||||
if np.argmax(gender_prediction) == 0:
|
||||
gender = "Woman"
|
||||
elif np.argmax(gender_prediction) == 1:
|
||||
gender = "Man"
|
||||
sum_of_predictions = gender_predictions.sum()
|
||||
gender_labels = ["Woman", "Man"]
|
||||
resp_obj["gender"] = {}
|
||||
|
||||
for i in range(0, len(gender_labels)):
|
||||
gender_label = gender_labels[i]
|
||||
gender_prediction = 100 * gender_predictions[i] / sum_of_predictions
|
||||
resp_obj["gender"][gender_label] = gender_prediction
|
||||
|
||||
resp_obj["dominant_gender"] = gender_labels[np.argmax(gender_predictions)]
|
||||
|
||||
resp_obj["gender"] = gender
|
||||
|
||||
elif action == 'race':
|
||||
if img_224 is None:
|
||||
|
@ -23,7 +23,7 @@ def loadModel(url = 'https://github.com/serengil/deepface_models/releases/downlo
|
||||
arcface_model = keras.layers.Flatten()(arcface_model)
|
||||
arcface_model = keras.layers.Dense(512, activation=None, use_bias=True, kernel_initializer="glorot_normal")(arcface_model)
|
||||
embedding = keras.layers.BatchNormalization(momentum=0.9, epsilon=2e-5, name="embedding", scale=True)(arcface_model)
|
||||
model = keras.models.Model(inputs, embedding, name=base_model.name)
|
||||
model = keras.detectors.Model(inputs, embedding, name=base_model.name)
|
||||
|
||||
#---------------------------------------
|
||||
#check the availability of pre-trained weights
|
||||
|
32
tests/test_nonbinary_gender.py
Normal file
32
tests/test_nonbinary_gender.py
Normal file
@ -0,0 +1,32 @@
|
||||
from deepface import DeepFace
|
||||
|
||||
dataset = [
|
||||
'dataset/img1.jpg',
|
||||
'dataset/img5.jpg',
|
||||
'dataset/img6.jpg',
|
||||
'dataset/img8.jpg',
|
||||
'dataset/img7.jpg',
|
||||
'dataset/img9.jpg',
|
||||
'dataset/img11.jpg',
|
||||
'dataset/img11.jpg',
|
||||
]
|
||||
|
||||
detectors = ['opencv', 'ssd', 'retinaface', 'mtcnn'] # dlib not tested
|
||||
|
||||
|
||||
def test_gender_prediction():
|
||||
for detector in detectors:
|
||||
results = DeepFace.analyze(dataset, actions=('gender',), detector_backend=detector, prog_bar=False)
|
||||
for key in results.keys():
|
||||
result = results[key]
|
||||
assert 'gender' in result.keys()
|
||||
assert 'dominant_gender' in result.keys() and result["dominant_gender"] in ["Man", "Woman"]
|
||||
if result["dominant_gender"] == "Man":
|
||||
assert result["gender"]["Man"] > result["gender"]["Woman"]
|
||||
else:
|
||||
assert result["gender"]["Man"] < result["gender"]["Woman"]
|
||||
print(f'detector {detector} passed')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_gender_prediction()
|
@ -96,7 +96,7 @@ def test_cases():
|
||||
print(demography)
|
||||
|
||||
evaluate(demography["age"] > 20 and demography["age"] < 40)
|
||||
evaluate(demography["gender"] == "Woman")
|
||||
evaluate(demography["dominant_gender"] == "Woman")
|
||||
|
||||
print("-----------------------------------------")
|
||||
|
||||
@ -108,12 +108,12 @@ def test_cases():
|
||||
|
||||
#check response is a valid json
|
||||
print("Age: ", demography["age"])
|
||||
print("Gender: ", demography["gender"])
|
||||
print("Gender: ", demography["dominant_gender"])
|
||||
print("Race: ", demography["dominant_race"])
|
||||
print("Emotion: ", demography["dominant_emotion"])
|
||||
|
||||
evaluate(demography.get("age") is not None)
|
||||
evaluate(demography.get("gender") is not None)
|
||||
evaluate(demography.get("dominant_gender") is not None)
|
||||
evaluate(demography.get("dominant_race") is not None)
|
||||
evaluate(demography.get("dominant_emotion") is not None)
|
||||
|
||||
@ -123,12 +123,12 @@ def test_cases():
|
||||
demography = DeepFace.analyze(img, ['age', 'gender'])
|
||||
|
||||
print("Age: ", demography.get("age"))
|
||||
print("Gender: ", demography.get("gender"))
|
||||
print("Gender: ", demography.get("dominant_gender"))
|
||||
print("Race: ", demography.get("dominant_race"))
|
||||
print("Emotion: ", demography.get("dominant_emotion"))
|
||||
|
||||
evaluate(demography.get("age") is not None)
|
||||
evaluate(demography.get("gender") is not None)
|
||||
evaluate(demography.get("dominant_gender") is not None)
|
||||
evaluate(demography.get("dominant_race") is None)
|
||||
evaluate(demography.get("dominant_emotion") is None)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user