网站首页 > 教程文章 正文
史上最简单的口罩检测与识别
今天我们来研究下卷积神经网络识别口罩
思路:
基于人脸检测器的口罩检测,我们是用深度网络+人脸检测的方案
口罩检测首先我们要做人脸检测,检测到人脸后再检测是否戴口罩,此问题分解成两个部分:
- 人脸检测器
- 口罩二分类问题
人脸检测我们从简单的出发,使用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()
演示如下:
学习更多深度学习知识,关注我持续更新中。
猜你喜欢
- 2025-04-30 C#WinForm调用Yolov8Net实现自动识别
- 2025-04-30 探索Python中的人脸识别:深入pyfacelib库
- 2025-04-30 Pytorch利用CNN卷积神经网络进行多数字(0-9)识别
- 2025-04-30 【AI&ML】如何使用Google Colaboratory进行视频处理
- 2025-04-30 自动识别影视场景中的演员(自动识别电影)
- 2025-04-30 Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 2025-04-30 使用Python和YOLO检测车牌(python判断车牌号归属地)
- 2025-04-30 用python给图片批量打水印(python批量去水印)
- 2025-04-30 简单易懂的人脸识别!用PythonOpenCV实现(适合初学者)!附源码
- 2025-04-30 在 C# WinForms 中 OpenCvSharp 进行边缘检测:Laplacian 算子介绍
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)