【深度学习】人脸识别和口罩检测的应用
【深度学习】人脸识别和口罩检测的应用
文章目录
1 概述
2 人脸识别模型搭建与训练
3 口罩检测
3.1 数据来源
3.2 YoloV4简介
3.3 数据集处理
3.4 开始训练
3.5 测试
1 概述
1、数据集说明:这里用到数据集来自于百度AI Studio平台的公共数据集,属于实验数据集,数据集本身较小因而会影响深度网络最终训练的准确率。数据集链接:[https://aistudio.baidu.com/aistudio/datasetdetail/8325]:
2、使用说明:数据集解压缩后有四类标注图像,此次只使用其中两类做一个简单的二分类,如有其他分类需求可自行修改相关的训练代码,本人在此使用“jiangwen”和“zhangziyi”的分类。
(需要说明的是,我这里的face数据集文件夹放在项目文件夹下,项目文件夹是cascadeFace)
实现思路:使用OpenCV中提供的Haar级联分类器进行面部检测,扣取Haar分类器检测到的面部图像,到已经训练好的AlexNet卷积模型中获取识别结果(当然我们将自己构建AlexNet并训练它)。关于Haar的使用,我将在后面的测试代码部分讲解;关于Haar的理论知识请参考[https://www.cnblogs.com/zyly/p/9410563.html];
2 人脸识别模型搭建与训练
模型结构介绍
说明:这个结构参考图很好的展示了AlexNet网络模型,AlexNet虽然如今已经是相对简单基础的卷积模型,但其参数量依然庞大,用作分类任务时其全连接层的百万级参数量成为训练网络的负担,我们使用Dropout对半丢弃结点。还有一点需要说的就是我们的这次实验在输入数据的尺寸与上网络结构图所显示的不太一样,具体的情况请阅读接下来所展示的模型搭建与训练代码。
模型参数表
(alexnet)
Layer (type) Output Shape Param #
conv2d_31 (Conv2D) (None, 55, 55, 96) 28896
_________________________________________________________________
activation_47 (Activation) (None, 55, 55, 96) 0
_________________________________________________________________
max_pooling2d_19 (MaxPooling (None, 27, 27, 96) 0
_________________________________________________________________
conv2d_32 (Conv2D) (None, 27, 27, 256) 614656
_________________________________________________________________
activation_48 (Activation) (None, 27, 27, 256) 0
_________________________________________________________________
max_pooling2d_20(MaxPooling) (None, 13, 13, 256) 0
_________________________________________________________________
conv2d_33 (Conv2D) (None, 13, 13, 384) 885120
_________________________________________________________________
activation_49 (Activation) (None, 13, 13, 384) 0
_________________________________________________________________
conv2d_34 (Conv2D) (None, 13, 13, 384) 1327488
_________________________________________________________________
activation_50 (Activation) (None, 13, 13, 384) 0
_________________________________________________________________
conv2d_35 (Conv2D) (None, 13, 13, 256) 884992
_________________________________________________________________
activation_51 (Activation) (None, 13, 13, 256) 0
_________________________________________________________________
max_pooling2d_21(MaxPooling) (None, 6, 6, 256) 0
_________________________________________________________________
flatten_5 (Flatten) (None, 9216) 0
_________________________________________________________________
dense_17 (Dense) (None, 4096) 37752832
_________________________________________________________________
activation_52 (Activation) (None, 4096) 0
_________________________________________________________________
dropout_15 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_18 (Dense) (None, 4096) 16781312
_________________________________________________________________
activation_53 (Activation) (None, 4096) 0
_________________________________________________________________
dropout_16 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_19 (Dense) (None, 2) 8194
训练结果
import cv2
from 人脸检测与识别 import CNNModel # 引入训练代码中的模型对象
if __name__ == '__main__':
# 加载模型
model = CNNModel()
model.load_model(file_path='./cascadeface.model.h5')
# 人脸识别矩形框
color = (0, 255, 0)
# 人脸识别分类器路径
cascade_path = './haarcascade_frontalface_default.xml'
image = cv2.imread('jiangwen.jpg')
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 读入分类器
cascade = cv2.CascadeClassifier(cascade_path)
# 利用分类器识别人脸区域
faceRects = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=5, minSize=(32, 32))
if len(faceRects) > 0:
for faceRect in faceRects:
x, y, w, h = faceRect
# 截取图像脸部提交给识别模型识别
img = image[y-10: y + h + 10, x-10: x + w + 10]
faceID = model.face_predict(image)
if faceID == 0:
cv2.rectangle(image, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
cv2.putText(image,
'jiangwen',
(x + 30, y + 30), # 坐标
cv2.FONT_HERSHEY_SIMPLEX, # 字体
1, # 字号
(0, 0, 255), # 颜色
1) # 字的线宽
elif faceID == 1:
cv2.rectangle(image, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
cv2.putText(image,
'zhangziyi',
(x + 30, y + 30),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(0, 0, 255),
1)
else:
pass
cv2.imshow('image', image)
cv2.waitKey(0)
3 口罩检测
3.1 数据来源
AIZOO 数据集:https://github.com/AIZOOTech/FaceMaskDetection
RMFD 数据集 https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset
自定义数据集:爬虫收集类似手捂脸等挡住脸的图片,并进行标注。
3.2 YoloV4简介
输入端:Mosaic 数据增强,cmBN,SAT 自对抗训练。
Mosaic 数据增强
Mosaic 采用 4 张图片,以 随机缩放、随机裁剪、随机排布 的方式进行拼接。
丰富了数据集:随机使用 4 张图片,随机缩放(增加了很多小目标),随机分布进行拼接。
减少 GPU:一个 GPU 就可以达到比较好的效果。
3.3 数据集处理
对数据集进行清洗筛选后,共有 110200张图片:AIZOO 数据集(8000 张),RMFD 数据集( 3000 张),自定义数据集(200张)。
使用 labelImg 工具对所有图片进行标注(mask 和 nomask),生成xml文件。
编译:
使用 Git 获取代码
git clone https://github.com/AlexeyAB/darknet.git
cd darknet
打开Powershell终端并启动
.\build.ps1
3.4 开始训练
darknet.exe detector train data/mask.data cfg/yolo-mask.cfg yolov4.conv.137
如需查看训练效果可以使用 mAP 计算进行训练。
darknet.exe detector train data/mask.data cfg/yolo-mask.cfg yolov4.conv.137 -map
迭代大概了4000步的效果图,mAP已经达到了91%(单个CPU:NVIDIA GeForce GTX 1050 Ti,训练了快24个小时)。
3.5 测试
能够正确识别有无佩戴口罩。
- 分享
- 举报
-
浏览量:6000次2021-07-28 14:21:28
-
浏览量:49943次2021-07-28 14:21:08
-
浏览量:229次2023-08-03 15:44:04
-
浏览量:1813次2022-12-16 09:12:30
-
浏览量:123次2023-08-23 08:46:26
-
浏览量:1652次2022-12-17 11:50:11
-
浏览量:1465次2023-02-14 14:48:11
-
浏览量:1868次2022-12-16 16:27:02
-
浏览量:157次2023-08-30 15:28:02
-
浏览量:7143次2021-07-12 11:03:00
-
浏览量:891次2024-03-14 17:53:46
-
浏览量:6820次2021-06-24 10:38:30
-
浏览量:8816次2021-07-12 11:01:47
-
浏览量:11606次2021-05-04 20:20:07
-
浏览量:4918次2021-08-05 09:21:07
-
浏览量:5045次2021-08-05 09:20:49
-
浏览量:872次2023-06-02 17:41:27
-
浏览量:179次2023-08-23 10:15:21
-
浏览量:285次2023-08-02 20:35:16
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
这把我C
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明