+1

Facial Recognition System: Face Alignment

In my last post I've shown how to identify the face from the given image or video. In this post we are going to talk about "Face Alignment" which is a normalization technique, often used to improve the accuracy of face recognition algorithms, including deep learning models.

A process of facial alignment is to transform all faces in database to be:

  • centered in the image.
  • rotated that such the eyes lie on a horizontal line (i.e., the face is rotated such that the eyes lie along the same y-coordinates).
  • scaled such that the size of the faces are approximately identical.

We gonna use function in imutils package to align the face before we save it.

Let's code

Because some code you may already know it since I wrote it in my previous post , so I'm going talk some new lines of code only.

we required use to pass the name of user when they run programm

ap.add_argument("-s", "--save", type=str, default="",
    help="folder name where use for store user images", required=True)

we init face aligner.

predictor = dlib.shape_predictor("model/shape_predictor_68_face_landmarks.dat")
fa = FaceAligner(predictor, desiredFaceWidth=256)

we init some variable. we check directory already exist if not we create one. so the for should have structure like this

images
   user_name
       0.png
       1.png
       ......
count_image = 0
save_file_name = args["save"]
base_dir = "images/"

if save_file_name:
    base_dir = base_dir + save_file_name + "/"
    if not os.path.exists(base_dir):
        os.makedirs(base_dir)

During programm running, we check if user press key s and face image been detected , we will save the face image in created directory. In each folder maximux faces are 10.

   # if the `s` key was pressed save the first found face
    if key == ord('s'):
        if len(rects) > 0:
            faceAligned = fa.align(frame, gray_frame, rects[0])
            image_name = base_dir + str(count_image) + ".png"
            # save image
            cv2.imwrite(image_name, faceAligned)
            # show image
            cv2.imshow(image_name, faceAligned)
            count_image += 1
            if count_image > 10:
                count_image = 0

Here the full source code:

from imutils.video import VideoStream
from imutils import face_utils
from imutils.face_utils import FaceAligner
import imutils
import argparse
import time
import cv2
import dlib
import os

ap = argparse.ArgumentParser()
ap.add_argument("-s", "--save", type=str, default="",
    help="folder name where use for store user images", required=True)
args = vars(ap.parse_args())

print("[INFO] loading facial landmark predictor...")
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("model/shape_predictor_68_face_landmarks.dat")
fa = FaceAligner(predictor, desiredFaceWidth=256)

print("[INFO] camera sensor warming up...")
vs = VideoStream().start()
time.sleep(2.0)
count_image = 0
save_file_name = args["save"]
base_dir = "images/"

if save_file_name:
    base_dir = base_dir + save_file_name + "/"
    if not os.path.exists(base_dir):
        os.makedirs(base_dir)
# loop over the frames from the video stream
while True:
    # grab the frame from the threaded video stream, resize it to
    # have a maximum width of 600 pixels, and convert it to
    # grayscale
    frame = vs.read()
    frame = imutils.resize(frame, width=600)
    height, width = frame.shape[:2]
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     # detect faces in the grayayscale frame
    rects = detector(gray_frame, 0)


    key = cv2.waitKey(1) & 0xFF
     # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

    # if the `s` key was pressed save the first found face
    if key == ord('s'):
        if len(rects) > 0:
            faceAligned = fa.align(frame, gray_frame, rects[0])
            image_name = base_dir + str(count_image) + ".png"
            # save image
            cv2.imwrite(image_name, faceAligned)
            # show image
            cv2.imshow(image_name, faceAligned)
            count_image += 1
            if count_image > 10:
                count_image = 0

    # loopop over the face detections
    for rect in rects:
        (x,y,w,h) = face_utils.rect_to_bb(rect)
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0,0,255), 1)

    # show the frame
    cv2.imshow("Frame", frame)

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

Let's run it.

python save_face_from_video.py -s rathanak

And here the result:

Resources

Next Step

In this post we talk about applying facial alignment with dlib, OpenCV and Python which is essential for improving the accuracy of face recognition algorithms, including deep learning models. Next , we'll use those faces to train our marchine and using the train model to recognize the new given face image.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí