Face Mask Detection System using Artificial Intelligence

Jerry John
Analytics Vidhya
Published in
5 min readJul 29, 2020

First part of this article “face detection model creation”

Reference from https://www.pyimagesearch.com/faqs/single-faq/how-do-i-reference-or-cite-one-of-your-blog-posts-books-or-courses

1. Introduction

As confirmed cases of COVID-19 continue to rise, the use of facial mask has become one of the most important and safe measure every one should take this days. Wearing a face mask will help prevent the spread of virus to a large extent .

Very soon the mask will become a part of our daily life. Public places, offices etc. will make mask mandatory. It is very difficult to manually check each person who is entering to a public place or office is wearing a mask or not.To solve this problem we are creating a Machine Learning model that can detect whether a person is wearing a or not.

This project can be integrated with embedded systems for application in schools,airports, railway stations, offices and public places to ensure that public safety guidelines are followed.

Here we are looking how can we implement this model on our system using the web cam.

2. Importing necessary packages

We are using the mask detection model we create in the previous article to detect the mask. We are also using some pre build models to identify the faces (Face detection models). For camera operations we use OpenCV

# import the necessary packages
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
from imutils.video import VideoStream
import numpy as np
import imutils
import time
import cv2
import os

3. Mask detection program

Given below code is a function that takes three parameters one is the frame taken from the video source and the other two is our two models(one for the facial identification and second for the mask identification).

This function gives back two values, one is the coordinates of the rectangle where the face is located and the second one is the prediction, which contain the accuracy of the person wearing the mask.

def detect_and_predict_mask(frame, faceNet, maskNet):
# grab the dimensions of the frame and then construct a blob
# from it
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(frame, 1.0, (224, 224),
(104.0, 177.0, 123.0))
# pass the blob through the network and obtain the face detections
faceNet.setInput(blob)
detections = faceNet.forward()
print(detections.shape)
# initialize our list of faces, their corresponding locations,
# and the list of predictions from our face mask network
faces = []
locs = []
preds = []
# loop over the detections
for i in range(0, detections.shape[2]):
# extract the confidence (i.e., probability) associated with
# the detection
confidence = detections[0, 0, i, 2]
# filter out weak detections by ensuring the confidence is
# greater than the minimum confidence
if confidence > 0.5:
# compute the (x, y)-coordinates of the bounding box for
# the object
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# ensure the bounding boxes fall within the dimensions of
# the frame
(startX, startY) = (max(0, startX), max(0, startY))
(endX, endY) = (min(w - 1, endX), min(h - 1, endY))
# extract the face ROI, convert it from BGR to RGB channel
# ordering, resize it to 224x224, and preprocess it
face = frame[startY:endY, startX:endX]
face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
face = cv2.resize(face, (224, 224))
face = img_to_array(face)
face = preprocess_input(face)
# add the face and bounding boxes to their respective
# lists
faces.append(face)
locs.append((startX, startY, endX, endY))
# only make a predictions if at least one face was detected
if len(faces) > 0:
# for faster inference we'll make batch predictions on *all*
# faces at the same time rather than one-by-one predictions
# in the above `for` loop
faces = np.array(faces, dtype="float32")
preds = maskNet.predict(faces, batch_size=32)
# return a 2-tuple of the face locations and their corresponding
# locations
return (locs, preds)

Here we are loading our face detector models from the disk along with the mask detector model we created on the previous article.

dnn stands for deep neural netwrok.

# load our serialized face detector model from disk
prototxtPath = r"face_detector\deploy.prototxt"
weightsPath = r"face_detector\res10_300x300_ssd_iter_140000.caffemodel"
faceNet = cv2.dnn.readNet(prototxtPath, weightsPath)
# load the face mask detector model from disk
maskNet = load_model("mask_detector.model")

Now we are starting the video stream, for that we use ‘VideoStrem’. src=0 means the primary camera we use(for laptops its inbuilt we cam).

In the video we are taking each frame, and each frame is consider as images, our face and mask detection models are run on this images.

A rectangle box is displayed around the face which is detected. Its color will be red when the face is not having a mask and in green color when the face is having a mask. The prediction percentage is displayed on the top of the box.

Here we are setting the ‘q’ key to stop the program.

# initialize the video stream
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
# loop over the frames from the video stream
while True:
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()
frame = imutils.resize(frame, width=400)
# detect faces in the frame and determine if they are wearing a
# face mask or not
(locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
# loop over the detected face locations and their corresponding
# locations
for (box, pred) in zip(locs, preds):
# unpack the bounding box and predictions
(startX, startY, endX, endY) = box
(mask, withoutMask) = pred
# determine the class label and color we'll use to draw
# the bounding box and text
label = "Mask" if mask > withoutMask else "No Mask"
color = (0, 255, 0) if label == "Mask" else (0, 0, 255)
# include the probability in the label
label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)
# display the label and bounding box rectangle on the output
# frame
cv2.putText(frame, label, (startX, startY - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)
# show the output frame
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# if the `q` key was pressed, break from the loop
if key == ord("q"):
break
# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()
without mask
with mask

4. Conclusion

In this article we learned how to build a face mask detection model. Now we can use this model in a real time application. Here we are implementing this model in our web cam using OpenCV, This project can be integrated with embedded systems for application in schools,airports, railway stations, offices and public places to ensure that public safety guidelines are followed.

As NO one is perfect, if anyone find any errors or suggestion please feel free to comment below.

Email Id : jerryjohn1995@gmail.com

Instagram : https://www.instagram.com/jerry_john_7/?hl=en

Linkedin : linkedin.com/in/jerryjohn1995

Face Book : https://www.facebook.com/jerry.john.583234/

--

--