Guide to Haar Cascade Algorithm with Object Detection Example
Discover object detection with the Haar Cascade algorithm using OpenCV. Learn how to employ this classic method for detecting objects in images and videos. Explore the underlying principles, step-by-step implementation, and real-world applications. From facial recognition to vehicle detection, grasp the essence of Haar Cascade and OpenCV’s role in revolutionizing computer vision. Whether you’re a novice or an expert, this article will equip you with the skills to harness the potential of object detection in your projects.
This article was published as a part of the Data Science Blogathon.
Table of contents
Why Use Haar Cascade Algorithm for Object Detection?
Identifying a custom object in an image is known as object detection. This task can be done using several techniques, but we will use the haar cascade, the simplest method to perform object detection in this article.
What is Haar Cascade Algorithm?
Haar cascade is an algorithm that can detect objects in images, irrespective of their scale in image and location.
This algorithm is not so complex and can run in real-time. We can train a haar-cascade detector to detect various objects like cars, bikes, buildings, fruits, etc.
Haar cascade uses the cascading window, and it tries to compute features in every window and classify whether it could be an object. For more details on its working, refer to this link.
Sample haar features traverse in window-sized across the picture to compute and match features.
Haar cascade works as a classifier. It classifies positive data points → that are part of our detected object and negative data points → that don’t contain our object.
- Haar cascades are fast and can work well in real-time.
- Haar cascade is not as accurate as modern object detection techniques are.
- Haar cascade has a downside. It predicts many false positives.
- Simple to implement, less computing power required.
Pre-trained Haar Cascades
The OpenCV library manages a repository containing all popular haar cascades that can be used for:
- Human face detection
- Eye detection
- Nose / Mouth detection
- Vehicle detection
Haar cascades are XML files that can be used in OpenCV to detect specified objects.
Implementing Haar-cascades in OpenCV
If you find your target object haar-cascade available in the pre-trained repository provided by OpenCV, you need to download the pre-trained XML file.
Installing OpenCV in Python
Installing OpenCV is easy using the pip installer.
!pip install opencv-python #---OR --- !pip install opencv-contrib-python
Loading Haar Cascade in OpenCV
We can load any haar-cascade XML file using
face_detector=cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’) eye_dectector = cv2.CascadeClassifier(‘haarcascade_eye.xml’) Once cascade is loaded in OpenCV, we can call the detector function. results = face_detector.detectMultiScale(gray_img, scaleFactor=1.05,minNeighbors=5,minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
results It lists coordinates (x, y, w,h) of bounding boxes around the detected object.
Hit Run to see the output
scaleFactor– This tells how much the object’s size is reduced in each image.
minNeighbors– This parameter tells how many neighbours each rectangle candidate should consider.
minSize— This signifies the minimum possible size of an object to be detected. An object smaller than minSize would be ignored.
Note : For detection, we must pass a
minNeighbors. Other parameters are optional.
Simple Detection of the Human Face
This is the first example of object detection using a haar cascade, where we will detect human faces from a picture using a pre-trained haar cascade.
Before starting, first, download the pre-trained haar cascade file for frontal face detection using this link.
import numpy as np import cv2 #---loading haarcascade detector---face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #---Loading the image----- img = cv2.imread('team_india.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()
facesIt contains the coordinates of bounding boxes around detected faces.
detectMultiScaleThis method only accepts grayscale pictures.
cv2.rectangleThis method draws rectangles (bounding boxes around the detected face).
scaleFactor = 1.3We can try a number between 1 and 2 and later fine-tune it.
Haar cascade can detect multiple objects within a single frame in a hierarchical manner.
Imagine we have to detect the faces and eyes of humans. To proceed with this problem, we need to follow the steps:
- Detect Human faces
- For every face, crop faces and pass it for eye detection
- after getting the coordinates of the eyes (
ex,ey,ew,eh) draw bounding boxes for the eyes on the original picture
- draw bounding box for faces using coordinates(
x,y,w,h) on the original picture.
import numpy as np import cv2 face_detector=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_detector = cv2.CascadeClassifier('haarcascade_eye.xml') img = cv2.imread('.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] #-----roi_gray is the cropped detected face in grayscale # --- roi_color is the cropped detected face in color eyes = eye_detector.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()
roi_gray: region of interest(cropped face) in grayscale
roi_color: region of interest(cut face) in colour
Object Detection in Real-time
So far, we have worked on a single image. The haar-cascade algorithm is light and works in real-time with a perfect frame per second.
We will be using OpenCV video cam feed input to take images in real-time (video).
import cv2 face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_dectector = cv2.CascadeClassifier('haarcascade_eye.xml') # reading the input image now cap = cv2.VideoCapture(0) while cap.isOpened(): _, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(gray,1.1, 4 ) for (x,y, w, h) in faces: cv2.rectangle(frame, pt1 = (x,y),pt2 = (x+w, y+h), color = (255,0,0),thickness = 3) roi_gray = gray[y:y+h,x:x+w] roi_color = frame[y:y+h, x:x+w] eyes = eye_dectector.detectMultiScale(roi_gray) for (ex,ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh), (0,255,0), 5) cv2.imshow("window", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break frame.release()
This output the face and eyes detection in real-time.
Limitation of Haar Cascade
We have seen haar cascade performing very well, but there are several limitations of haar cascade.
- High false-positive detection
- Less accurate than deep learning-based techniques
- Manual tuning of parameters.
- Training haar cascade on a custom object is not easy.
In this article, we have discussed the working of haar cascade and how to implement haar cascade for object detection using OpenCV in python. We downloaded a pre-trained haar cascade file for frontal face detection and eyes detection and detected faces and eyes successfully in a single video camera feed.
We also discussed the limitation of the haar cascade algorithm still widely used when we can tolerate some false-positive detection.
- Manual tuning of the haar cascade detection parameter can solve the problem of false-positive detection.
- Using other object detection algorithm like YOLO, SSD promise better accuracy with good FPS.
- Training a haar cascade for a custom object is not very efficient.
The following article will discuss object detection using deep learning algorithms.
Frequently Asked Questions
A. The Haar cascade algorithm is an ML object detection method using Haar-like features. CNN is a deep learning approach for image analysis and recognition tasks.
A. Haar Cascade training involves creating a classifier to detect specific features by applying filters on image windows and adjusting weights during iterations to minimize errors.
A. Cascade algorithms, like the Haar cascade, provide efficient object detection by sequentially applying multiple stages of classifiers, quickly rejecting non-object regions and saving computation.
A. A cascade algorithm is a multi-stage approach where each stage consists of a classifier. Examples include the Haar cascade for face detection and the Viola-Jones algorithm.
The media shown in this article is not owned by Analytics Vidhya and is used at the Author’s discretion.