def __init__(self, *args, svm_path=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.clf = cv2.ml.SVM_load(svm_path)

        self.face_detector = FaceDetector(
            face_cascade='params/haarcascade_frontalface_default.xml',
            eye_cascade='params/haarcascade_lefteye_2splits.xml')
Esempio n. 2
0
    def init_algorithm(
            self,
            save_training_file='datasets/faces_training.pkl',
            load_preprocessed_data='datasets/faces_preprocessed.pkl',
            load_mlp='params/mlp.xml',
            face_casc='params/haarcascade_frontalface_default.xml',
            left_eye_casc='params/haarcascade_lefteye_2splits.xml',
            right_eye_casc='params/haarcascade_righteye_2splits.xml'):
        
        self.data_file = save_training_file
        self.faces = FaceDetector(face_casc, left_eye_casc, right_eye_casc)
        self.head = None

        # load preprocessed dataset to access labels and PCA params
        if path.isfile(load_preprocessed_data):
            (_, y_train), (_, y_test), V, m = homebrew.load_from_file(
                load_preprocessed_data)
            self.pca_V = V
            self.pca_m = m
            self.all_labels = np.unique(np.hstack((y_train, y_test)))

            # load pre-trained multi-layer perceptron
            if path.isfile(load_mlp):
                layer_sizes = np.array([self.pca_V.shape[1],
                                        len(self.all_labels)])
                self.MLP = MultiLayerPerceptron(layer_sizes, self.all_labels)
                self.MLP.load(load_mlp)
            else:
                print "Warning: Testing is disabled"
                print "Could not find pre-trained MLP file ", load_mlp
                self.testing.Disable()
        else:
            print "Warning: Testing is disabled"
            print "Could not find data file ", load_preprocessed_data
            self.testing.Disable()
def convert(people_folder):
    try:
        people = [person for person in os.listdir(people_folder)]
    except:
        print("Have you added at least one person to the system?")
        sys.exit()
    print("This are the people in the Recognition System:")
    for person in people:
        print("-" + person)
    save_folder = "./gray"
    
    
    #video = VideoCamera()
    print(save_folder)
    detector = FaceDetector()
    counter = 1
    images = []
    labels = []
    
    for i, person in enumerate(people):
    	folder = save_folder +  '/' + person
    	os.mkdir(folder)
    	for image in os.listdir(people_folder + '/' + person):
        	frame  = cv2.imread(people_folder +'/'+ person + '/' + image, 0)
        	face_coord = detector.detect(frame)
        	if len(face_coord):
        		frame, face_img = oo.get_images(frame, face_coord)
        		cv2.imwrite(folder + '/' + str(counter) + '.jpg',face_img[0])
        		print('Images Saved:' + str(counter))
        		counter += 1
        		cv2.imshow('Saved Face', face_img[0])
        	cv2.waitKey(50)
def add_person(people_folder):
    person_name = input('What is the name of the new person: ').lower()
    folder = people_folder +  '/' + person_name
    if not os.path.exists(folder):
        input("I will now take 20 pictures. Press ENTER when ready.")
        os.mkdir(folder)
        video = VideoCamera()
        detector = FaceDetector()
        counter = 1
        timer = 0
        cv2.namedWindow('Video Feed', cv2.WINDOW_AUTOSIZE)
        cv2.namedWindow('Saved Face', cv2.WINDOW_NORMAL)
        while counter < 21:
            frame = video.get_frame()
            face_coord = detector.detect(frame)
            if len(face_coord):
                frame, face_img = oo.get_images(frame, face_coord)
                
                if timer % 100 == 5:
                    cv2.imwrite(folder + '/' + str(counter) + '.jpg',
                                face_img[0])
                    print('Images Saved:' + str(counter))
                    counter += 1
                    cv2.imshow('Saved Face', face_img[0])

            cv2.imshow('Video Feed', frame)
            cv2.waitKey(50)
            timer += 5
    else:
        print("This name already exists.")
        sys.exit()
    def __init__(self,
                 *args,
                 training_data='data/cropped_faces.csv',
                 **kwargs):
        super().__init__(*args, **kwargs)
        self.face_detector = FaceDetector(
            face_cascade='params/haarcascade_frontalface_default.xml',
            eye_cascade='params/haarcascade_lefteye_2splits.xml')

        self.training_data = training_data
    def __init__(self, *args, clf_path=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.clf = cv2.ml.ANN_MLP_load(str(clf_path / 'mlp.xml'))

        self.index_to_label = pickle_load(clf_path / 'index_to_label')
        self.pca_args = pickle_load(clf_path / 'pca_args')

        self.face_detector = FaceDetector(
            face_cascade='params/haarcascade_frontalface_default.xml',
            eye_cascade='params/haarcascade_lefteye_2splits.xml')
    def init_algorithm(
            self,
            save_training_file='datasets/faces_training.pkl',
            load_preprocessed_data='datasets/faces_preprocessed.pkl',
            load_mlp='params/mlp.xml',
            face_casc='params/haarcascade_frontalface_default.xml',
            left_eye_casc='params/haarcascade_lefteye_2splits.xml',
            right_eye_casc='params/haarcascade_righteye_2splits.xml'):
        """Initializes face detector and facial expression classifier

            This method initializes both the face detector and the facial
            expression classifier.

            :param save_training_file:     filename for storing the assembled
                                           training set
            :param load_preprocessed_data: filename for loading a previously
                                           preprocessed dataset (for
                                           classification in Testing Mode)
            :param load_mlp:               filename for loading a pre-trained
                                           MLP classifier (use the script
                                           train_test_mlp.py)
            :param face_casc:              path to a face cascade
            :param left_eye_casc:          path to a left-eye cascade
            :param right_eye_casc:         path to a right-eye cascade
        """
        self.data_file = save_training_file
        self.faces = FaceDetector(face_casc, left_eye_casc, right_eye_casc)
        self.head = None

        # load preprocessed dataset to access labels and PCA params
        if path.isfile(load_preprocessed_data):
            (_, y_train), (
                _,
                y_test), V, m = homebrew.load_from_file(load_preprocessed_data)
            self.pca_V = V
            self.pca_m = m
            self.all_labels = np.unique(np.hstack((y_train, y_test)))

            # load pre-trained multi-layer perceptron
            if path.isfile(load_mlp):
                layer_sizes = np.array(
                    [self.pca_V.shape[1],
                     len(self.all_labels)])
                self.MLP = MultiLayerPerceptron(layer_sizes, self.all_labels)
                self.MLP.load(load_mlp)
            else:
                print "Warning: Testing is disabled"
                print "Could not find pre-trained MLP file ", load_mlp
                self.testing.Disable()
        else:
            print "Warning: Testing is disabled"
            print "Could not find data file ", load_preprocessed_data
            self.testing.Disable()
def live_add_face(path, shape, num_to_add):
    #Paramerers: path, string type, relative path of the directorty where the trainign images are about to be stored
    #shape, string type, values taken from 'rectangle' or 'ellipse', how a detected face is going to be highlighted in a frame of the video stream
    #num_to_add, int, number of training images to be taken for each new face.

    #initialise the frontal face detector
    detector = FaceDetector('app/frontal_face.xml')
    #Initialising the video camera object
    vid = video_capture.VideoCamera()
    #couter: keep track of the number of training images that have been taken
    counter = 1
    #timer: used to  record the number of seconds passe after the adding face procedure begins
    #only  take add new training image every ten seconds to avoid adding too many new images in a very short time
    timer = 0
    while counter <= num_to_add:
        frame = vid.get_frame()
        face_coord = detector.detect(frame)
        if len(face_coord):
            #If there is a face detected
            frame, face_image = get_image(frame, face_coord, shape)
            #frame is the current frame for the video stream
            #face_image is the image of the region in which the face is detected
            if timer % 10 == 5:
                cv2.imwrite(path + '/' + str(counter) + '.jpg', face_image[0])
                #Save file to directory specified the name of the face to be added
                print("Image save: " + str(counter))
                counter = counter + 1
                cv2.putText(frame, "Number of pictures taken: " + str(counter),
                            (5, frame.shape[0] - 5), cv2.FONT_HERSHEY_PLAIN,
                            1.2, (206, 0, 209), 2, cv2.LINE_AA)
                #show the user the number of pictures that have been taken
                cv2.imshow("Saved face", face_image[0])
            if counter >= num_to_add:
                cv2.putText(frame, "Adding new face complete. " + str(counter),
                            (5, frame.shape[0] - 5), cv2.FONT_HERSHEY_PLAIN,
                            1.2, (206, 0, 209), 2, cv2.LINE_AA)

        #create the jpeg encoding of the frame
        encode = cv2.imencode('.jpg', frame)[1].tobytes()
        #Yield the encoding
        #yield means the function is a python generator object.
        #A generator object is taken as an argument in flask Response() to render video streaming
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + encode + b'\r\n')
        timer = timer + 5
from detectors import FaceDetector


DIMENSIONS = (512, 512)


def _imshow(img):
    return plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), vmin=0, vmax=255)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--image', default='media/B04521_07_01.png')
    args = parser.parse_args()

    face_detector = FaceDetector(eye_cascade='../.py3.7-cv-blueprints/lib/python3.7/site-packages/cv2/data/haarcascade_eye.xml')

    img = cv2.resize(cv2.imread(args.image), DIMENSIONS)

    fig = plt.figure(figsize=(19, 6))
    fig.add_subplot(1, 3, 1)

    success, frame, head, (x, y) = face_detector.detect_face(img)
    assert success, 'Face was not detected'
    _imshow(frame)
    plt.title('Detected Face')

    fig.add_subplot(1, 3, 2)
    head_copy = head.copy()
    eyes = face_detector.eye_centers(head_copy, outline=True)
    _imshow(head_copy)
