Click here to Skip to main content
15,867,308 members
Articles / Artificial Intelligence / Deep Learning

Creating a Face Database for Edge AI Facial Recognition

Rate me:
Please Sign up or sign in to vote.
5.00/5 (1 vote)
22 Jul 2021CPOL4 min read 8.5K   569   6   1
In this article we’ll explain how to create a simple database for face recognition.
Here we'll explain the structure of the simple face database for face identification, develop the Python code of the utilities to add faces to a face database, and give the references to download faces for creating the database. Finally, we'll explain how to launch the utility code for extracting faces from images and video.

Introduction

Face recognition is one area of Artificial Intelligence (AI) where deep learning (DL) has had great success over the past decade. The best face recognition systems can recognize people in images and video with the same precision humans can – or even better. The two main base stages of face recognition are person verification and identification.

In the first (current) half of this article series, we will:

  • Discuss the existing AI face detection methods and develop a program to run a pretrained DNN model
  • Consider face alignment and implement some alignment algorithms using face landmarks
  • Run the face detection DNN on a Raspberry Pi device, explore its performance, and consider possible ways to run it faster, as well as to detect faces in real time
  • Create a simple face database and fill it with faces extracted from images or videos

We assume that you are familiar with DNN, Python, Keras, and TensorFlow. You are welcome to download this project code ...

In the previous article, we’ve adapted our AI face detector to run in the near real-time mode on edge devices. In this article, we’ll discuss another component of our recognition system – a database of faces.

What’s In the Database

The first question is what exactly we must save to the database. Generally speaking, we must store in our database the identifier of a person – say, their first and last name – and their facial features, which we can compare with the features of another face to evaluate the degree of similarity. In most real facial recognition systems, the face features are called embeddings. These embeddings are extracted from a face image with a DNN model.

To keep our system generic and straightforward, we’ll use a very simple database structure. It will be represented by a folder with face images in the PNG format, one image per person. The files will be named with the person’s identifier (name). The image of each person will contain the aligned face extracted from a picture. When we use the database for face identification, we’ll extract the embeddings on the fly. We can use the same database with different DNN models.

Creating the Database

Let’s create our database. We have two options for getting face data: from a video and from an image. We already have the code for extracting the face data from a video. We can run our face detector as follows:

Python
d = MTCNN_Detector(50, 0.95)
vd = VideoFD(d)
v_file = r"C:\PI_FR\video\5_3.mp4"

save_path = r"C:\PI_FR\detect"
(f_count, fps) = vd.detect(v_file, save_path, True, False)

print("Face detections: "+str(f_count))
print("FPS: "+str(fps))

Note that the value of the save_path parameter is the folder where all the extracted faces are stored. The align parameter is True because faces must be aligned; and the draw_keypoints parameter is False because we don’t want to store facial landmarks.

When the process is finished, we can choose specific face samples for every person we’d like to add to the database. Here are the samples for five people, extracted from five testing videos, that we saved to our database.

Image 1

We intentionally haven’t added to the database some of the people present in our video files. These will be used to test the identification model on unknown humans in the videos

Populating the Database

Let’s write the Python code that will extract faces from images and add them to our database:

Python
from matplotlib import pyplot as plt

fa = Face_Align_Mouth(160)

db_path = r"C:\PI_FR\db"
align = True

p_name = "Woman05"
f_file = r"C:\PI_FR\faces\CF0055_1100_00F.jpg"

fimg = cv2.imread(f_file, cv2.IMREAD_UNCHANGED)
faces = d.detect(fimg)

r_file = os.path.join(db_path, p_name+".png")

face = faces[0]
if align:
    (f_cropped, f_img) = fa.align(fimg, face)
else:
    (f_cropped, f_img) = d.extract(fimg, face)
    
if (not (f_img is None)) and (not f_img.size==0):
    cv2.imwrite(r_file, f_img)
    plt.imshow(f_img)
    print(p_name+" appended to Face DB.")
else:
    print("Wrong image.")

With the above code, we can easily add face samples to the database using peoples’ photographs.

To make our database facilitate testing for all face recognition scenarios, we must add to it some faces of people who don’t appear in the test video files. We could extract these faces from other videos. But here we’ll cut a corner and borrow faces from free face databases.

We collect some Faces collected from several sources and place them in the image archive. We then run our face extraction code on this archive.

This adds ten face samples to our database. So we have the total of fifteen people in the database.

Image 2

We name the new people "Man01, …, Woman05" to differentiate them from the known people - those who are present in the test videos. You are welcome to download the database samples.

Next Steps

Now we have all the components of a face recognition application ready. In the second half of this series, we’ll select a face recognition DNN model and develop code for running this model against a video feed.

This article is part of the series 'Hybrid Edge AI for Facial Recognition View All

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Team Leader VIPAKS
Russian Federation Russian Federation
EDUCATION:

Master’s degree in Mechanics.

PhD degree in Mathematics and Physics.



PROFESSIONAL EXPERIENCE:

15 years’ experience in developing scientific programs
(C#, C++, Delphi, Java, Fortran).



SCIENTIFIC INTERESTS:

Mathematical modeling, symbolic computer algebra, numerical methods, 3D geometry modeling, artificial intelligence, differential equations, boundary value problems.

Comments and Discussions

 
GeneralMy vote of 5 Pin
Ștefan-Mihai MOGA22-Jul-21 19:46
professionalȘtefan-Mihai MOGA22-Jul-21 19:46 
This is a great inspiring article. I am pretty much pleased with your good work. You put really very helpful information. Keep it up once again.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.