导读
本文主要介绍如何使用OpenCV和PaddleHub实现一个实时人脸口罩检测系统。(公众号:OpenCV与AI深度学习)
背景介绍
从19年疫情爆发到现在,佩戴口罩对大家来说已是常态。应运而生的就有了很多相关应用,如病毒发展预测、口罩佩戴检测以及戴口罩的人脸识别等。
今天介绍的人脸口罩佩戴检测系统主要使用OpenCV和百度飞浆(PaddlePaddle)的PaddleHub提供的检测模型。PaddleHub提供了很多实用的模型,包括图像处理、文字处理、音频处理、视频处理和工业应用等。github地址:https://github.com/PaddlePaddle/PaddleHub
人脸口罩检测
人脸检测部分的模型如下:
红框内的两个模型支持人脸口罩检测,这里选择pyramidbox_lite_server_mask,实现详细步骤:
【1】安装PaddlePaddle、PaddleHub和OpenCV(opencv-python)
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host https://pypi.tuna.tsinghua.edu.cn
pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host https://pypi.tuna.tsinghua.edu.cn
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host https://pypi.tuna.tsinghua.edu.cn
本文使用的版本:
PaddlePaddle---2.3.0
PaddleHun---2.2.0
opencv-python---4.6.0.66
注意:安装PaddlePaddle可能会遇到一些问题,导致import paddle失败,大家根据报错信息搜索解决方法即可。
【2】图片人脸口罩检测
准备待测图,运行下面代码,修改图片路径即可:
-
import paddlehub
as hub
-
import cv2
-
-
mask_detector = hub.Module(name=
"pyramidbox_lite_server_mask")
-
img_path =
'./imgs/A0.png'
-
img = cv2.imread(img_path)
-
-
input_dict = {
"data": [img]}
-
result = mask_detector.face_detection(data=input_dict)
-
-
count =
len(result[
0][
'data'])
-
if count <
1:
-
print(
'There is no face detected!')
-
else:
-
for i
in
range(
0,count):
-
-
#print(result[0]['data'][i])
-
label = result[
0][
'data'][i].get(
'label')
-
score =
float(result[
0][
'data'][i].get(
'confidence'))
-
x1 =
int(result[
0][
'data'][i].get(
'left'))
-
y1 =
int(result[
0][
'data'][i].get(
'top'))
-
x2 =
int(result[
0][
'data'][i].get(
'right'))
-
y2 =
int(result[
0][
'data'][i].get(
'bottom'))
-
cv2.rectangle(img,(x1,y1),(x2,y2),(
255,
200,
0),
2)
-
if label ==
'NO MASK':
-
cv2.putText(img,label,(x1,y1),
0,
0.8,(
0,
0,
255),
2)
-
else:
-
cv2.putText(img,label,(x1,y1),
0,
0.8,(
0,
255,
0),
2)
-
-
cv2.imwrite(
'result.jpg',img)
-
cv2.imshow(
'mask-detection', img)
-
cv2.waitKey()
-
cv2.destroyAllWindows()
-
print(
'Done!')
代码开始第一次会先下载对应的模型到如下位置:
C:\Users\xxx\.paddlehub\modules,以后不用再下载
测试图1:
运行结果:
测试图2:
运行结果:
测试图3:
运行结果:
测试图4:
运行结果:
从上面测试结果来看,效果还不错!
【3】视频或摄像头实时人脸口罩检测
准备测试视频或直接打开摄像头检测,选择对应的代码即可:
cap = cv2.VideoCapture('2.mp4') #视频文件检测
# cap = cv2.VideoCapture(0) #摄像头检测
完整代码:
-
-
import paddlehub
as hub
-
import cv2
-
-
mask_detector = hub.Module(name=
"pyramidbox_lite_server_mask")
-
-
def
mask_detecion(
img):
-
input_dict = {
"data": [img]}
-
result = mask_detector.face_detection(data=input_dict)
-
count =
len(result[
0][
'data'])
-
if count <
1:
-
#print('There is no face detected!')
-
pass
-
else:
-
for i
in
range(
0,count):
-
#print(result[0]['data'][i])
-
label = result[
0][
'data'][i].get(
'label')
-
score =
float(result[
0][
'data'][i].get(
'confidence'))
-
x1 =
int(result[
0][
'data'][i].get(
'left'))
-
y1 =
int(result[
0][
'data'][i].get(
'top'))
-
x2 =
int(result[
0][
'data'][i].get(
'right'))
-
y2 =
int(result[
0][
'data'][i].get(
'bottom'))
-
cv2.rectangle(img,(x1,y1),(x2,y2),(
255,
200,
0),
2)
-
if label ==
'NO MASK':
-
cv2.putText(img,label,(x1,y1),
0,
0.8,(
0,
0,
255),
2)
-
else:
-
cv2.putText(img,label,(x1,y1),
0,
0.8,(
0,
255,
0),
2)
-
return img
-
-
-
if __name__ ==
'__main__':
-
cap = cv2.VideoCapture(
'2.mp4')
#视频文件检测
-
#cap = cv2.VideoCapture(0) #摄像头检测
-
if(cap.isOpened()):
#视频打开成功
-
while(
True):
-
ret,frame = cap.read()
#读取一帧
-
result = mask_detecion(frame)
-
cv2.imshow(
'mask_detection',result)
-
if cv2.waitKey(
1)&
0xFF ==
27:
#按下Esc键退出
-
break
-
else:
-
print (
'open video/camera failed!')
-
cap.release()
-
cv2.destroyAllWindows()
测试结果:
下载1:Pytoch常用函数手册
在「OpenCV与AI深度」号后台回复:Pytorch函数手册,能够学习下载全网第一份Pytorch函数常用手册,包括Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多处理等十四章内容。
下载2:145个OpenCV实例应用代码
在「OpenCV与AI深入」公众号后台回复:OpenCV145,能够学习下载145个OpenCV实例应用代码(Python和C++双语言实现)。
转载:https://blog.csdn.net/stq054188/article/details/125438445