LBPH (Local Binary Pattern Histogram) is a Face-Recognition algorithm it is used to recognize the face of a person. It is known for its performance and how it is able to recognize the face of a person from both front face and side face.
Before starting the intuition behind the LBPH algorithm, let’s first understand a little bit about the basics of Images and pixels to understand how images are represented before we start the content about face recognition. So, let’s get started understanding images and pixels.
This article was published as a part of the Data Science Blogathon
All images are represented in the Matrix formats, as you can see here, which are composed of rows and columns. The basic component of an image is the pixel. An image is made up of a set of pixels. Each one of these is small squares. By placing them side by side, we can form the complete image. A single pixel is considered to be the least possible information in an image. For every image, the value of pixels ranges between 0 to 255.
This image here is 32 pixels wide and 32 pixels high.
And when we multiply 32 by 32, the result is 1024, which is the total number of pixels in the image. Each pixel is composed of Three values are R, G, and B, which are the basic colours red, green, and blue. The combination of these three basic colours will create all these colours here in the image so we conclude that a single pixel has three channels, one channel for each one of the basic colours.
As now we have some understanding of images and pixels, now it will be easier to understand the intuition behind the LBPH algorithm. So let’s get started with the intuition of the LBPH algorithm.
Let’s start by analyzing a matrix representing a piece of the image. As you learned earlier, an image is represented in these formats. In this example, we have three rows and three columns, and the total number of pixels is nine. Select the central pixel here, value eight, and apply a condition. If the value is greater or equal to 8, the result is ‘1’ otherwise, if the value is less than eight, the result is zero. After applying the conditioner, the matrix will now look like this.
The basic calculation of this algorithm is to apply this condition, selecting the centre element of the matrix. Now, we need to generate a binary value. Binary value = 11100010. The algorithm will start applying the condition from the top left corner element that goes up to the 1 element of the 2nd row, thinking it is making a circle like this.
After converting the Binary value to the decimal value, we get Decimal Value = 226. It indicates that all these pixels around the central value equal 226.
This algorithm is robust when it comes to lightning. If you put a flashlight on the image, the value of the pixels will increase. The higher the values, the brighter the image; when values are lower, the darker the image will be. For this reason, this algorithm has good results in light and dark images because when the image becomes lighter or darker, all the pixels in the neighborhood here will be changed. After putting the light on the image, the matrix will look like this. After applying the above condition, we will get the binary value the same as above i.e, 11100010.
Let’s consider this another image here. To better understand how the algorithm will recognize a person’s face.
We have the image of a face here, and the algorithm will create several squares, as you can see here. And within each one of these squares, we have the representation of the previous light. For example, this square here does not represent only one pixel but is set with multiple pixels: three rows and four columns. Three by four is equal to twelve pixels in total in these squares. Here, in each of these squares, there are twelve pixels. Then, we apply that condition to each one. Considering the central pixel.
The next step is to create a histogram, which is a concept of statistics that will count how many times each color appears in each square. This is the representation of the histogram.
For example, if the value 110 appears 50 times a bar like this will be created with this size equal to 50; if 201 appears 110 times, the other bar will be created in this histogram with this size equal to 100. Based on the comparison of the histograms, the algorithm will be able to identify the edges and edges of the images. For example, we don’t have information about the person’s face in this first square here. So, the histogram will be different from this other square that has the border of the face. In short, the algorithm knows which histograms represent borders and which histograms represent the person’s main features, such as the colour of the eye, the shape of the mouth, and so on.
So this is the basic theory of this algorithm, which is based on the creation and comparison of histograms.
Note:- If you are facing an error while importing the cv2 library like “No module named ‘cv2.cv2”. Then, you can write code in Google Colab. I have written this code in Google Colab.
I will be using the Yaleface dataset
import os
import cv2
import zipfile
import numpy as np
from google.colab.patches import cv2_imshow
# Data Gathering
# Extracting face images from the provided dataset for further processing in the facial recognition system.
path = "/content/drive/MyDrive/Datasets/yalefaces.zip"
zip_obj = zipfile.ZipFile(file = path,mode='r')
zip_obj.extractall('./')
zip_obj.close()
Before giving data to the model these images are in .gif format so we need order to convert them into ndarray so we need to use the following code:
# Preprocessing the images by converting them into suitable formats for feature extraction and model training.
from PIL import Image
def get_image_data() :
paths = [os.path.join("/content/yalefaces/train",f)for f in os.listdir(path="/content/yalefaces/train")]
# faces will contain the px of the images
# path will contain the path of the images
faces = []
ids = []
for path in paths :
#image processing
#input image
image = Image.open(path).convert('L')
image_np = np.array(image,'uint8')
id = int(os.path.split(path)[1].split(".")[0].replace("subject"," "))
ids.append(id)
faces.append(image_np)
return np.array(ids),faces
ids , faces = get_image_data()
This process involves extracting facial features from the images and training the classifier to recognize patterns in these feature vectors that are associated with different individuals.
# Initialize LBPH (Local Binary Pattern Histogram(lbp)) face recognizer object using OpenCV's computer vision library
lbph_classifier = cv2.face.LBPHFaceRecognizer_create()
# Train the LBPH classifier using the provided face images (faces) and corresponding labels (ids)
lbph_classifier.train(faces,ids)
# Below line will store the histograms for each one of the images
lbph_classifier.write('lbph_classifier.yml')
#Utilizing the trained model for real-time facial recognition on a test image in the Python environment.
lbph_face_classifier = cv2.face.LBPHFaceRecognizer_create()
lbph_face_classifier.read("/content/lbph_classifier.yml")
#Now we will check the performance of the model by predicting on a test image
test_image = "/content/yalefaces/test/subject03.leftlight.gif"
image = Image.open(test_image).convert('L')
image_np = np.array(image,'uint8')
# Before giving the image to the model, let's visualize it first
cv2_imshow(image_np)
# Using the trained model to predict identity of the person in the test image
predictions = lbph_face_classifier.predict(image_np)
print(predictions)
# Retrieving the expected output (ground truth) from the test image file name
expected_output = int(os.path.split(test_image)[1].split('.')[0].replace("subject"," "))
print(expected_output)
3<-That's our output
This is the image we will be testing
The First parameter gives the face is detected, 2nd the parameter gives the confidence. This is the output we get after from print(predictions)
# Displaying the predicted(face detection) and expected outputs for comparison
cv2.putText(image_np, 'Pred.' +str(predictions[0]),(10,30),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0))
cv2.putText(image_np, 'Expec.' +str(expected_output),(10,50),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0)
)
cv2_imshow(image_np)
Final Result
In this article, we covered the following:-
Ans. LBPH (Local Binary Pattern Histogram) is preferred for facial recognition due to its effectiveness in facial recognition, artificial intelligence, and biometric applications. It extracts facial features through pattern recognition, employing a descriptor that efficiently captures the unique characteristics of faces. LBPH excels in detecting faces and performing face identification by analyzing local image patterns, making it a robust choice for biometric authentication and pattern recognition tasks in artificial intelligence applications.
Ans. LBPH incorporates the LBP operator to capture local patterns and gradients, enabling it to handle variations in lighting and facial expressions effectively. This, combined with dimensionality reduction techniques and the Haar cascade classifier, ensures robustness and accuracy in real-time face recognition and object detection.
Ans. Deep learning algorithms, particularly convolutional neural networks and object detection like YOLO, are considered the best for face recognition tasks due to their ability to learn complex patterns and features.
Ans. Challenges in face detection and recognition research include limitations in handling diverse human face appearances, scalability issues in large attendance systems, and constraints of methods like Eigenfaces. Techniques such as Histogram of Oriented Gradients (HOG) and grayscale image processing show promise but face challenges in real-world scenarios. Further research is needed to enhance the robustness of these systems in computer science, as highlighted by various studies (DOI).
The media shown in this article are not owned by Analytics Vidhya and are used at the Author’s discretion.
wow man awesome explanation but the above figure binary value is wrong can you please correct it this is the value you entered (10001101 ) but the correct form of the binary value is (10011010) and when we convert this binary value value into decimal value the answer is 154 but you mentioned 141