基于Python实现人脸自动戴口罩系统

1. 简介

随着新冠病毒的不断爆发,民众对于个人卫生意识的提高也开始成为一种趋势。戴口罩已经成为了疫情期间人们必须要做的一件事情。但是,我们也经常会遇到一些外来人员不戴口罩的情况,这时候需要进行提醒。如果有一种自动识别人脸戴口罩的系统,将会是非常方便的。本文将介绍基于Python实现的人脸自动戴口罩系统。

2. 实现

2.1 准备工作

在介绍如何实现人脸自动戴口罩系统之前,我们需要提前准备一些工作。首先,需要安装相应的Python库和模块。具体的库包括:

opencv-python

tensorflow==2.4.0

numpy

接下来,需要下载预训练的模型文件,包括人脸检测模型和口罩分类模型。这里我们选择下载开源的MaskedFace-Net模型,该模型是一种基于ResNet的深度卷积神经网络,用于识别戴口罩的人脸模型。下载完成后,将对应的文件存储在本地。

2.2 人脸检测

接下来,我们需要使用OpenCV库进行人脸检测,将人脸从图像中提取出来,然后将图像传入预训练的口罩分类模型进行分类。人脸检测通过使用基于Haar特征的级联分类器进行实现,具体的代码实现如下:

import cv2

import numpy as np

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

cap = cv2.VideoCapture(0)

while True:

ret, img = cap.read()

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Detect faces

faces = face_cascade.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)

roi_gray = gray[y:y+h, x:x+w]

roi_color = img[y:y+h, x:x+w]

cv2.imshow('img', img)

k = cv2.waitKey(30) & 0xff

if k == 27:

break

cap.release()

cv2.destroyAllWindows()

上述代码中,我们首先导入OpenCV库,然后加载Haar特征的级联分类器,使用cv2.VideoCapture打开摄像头,进入while循环,在循环中使用cap.read()方法获取视频中的帧,使用cv2.cvtColor()方法将RGB图像转换为灰度图像。接下来,通过在灰度图像上运行级联分类器,检测视频中存在的人脸。将检测到的人脸使用cv2.rectangle()方法进行可视化显示。最后,我们使用cv2.imshow()方法将图像显示在屏幕上。

2.3 口罩分类

我们已经成功的将人脸从图像中提取出来,接下来就是将提取出来的人脸传入预训练的口罩分类模型进行分类。

我们可以通过以下代码来加载预训练模型和进行图像预处理:

from keras.models import load_model

from keras.preprocessing import image

model = load_model('mask_detector.h5')

def predict_mask_status(img):

# Image Preprocessing

img = cv2.resize(img, (224, 224))

img = image.img_to_array(img)

img = np.expand_dims(img, axis=0)

img = img/255

# Prediction

predictions = model.predict(img)

return np.argmax(predictions)

上述代码中,我们先使用Keras库中的load_model()方法从文件中加载预训练模型,接下来对人脸图像进行预处理: 首先将图像的大小重新调整为224x224,之后将图像转换为Numpy数组,并将其扩展为4维数组。最后,将数组像素值从0到255归一化为0到1。将处理后的人脸图像传入MaskedFace-Net模型中,得到人脸图像是否佩戴口罩的结果,其中0表示未佩戴口罩,1表示已佩戴口罩。

2.4 自动戴口罩

最后,我们将上述部分代码组合起来,实现一个可以自动检测戴口罩情况的人脸识别系统,其中检测到未佩戴口罩的人脸时,系统自动添加口罩的效果。

from keras.models import load_model

from keras.preprocessing import image

import cv2

import numpy as np

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

model = load_model('mask_detector.h5')

def predict_mask_status(img):

# Image Preprocessing

img = cv2.resize(img, (224, 224))

img = image.img_to_array(img)

img = np.expand_dims(img, axis=0)

img = img/255

# Prediction

predictions = model.predict(img)

return np.argmax(predictions)

cap = cv2.VideoCapture(0)

while True:

ret, img = cap.read()

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Detect faces

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

for (x, y, w, h) in faces:

roi_gray = gray[y:y+h, x:x+w]

roi_color = img[y:y+h, x:x+w]

mask_status = predict_mask_status(roi_color)

if mask_status==0:

overlay = cv2.imread('mask.png')

overlay = cv2.resize(overlay, (w, h))

img[y:y+h, x:x+w] = overlay

else:

cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow('img', img)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

cap.release()

cv2.destroyAllWindows()

上述代码中,我们在视频显示图像的时候,对检测是否佩戴口罩分组进行拦截,如果检测到未佩戴口罩,就在该人脸区域上添加口罩的效果。具体来说,我们使用cv2.imread()方法加载带有口罩的PNG文件,并将其大小与检测到的人脸区域相同,之后将文件覆盖到原始帧中。

3. 总结

本文介绍了如何基于Python实现人脸自动戴口罩系统,实现步骤包括人脸检测、口罩分类以及自动戴口罩。通过这个系统的实现,可以达到人工提醒人们戴口罩相同的效果。

后端开发标签