File size: 2,374 Bytes
aa77e96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#from basemodels import VGGFace
from deepface.basemodels import VGGFace
import os
from pathlib import Path
import gdown
import numpy as np
from keras.models import Model, Sequential
from keras.layers import Convolution2D, Flatten, Activation
from keras.preprocessing import image
import cv2


class Gender_Model():
    def __init__(self):
        self.model = self.loadModel()

    def predict_gender(self, face_image):
        image_preprocesing = self.transform_face_array2gender_face(face_image)
        gender_predictions = self.model.predict(image_preprocesing )[0,:]
        if np.argmax(gender_predictions) == 0:
            result_gender = "Woman"
        elif np.argmax(gender_predictions) == 1:
            result_gender = "Man"
        return result_gender

    def loadModel(self):
        model = VGGFace.baseModel()
        #--------------------------
        classes = 2
        base_model_output = Sequential()
        base_model_output = Convolution2D(classes, (1, 1), name='predictions')(model.layers[-4].output)
        base_model_output = Flatten()(base_model_output)
        base_model_output = Activation('softmax')(base_model_output)
        #--------------------------
        gender_model = Model(inputs=model.input, outputs=base_model_output)
        #--------------------------
        #load weights
        home = str(Path.home())
        if os.path.isfile(home+'/.deepface/weights/gender_model_weights.h5') != True:
            print("gender_model_weights.h5 will be downloaded...")
            url = 'https://drive.google.com/uc?id=1wUXRVlbsni2FN9-jkS_f4UTUrm1bRLyk'
            output = home+'/.deepface/weights/gender_model_weights.h5'
            gdown.download(url, output, quiet=False)
        gender_model.load_weights(home+'/.deepface/weights/gender_model_weights.h5')
        return gender_model
        #--------------------------

    def transform_face_array2gender_face(self,face_array,grayscale=False,target_size = (224, 224)):
        detected_face = face_array
        if grayscale == True:
            detected_face = cv2.cvtColor(detected_face, cv2.COLOR_BGR2GRAY)
        detected_face = cv2.resize(detected_face, target_size)
        img_pixels = image.img_to_array(detected_face)
        img_pixels = np.expand_dims(img_pixels, axis = 0)
        #normalize input in [0, 1]
        img_pixels /= 255
        return img_pixels