Esempio n. 10
0
def main():
    log.basicConfig(format="[ %(levelname)s ] %(message)s",
                    level=log.INFO,
                    stream=sys.stdout)

    plugin = IEPlugin(device=ML_DEVICE)
    face_detector = FaceDetector(FACE_MODEL, log)
    face_detector.init(plugin)

    emotion_detector = EmotionDetector(EMOTION_MODEL, log)
    emotion_detector.init(plugin)

    gender_detector = GenderDetector(GENDER_MODEL, log)
    gender_detector.init(plugin)

    cap = cv2.VideoCapture(0)  # dla pi camery inaczej

    sio = socketio.Client()
    sio.connect('http://localhost:7777')

    while cap.isOpened():
        ret, next_frame = cap.read()

        if not ret:
            break

        initial_w = cap.get(3)
        initial_h = cap.get(4)

        in_frame = face_detector.preprocess_frame(next_frame)
        face_detector.start(request_id=0, frame=in_frame)

        if face_detector.request(request_id=0):
            response = face_detector.response(request_id=0)
            faces = []
            face_id = 0
            for detected_face in response[0][0]:
                if face_detector.can_read(detected_face[2], 0.9):
                    face_id += 1
                    face = face_detector.extract_face(detected_face,
                                                      next_frame, initial_w,
                                                      initial_h)

                    in_emotion = emotion_detector.preprocess_frame(face)
                    emotion_detector.start(0, in_emotion)
                    emotion = None
                    if (emotion_detector.request(0)):
                        response = emotion_detector.response(0)
                        emotion = emotion_detector.extract_emotion(response[0])

                    in_gender = gender_detector.preprocess_frame(face)
                    gender_detector.start(0, in_gender)
                    gender = None
                    if (gender_detector.request(0)):
                        response = gender_detector.response(0)
                        gender = gender_detector.extract_gender(response[0])

                    if emotion and gender:
                        faces.append((face_id, gender, emotion))

            if len(faces) > 0:
                sio.emit('ai', faces)
                # log.info(faces)

    cv2.destroyAllWindows()
    del plugin
    def face_recognition_login(self,
                               SHAPE='rectangle',
                               DURATION=30,
                               NUM_TO_TAKE=5):
        start = time.time()
        threshold = 95
        user_label = ""
        #user_label, string type, records the face path of the user who has been detected and is considered for login

        users = User.query.filter_by(login_enabled=True).all()
        #get all the users for whom face recognition login has een enabled

        detector = FaceDetector('app/frontal_face.xml')
        recogniser = cv2.face.LBPHFaceRecognizer_create()
        vid = video_capture.VideoCamera()
        recogniser.train(self.images, np.array(self.labels))

        count = 0
        timer = 0
        while count <= NUM_TO_TAKE and time.time() - start < DURATION + 5:
            #checking for face recognition login if the set number of face pictures required for logging a user have not been detected yet and
            #the amount of time elapsed since the start is less than the required duration

            frame = vid.get_frame()
            face_coord = detector.detect(frame)

            if len(face_coord) and time.time() - start < DURATION:
                #if there is a face detected

                timer = timer + 1
                frame, face_image = get_image(frame, face_coord, SHAPE)
                image = face_image[0]
                #face_image[0] since we are only logging one user
                pred, error = recogniser.predict(image)

                if timer % 3 == 2:
                    #Updating every three frames in which a face is recognised.
                    if error < threshold:
                        if user_label == "":
                            user_label = self.face_label[pred]
                        if user_label != self.face_label[pred]:
                            count = 0
                            user_label = self.face_label[pred]
                        #add the label for the current user.
                        #If the length of the user label is 0 then add the first picture
                        else:
                            count = count + 1
                            print "detected: ", self.face_label[pred]
                            print self.face_label

            hight, width, channel = frame.shape
            cv2.rectangle(frame, (22, 22), (22 + count * 30, 26),
                          (206, 0, 209), 4)
            cv2.rectangle(frame, (20, 20), (20 + NUM_TO_TAKE * 30, 30),
                          (206, 0, 209), 2)
            cv2.putText(
                frame,
                "Login check complete: " + str(count) + "/" + str(NUM_TO_TAKE),
                (5, 60), cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2,
                cv2.LINE_AA)
            if count >= NUM_TO_TAKE:
                cv2.putText(frame, "Login criterions satisfied.", (5, 120),
                            cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2,
                            cv2.LINE_AA)
                cv2.putText(
                    frame,
                    "Please click the Login Face button above to login the user",
                    (5, 140), cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2,
                    cv2.LINE_AA)
            if time.time() - start >= DURATION:
                cv2.putText(frame, "Login criterions not satisfied.", (5, 120),
                            cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2,
                            cv2.LINE_AA)
                cv2.putText(frame,
                            "Time run out. Face recognition login failed.",
                            (5, 160), cv2.FONT_HERSHEY_PLAIN, 1.2,
                            (206, 0, 209), 2, cv2.LINE_AA)

            encode = cv2.imencode('.jpg', frame)[1].tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + encode + b'\r\n')
        if count > NUM_TO_TAKE:
            self.login = True
            #loading the user to log in
            self.user = User.query.filter_by(login_path=user_label).first()
            print "Facelogin_enabled: ", self.login
            print "Login user path: ", self.user
