Facial Recognition using PCA

Human Facial recognition to a large extent is a solved problem and is being ubiquitously used for numerous security applications. Although it is hard for an algorithm to recognize faces at different lighting conditions, poses, scales, and to some extent occlusions with high fidelity, such algorithms have been deployed in the newly released Iphone X and Samsung Galaxy S8 which peform amazingly well. The success and performance of these algorithms can be attributed to deep neural networks which are increasingly being used widely for recognition tasks.


In this post we will develop an intuition on how facial recognition works. We will use a small but extremely popular dataset known as the Yale Face Dataset. This contains images of the faces of 15 individuals. For each individual there are 11 images taken under a variety of conditions e.g., the person makes a happy expression, wears glasses etc.

We first build a simple human facial recognizer by using a Support Vector Machine trained on a lower dimensional representation of faces using a dimensionality reduction technique called PCA. All the code developed is in Python3.


All the images in the dataset are in .gif format which is a sequence of frames. We need to extract the frames and convert them into a format that is suitable for matrix operations. This could be done using the Image class() from the PIL package in Python3.

First we import the dependencies.

import os
import numpy as np
import pandas as pd
import cv2
from scipy import ndimage
from PIL import Image
from sklearn import preprocessing
import matplotlib.pyplot as plt

Then, we read the images from the dataset one-by-one and convert them to a Numpy 2-D matrix. These matrices are stored in an array faces_data. At the same time we also retreive the class that the image belongs to, in this case the Class ID of the person and store it in an array class_label.

# hello
data = 'yalefaces/'
faces_data = []
class_label = []
for filename in os.listdir(data):
    if filename.endswith(".txt") or filename.endswith(".DS_Store") :
        img_array = np.array(Image.open(data+filename)).astype(float)
        img_array = cv2.resize(img_array, (80,61))
        label = filename[7:9]
faces_data = np.array(faces_data)
class_label = np.array(class_label)

Visualizing a sample image from the dataset

alt text

def normalize(img):
    return img/255.

X = []
for img in faces_data:
    img = normalize(img)
    X.append(np.reshape(img, (1, img.shape[0]*img.shape[1])))
X = np.array(X)
X = np.reshape(X, (X.shape[0], X.shape[2]))
mu = np.mean(X, axis=0)
X = X - mu

Related Posts

Lane keeping for self-driving cars

Behavioral Cloning for self-driving cars

Traffic Sign Classification

Finding Lane Lines on the Road