云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

Ai机器视觉之口罩检测(口罩视觉检测方案)

jxf315 2025-04-30 17:44:40 教程文章 13 ℃

史上最简单的口罩检测与识别

今天我们来研究下卷积神经网络识别口罩

思路:

基于人脸检测器的口罩检测,我们是用深度网络+人脸检测的方案

口罩检测首先我们要做人脸检测,检测到人脸后再检测是否戴口罩,此问题分解成两个部分:

  1. 人脸检测器
  2. 口罩二分类问题

人脸检测我们从简单的出发,使用opencv 自带的Haar检测器。检测出人脸信息后再将脸部信息输入到二分类网络做判断。

Step1 人脸检测器

在之前的文档中我已经写好了人脸检测相关的文档,这里不做说明,详情请查看我的文档机器视觉之人脸检测,这里给出链接
https://www.toutiao.com/i6972156568557224484/

额外说一下需要安装miniconda 构建训练环境,环境主要包含的包括:python3.7~3.8 opencv-python numpy tensorflow keras(本次使用的深度学习框架)

Step2 构建口罩数据

口罩的数据由我在开源的数据集上下载后,经过人脸检测后,输出的人脸识别数据图像,分为两个数据集四个文件夹:

  • 训练数据集
    • Mask文件夹
    • WithoOutMask文件夹
  • 测试数据集
    • Mask文件夹
    • WithoOutMask文件夹

数据截图如下所示

训练数据集中包含644个mask 905个WithoOutMask

需要数据的请留下您的邮箱稍后发送给您,或者私信我吧。

构建数据集的代码请见本人写的文章
https://www.toutiao.com/i6973500504077189663/

这里不再啰嗦了,构建用于训练的数据集 : 1.图像数据集 2.标签数据集 用于测试的数据集 1.图像数据集 2.标签数据集。

Step3 构建口罩检测网络

model.summary()

网络结构输出如下:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d_1 (Conv2D)            (None, 114, 114, 32)      896
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 57, 57, 32)        0
_________________________________________________________________
dropout_1 (Dropout)          (None, 57, 57, 32)        0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 57, 57, 64)        18496
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 28, 28, 64)        0
_________________________________________________________________
dropout_2 (Dropout)          (None, 28, 28, 64)        0
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 28, 28, 128)       73856
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 14, 14, 128)       0
_________________________________________________________________
dropout_3 (Dropout)          (None, 14, 14, 128)       0
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0
_________________________________________________________________
dense_1 (Dense)              (None, 128)               3211392
_________________________________________________________________
dense_2 (Dense)              (None, 64)                8256
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 65
=================================================================
Total params: 3,312,961
Trainable params: 3,312,961
Non-trainable params: 0
_________________________________________________________________

说明:

Conv2D:卷积网络

MaxPooling2 :最大池化层

Dropout:Dropout层防止过拟合

Flatten:扁平化层,去掉维度

Dense:全连接层

根据网络结构组建自己的模型网络吧

关于网络的代码需要的可以收藏转发,点赞过百后更新网络结构代码。

组建好网络后

我们配置优化器和loss函数,训练配置代码如下:

adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss = 'binary_crossentropy', optimizer = adam, metrics = ['accuracy'])
model.fit(train_images,train_labels,validation_data = (validation_images,validation_labels),epochs = epochs,batch_size = 10)
model.save(save_path)

说明:

loss 使用 binary_crossentropy 二元分类交叉熵损失函数

optimizer adam 优化器使用adam优化器

metrics :accuracy 评估标准是绝对误差

model.save:保存模型结构及参数

Step4 训练/检测

dir_path = 'train'#存放训练数据集的两个文件夹的文件夹路径  
train_images,train_labels,validation_images,validation_labels,classes = dataset(dir_path)    
train(train_images,train_labels,validation_images,validation_labels,classes,epochs=20,save_path='./mask.h5')

ok,开始训练:

稍等片刻训练好了,我们来看下识别的代码:

主要流程,->打开摄像头 ->读取图像数据 ->人脸识别 ->口罩检测 >绘制输出。

import numpy as np
import keras
from keras.models import Sequential,load_model
import cv2
import datetime
mymodel=load_model('mask.h5')
cap=cv2.VideoCapture(0)
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
while cap.isOpened():
    _,img=cap.read()
    face=face_cascade.detectMultiScale(img, 1.1, 5)
    for(x,y,w,h) in face:
        face_img = img[y:y+h, x:x+w]
        face_img = cv2.resize(face_img,(114,114))
        face_img = np.expand_dims(face_img,axis=0)
        pred=mymodel.predict(face_img)[0][0]
        if pred>0.5:
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),3)
            cv2.putText(img,'NO MASK',((x+w)//2,y+h+20),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),3)
        else:
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
            cv2.putText(img,'MASK',((x+w)//2,y+h+20),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),3)
        datet=str(datetime.datetime.now())
        cv2.putText(img,datet,(400,450),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,255,255),1)   
    cv2.imshow('img',img)
    if cv2.waitKey(1)==ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

演示如下:


学习更多深度学习知识,关注我持续更新中。

Tags:

最近发表
标签列表