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)
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)