面部口罩识别检测

面部口罩识别检测@人脸识别

项目介绍

项目背景:随着新冠疫情的爆发,公共卫生防护程度被提高到空前状态。为防止新冠病毒的交叉传染,导致疫情扩散,人们在各大公共场所活动时均被要求佩戴口罩。因此,面部口罩检测项目诞生。

项目前景:随着公共卫生防护程度的逐步提升,且佩戴口罩成为出入各大公共场所的前提,面部口罩检测成为各大公共场所管理的必备操作。而随着智能化、自动化进程的加快,口罩面部检测已逐步从人工向机器转移。

项目价值:提高公共卫生防护能力;节约社会资源和运营成本;降低人力资源成本。

使用场景:公交车、地铁站、超市、学校等各大公共场所。

……

·假正经·

新冠疫情在中国爆发,百度某团队率先开源口罩人脸检测及分类模型,(极大地体现了百度这家公司的社会责任感),随即一维弦防疫巡检机器人部署清华李文正馆,为学生开学保驾护航……

……

用马校长的话讲,“我对任何事情都感到好奇,想踹开门,迈开步,进去看看到底是怎么一回事”。

出于好奇,加之某些机会(空闲+偶遇),在家写了一个简易的面部口罩检测程序,即“50行代码实现面部口罩检测”。

看上去好像NB的样子,实则是百度太良心、程序太简易……

思路其实很简单:

面部口罩识别检测_第1张图片
获取图像和人脸识别主要使用强大的opencv库,而口罩检测则使用主角库:paddlehub。

(没看见人,所以得喊你)

面部口罩识别检测_第2张图片

(输出为MASK,意为佩戴了口罩)
面部口罩识别检测_第3张图片

·下面进入快乐代码时间 ·

以下代码主要实现前两者,即获取图像和人脸识别:

import cv2
face_cascade = cv2.CascadeClassifier("D:\\mask\\haarcascade_frontalface_default.xml")
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)

while True:
   ret, frame = cap.read()
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   faces = face_cascade.detectMultiScale(gray, 1.1, 5)
   if len(faces) > 0:
       for faceRect in faces:
           x, y, w, h = faceRect
           cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
           roi_gray = gray[y:y + h // 2, x:x + w]
           roi_color = frame[y:y + h // 2, x:x + w]
   cv2.imshow('frame', frame)  # 展现
   file_name = "D:/mask/mask_test.png"  # 图片存储路径
   cv2.imwrite(file_name, frame)  # 写入获取的一帧
   if cv2.waitKey(1) & 0xFF == ord('q'):
       break

cap.release() # 释放摄像头
cv2.destroyAllWindows()

通过opencv调取内置摄像头以获取图像,并对图像进行人脸识别检测,将获取的图片保存在本地以便后面进行口罩检测。

以下代码主要实现面部的口罩检测识别:

import paddlehub as hub
import cv2
module = hub.Module(name=”pyramidbox_lite_mobile_mask”) #口罩检测模型
test_img_path = “C:\Users\Dell\Pictures\3.png”# 读取本地图片
input_dict = {“data”: [cv2.imread(test_img_path)]}
results = module.face_detection(data=input_dict)
print(results)

通过导入面部口罩检测模型,读取本地图片并对其进行分析检测,从而得到是否佩戴口罩的结果。

简单的整合一下,就形成了项目完整的50行代码:

-- coding:utf-8 --
@Time : 22:53
@Author: Thomas
@File :mask.py
@Software : PyCharm

import paddlehub as hub
import cv2
from playsound import playsound

module = hub.Module(name=”pyramidbox_lite_mobile_mask”) #口罩检测模型
face_cascade = cv2.CascadeClassifier(“D:/mask/haarcascade_frontalface_default.xml”) #人脸识别分类器
capture = cv2.VideoCapture(0,cv2.CAP_DSHOW) #初始化摄像头

while(True):

    # 获取一帧
    ret, frame = capture.read()     #以帧换视频流
    #灰度转换
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.1, 5)

    if len(faces) > 0:

        for faceRect in faces:
            x, y, w, h = faceRect
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
            roi_gray = gray[y:y + h // 2, x:x + w]
            roi_color = frame[y:y + h // 2, x:x + w]

    #口罩检测模型
    cv2.imshow('frame', frame)      #展现
    file_name="D:/mask/mask_test.png"       #图片存储路径
    cv2.imwrite(file_name, frame)       #写入获取的一帧
    input_dict = {"data": [cv2.imread(file_name)]}
    results = module.face_detection(data=input_dict)
    #判断是否检测到人脸和是否戴口罩
    mask = results[0]["data"]
    if len(mask) == 0:

        print("未检测到人脸!请将脸移入摄像头视角范围内!")
    else:
        mask_test = mask[0]['label']
        if mask_test == "NO MASK":
            playsound('D:\\mask\\11750.wav')  # 若检测到未戴口罩则发出警报
            print(mask_test)
        else:
            print(mask_test)

    cv2.imwrite(file_name,frame)

    if cv2.waitKey(3) & 0xff == 27:
        print("退出程序!谢谢使用!")
        capture.release()           #释放摄像头q
        cv2.destroyAllWindows()         #删除建立的全部窗口
        break

准确率

官方介绍的准确率为:口罩人脸检测部分在准确度上达到了 98%,且口罩人脸分类部分准确率同样达到了 96.5%。

Github地址

项目的GitHub地址https://github.com/1614866360/mask_test

你可能感兴趣的:(opencv,图像识别,人脸识别)