Mask and Social Distancing Detector: Part 1
Discipline is an immense issue with the majority of the Indian population. People are not willing to maintain social distancing or wear a mask while they are out. Most of us are careless about our mask hygiene leading to a deadly outbreak of the coronavirus in India killing lakhs.
Another issue is the police brutality in India and insensitivity among powerful people. Every day we read about a poor man beaten or even killed by police for not wearing a mask. In India, there is hardly a middle ground. So I was wondering if we can leave it to the machines to identify and punish the people for breaking the corona rules.
We will design an algorithm to identify
- If the group is maintaining a safe distance.
- if the people in a photo are wearing a mask or not.
Face Detection
We can start with designing a face detector. let’s import all the required libraries. Some of these libraries will be used later on, so don’t be bothered.
import seaborn as sns
import os
from sklearn.utils import shuffle
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
import cv2
from scipy.spatial import distance
We don’t have to write and train a Haar classifier since it is already trained. Download the Haar cascade XML files from here. We will use an already trained classifier frontal face classifier. We have pre-trained classifiers for all features but we only need a face detector for now.
face_model = cv2.CascadeClassifier('mask/haarcascade_frontalface_default.xml')
img = cv2.imread('images/GOPR1592.JPG')
img = cv2.cvtColor(img, cv2.IMREAD_GRAYSCALE)
faces = face_model.detectMultiScale(img,scaleFactor=1.2, minNeighbors=2, minSize=(100, 50))
img_2 = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)for (x,y,w,h) in faces:
cv2.rectangle(img_2,(x,y),(x+w,y+h),(250,0,0),40)
plt.figure(figsize=(12,12))
plt.imshow(img_2)
We can see rectangles marked around the faces for face detection. Let’s read through the code and understand the terms mentioned
1. Haar Classifier
It is an object detection algorithm that can be used to detect faces by locating the edges and pixel color differences between features. For example, your eyes will be darker than their adjacent features and so will be your nose, lips, and eyebrows.
For a comprehensive understanding, you can read from here.
2. Detect Multiscale
This function is used to detect the faces. This function will return a rectangle with coordinates(x,y,w,h) around the detected face. The faces variable has the rectangle coordinates which will be drawn around the detected faces. Different parameters this function takes is
It takes 3 common arguments
- Image
- Scale factor: specifies how much the image size is reduced with each scale
- min neighbors: specifies how many neighbors each candidate rectangle should have to retain it
Social DIstancing Detector
Now that our faces are detected, We will now detect if the social distancing is maintained or not.
MIN_DISTANCE = 1000if len(faces)>=2:
label = [0 for i in range (len(faces))]
for i in range(len(faces)-1):
for j in range(i+1, len(faces)):
dist = distance.euclidean(faces[i][:2], faces[j][:2])
if dist<MIN_DISTANCE:
label[i] = 1
label[j] = 1
new_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
for i in range(len(faces)):
(x,y,w,h)=faces[i]
if label[i]==1:
cv2.rectangle(new_img,(x,y), (x+w, y+h),(255,0,0),10)#if distance<MIN_DISTANCE then red box showing social distancing not maintained
else:
cv2.rectangle(new_img,(x,y),(x+w,y+h),(0,255,0),15)#else green box showing Social distancing maintained
plt.figure(figsize=(10,10))
plt.imshow(new_img)
else:
print("No. of faces detected is less than 2")
The classifier has rightly detected that I'm socially distant while the other two persons are not. My face has a green
rectangle while other two have red rectangles around there face.
Let’s read through the code and understand it.
1. Scipy
we are using the distance function from Scipy library to calculate Euclidean distance between two 1-D arrays
2. Loops
Since we have to calculate the distance between all the faces(3) present in the photo, all the faces need to be compared and the distance calculated. “i” will be having a range of (0,2) while”j” will be having a range of (1,3). Hence while iterating distance for every face will be compared one by one.
For the faces having distance less than accepted social distance, labels will be updated to 1 from zero.
For all the labels will value 1 will be shown having a red rectangle around their faces.
Conclusion
So far we have completed a face and distance detector. We can continue from here in part-2 and design a mask detector.