def classifier_training(PEOPLE_PATH, shape):
    #training an opencv face recognition cklassifier
    #Parameters: PEOPLE_PATH, string type, path of the directory for the current user that stores all the face foldersteach of which contains training images for a face
    #Shape: same as in referred to in the functios above
    #Return values: face_detector, opencv object, a detector that detects faces in an image
    #recogniser, opencv object, a recogniser that recognises detected faces
    #face_label, list type, an array of the labels of all the faces the recogniser that recognise

    try:
        #creating an array people of all the file names in the PEOPLE_PATH directory.
        #PEOPLE_PATH is a string varialble that is also a path of the directrory where the training images for a user are stored
        people = [person for person in os.listdir(PEOPLE_PATH)]
        #In Mac, by defaul the system creates a file called DS.Store to store metadata. This is not a directory that we can access
        for file in people:

            # .DS_Store exists in folders in OS system which affect the running of the program
            # .DS_Store contains metadata about the folder
            if file == '.DS_Store':
                people.remove(file)
    except:
        #If there is no person directory in the folder, then opencv will raise a runtime error
        print("There seems to be no person in the database")
        sys.exit()

    #initialise face detector
    #Type: opencv object that detects faces in a given iamge
    #Return: coordinates of the face if detected

    #Initialising an opencv frontal face detector
    #frontal_face.xml is a xml file provided opencv that links to the frontal face detector in the cv2 library
    face_detector = FaceDetector('app/frontal_face.xml')
    face_detector.__init__

    #initialise face recogniser
    #Type: open cv object that compares detected faces to the face encodings of the known people in the dataset
    #Return: Prediction (string), accury(double)
    #EigenFaceRecognizer is based on a face detection algorithm provided by opencv
    #Threshold: minimium number required for faces detected in the neighbour hood.

    recogniser = cv2.face.LBPHFaceRecognizer_create()
    threshold = 105

    #sample from images from the dataset for the classifier training

    #Images: list containg all the training images to be used for face recognition classifier training
    #Each image element has a corresponding label in the labels list
    images = []

    #Labels: list containing all the labels for the images.
    #Each label indicates which user the image belongs to
    labels = []
    person_label = []

    #face_label: list type, containing all the paths of the people whose faces have been added for the current user
    face_label = []
    for i, person in enumerate(people):
        face_label.append(person)
        for image in os.listdir(PEOPLE_PATH + person):
            images.append(cv2.imread(PEOPLE_PATH + person + '/' + image, 0))
            labels.append(i)
        person_label.append(person)

    try:
        #opencv function to train the recogniser
        #parameters: images, numpy array list type, l
        #labels, list type, storing the labels of the face in each training image, i.e. whose face it belongs to

        recogniser.train(images, np.array(labels))
        print "classifer trained on: ", person_label
    except:
        #Opencv training requirement
        print("At least two people are needed")
        sys.exit()

    return (face_detector, recogniser, face_label)
