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实现人脸自动戴口罩系统,实现步骤包括人脸检测、口罩分类以及自动戴口罩。通过这个系统的实现,可以达到人工提醒人们戴口罩相同的效果。