Example #1
0
class Age_Gender_Detect():
    def __init__(self):
        self._detector = MTCNN()
        self._fa = FaceAligner()
        self._image_utils = Image_Utils()
        self._agender = PyAgender()
        self._gap_db = Gap_Db()

    def detect_face_age_gender(self, fn, debug_mode=False):
        print("\nprocessing file %s..." % fn)

        # check if faces already detected for the family
        family_image_name = os.path.basename(fn).split('.')[0]
        family_id = self._gap_db.get_family_id(family_image_name)
        if self._gap_db.is_face_done(family_id):
            print("Faces already detected for the family! Moving on...\n")
            return
        else:
            # if faces not detected for the family yet, remove previous faces for
            # the family
            os.system("rm -rf %s" %
                      (os.path.join(FACE_IMG_DIR, '%s*' % family_image_name)))

        img_original = cv2.imread(fn)
        if img_original.shape[0] >= img_original.shape[1]:
            img = imutils.resize(img_original, height=2000)
        else:
            img = imutils.resize(img_original, width=2000)

        faces = self._detector.detect_faces(img)
        self._image_utils.squarify_box(faces)

        if debug_mode:
            self._image_utils.show_key_points(img, faces)
        face_patches = self._image_utils.show_face_patches(img,
                                                           faces,
                                                           show=False)

        # align faces
        faces_aligned = self._fa.align(faces, img)
        assert len(faces_aligned) == len(face_patches)

        # detect age and gender
        ages = []
        genders = []
        for face in face_patches:
            g, a = self._agender.gender_age(face)
            gender = ['female' if g > 0.5 else 'male'][0]
            age = int(a)
            ages.append(age)
            genders.append(gender)
            print("gender: %s, age: %i" % (gender, age))

        # save faces
        face_images = []
        face_no = 0
        for face in faces_aligned:
            face_fn = family_image_name + '_' + str(face_no) + '.jpg'
            face_images.append(face_fn[:-4])  # remove 'extension'
            face_f_fn = os.path.join(FACE_IMG_DIR, face_fn)
            cv2.imwrite(face_f_fn, face)
            face_no += 1

        ## update database
        for image, age, gender in zip(face_images, ages, genders):
            self._gap_db.update_faces(family_id, image, age, gender)
Example #2
0
    for j in range(0,68):
        landmarks[i][j]    = shape.part(j).x
        landmarks[i][j+68] = shape.part(j).y

    # expressions
    # -----------
    frame = cv2.imread(fimg,0)
    roi = cv2.resize(frame, (48, 48))
    roi = roi.astype("float") / 255.0
    roi = img_to_array(roi)
    roi = np.expand_dims(roi, axis=0)
    expressions = expression_classifier.predict(roi)[0]
    if i==0:
        m = expressions.shape[0]
        data = np.zeros((n,m))
        
    data[i]    = expressions

    # age and gender
    # --------------
    gender_age[i] = agender.gender_age(cv2.imread(fimg))


print('saving landmarks.npy, expressions.npy, and gender_age.npy and  ...   ')
np.save('landmarks',landmarks)
np.save('expressions',data)
np.save('gender_age',gender_age)