def recognize_people(people_folder):
    try:
        people = [person for person in os.listdir(people_folder)]
    except:
        print("Have you added at least one person to the system?")
        sys.exit()
    print("This are the people in the Recognition System:")
    for person in people:
        print("-" + person)

    start = time.time()
    #choice = check_choice()
    recognizer = None
    detector = FaceDetector()
    
    recognizer = cv2.face.createLBPHFaceRecognizer()
    threshold = 91 #93
    images = []
    labels = []
    labels_people = {}
    for i, person in enumerate(people):
        labels_people[i] = person
        for image in os.listdir(people_folder + '/' + person):
            images.append(cv2.imread(people_folder +'/'+ person + '/' + image, 0))
            labels.append(i)
    try:
        recognizer.train(images, np.array(labels))
        print("train model")
    except:
        print("\nOpenCV Error: Do you have at least two people in the database?\n")
        sys.exit()
    end = time.time()
    print(end - start)
    video = VideoCamera()
    while True:
        frame = video.get_frame()
        faces_coord = detector.detect(frame)
        if len(faces_coord):
            frame, faces_img = oo.get_images(frame, faces_coord)
            for i, face_img in enumerate(faces_img):
                if __version__ == "3.1.0":
                    collector = cv2.face.MinDistancePredictCollector()
                    recognizer.predict(face_img, collector)
                    conf = collector.getDist()
                    pred = collector.getLabel()
                else:
                    pred, conf = recognizer.predict(face_img)
                print("Prediction: " + str(pred))
                print('Confidence: ' + str(round(conf)))
                print('Threshold: ' + str(threshold))
                if conf < threshold:
                    cv2.putText(frame, labels_people[pred].capitalize(),
                                (faces_coord[i][0], faces_coord[i][1] - 2),
                                cv2.FONT_HERSHEY_PLAIN, 1.7, (206, 0, 209), 2,
                                cv2.LINE_AA)
                else:
                    cv2.putText(frame, "Unknown",
                                (faces_coord[i][0], faces_coord[i][1]),
                                cv2.FONT_HERSHEY_PLAIN, 1.7, (206, 0, 209), 2,
                                cv2.LINE_AA)

        cv2.putText(frame, "ESC to exit", (5, frame.shape[0] - 5),
                    cv2.FONT_HERSHEY_PLAIN, 1.2, (206, 0, 209), 2, cv2.LINE_AA)
        cv2.imshow('Video', frame)
        if cv2.waitKey(100) & 0xFF == 27:
            sys.exit()