首页 > 技术知识 > 正文

【深度学习】人脸识别和口罩检测的应用

文章目录 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)

【深度学习】人脸识别和口罩检测的应用1

实现思路:使用OpenCV中提供的Haar级联分类器进行面部检测,扣取Haar分类器检测到的面部图像,到已经训练好的AlexNet卷积模型中获取识别结果(当然我们将自己构建AlexNet并训练它)。关于Haar的使用,我将在后面的测试代码部分讲解;关于Haar的理论知识请参考[https://www.cnblogs.com/zyly/p/9410563.html];

2 人脸识别模型搭建与训练

模型结构介绍 【深度学习】人脸识别和口罩检测的应用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
<

训练结果 【深度学习】人脸识别和口罩检测的应用3

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)
<

【深度学习】人脸识别和口罩检测的应用4

3 口罩检测

3.1 数据来源

AIZOO 数据集:https://github.com/AIZOOTech/FaceMaskDetection

RMFD 数据集 https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset

自定义数据集:爬虫收集类似手捂脸等挡住脸的图片,并进行标注。

3.2 YoloV4简介

【深度学习】人脸识别和口罩检测的应用5 输入端:Mosaic 数据增强,cmBN,SAT 自对抗训练。

Mosaic 数据增强

Mosaic 采用 4 张图片,以 随机缩放、随机裁剪、随机排布 的方式进行拼接。 丰富了数据集:随机使用 4 张图片,随机缩放(增加了很多小目标),随机分布进行拼接。 减少 GPU:一个 GPU 就可以达到比较好的效果。

【深度学习】人脸识别和口罩检测的应用6

3.3 数据集处理

对数据集进行清洗筛选后,共有 110200张图片:AIZOO 数据集(8000 张),RMFD 数据集( 3000 张),自定义数据集(200张)。

使用 labelImg 工具对所有图片进行标注(mask 和 nomask),生成xml文件。 【深度学习】人脸识别和口罩检测的应用7

编译: 使用 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 测试

能够正确识别有无佩戴口罩。 【深度学习】人脸识别和口罩检测的应用8

猜你喜欢