戴口罩情境下的人脸识别demo

@[TOC]戴口罩情境下的人脸识别项目
提示:如有问题请在评论区或者私聊我均可,希望共同交流;
这个戴口罩的人脸识别项目是人脸识别部分用的s—算法,目前正在准备用CNN来进行识别,等到CNN模型搭好后,在进行博客展示 。
文章目录总结与结果展示
前言
疫情爆发以来,戴口罩成为基本的防范新冠病毒的行为;在进出火车站等公共场所时,需要进行对应的人脸识别进站、出站 。前几年的人脸识别技术已相对成熟,但在口罩遮挡下的人脸识别技术在疫情的背景下油然而生,之前的技术需要进行新的情境调整 。本人就所做的《不完整的图像检索研究》方向,进行细致化的展示,就“戴口罩的人脸识别”进行研究 。本博客主要讲述一下大致思路,具体源码的获取联系方式我将放在评论区,有需要的Q我 。
一、什么是人脸识别?
1、深度学习下的人脸识别
人脸识别,通俗来讲,就是由摄像机等外接设备将图像输入到终端,抠出相对应的人脸区域,之后定位区域内的眼鼻口等特征点,通过仿射变换进行人脸对齐矫正(),将对齐后的人脸图片输入到进行特征提取的神经网络中,得到特征提取,后对比终端数据库中存储的人脸图片信息特征,常规的人脸识别就是通过计算不同图片中的欧氏距离,进行计算,小于一定阈值后说明二者就是同一个人脸,最后输出结果;
二、戴口罩情境下的人脸识别demo拆解 1.目标检测
综述:作为学生阶段,最常用的人脸目标检测,主要是和dlib,这两个开源框架进行人脸检测效果还是很不错的;同时,通过网上查询资料,还有一种mtcnn(Multi-Task)目标检测,然后利用进行人脸识别的方法 。基于本项目最大的难点就是如何对有遮挡物的部分人脸也能进行精准检测;以为一类的开源库,进行人脸识别的模型主要是已经训练好的Haar特征模型(ac .xml)来检测人脸,当带上口罩时,该模型也就失效了,所以我们要自己重新训练一个新的模型,来对有遮挡物的人脸进行检测;
1、基于进行二分类模型的训练过程
分述:
(1)采用正样本与负样本进行二分类,正样本图片(戴口罩的人脸图片)采用统一大小的图片,因为获得图片中可能会有胳膊、肩膀等身体部位,对于训练时可能会产生更多的噪音,所以要使用代码进行正样本的图片人脸区域裁剪;同时获取的图片读入之后是BGR空间格式,所以直接进行进行格式灰度化处理;
(2)负样本只需进行图片的灰度化处理即可,不需进行额外的噪声处理,各种各样的负样本会使得训练出的模型对于正样本的检测更加精确;
(3)正样本数量:负样本数量 = 1:3

戴口罩情境下的人脸识别demo

文章插图
2、基于MTCNN进行戴口罩人脸检测模型的训练过程
分述:MTCNN,顾名思义是多任务卷积神经网络,该网络模型,主要通过三个级联网络进行人脸框定,P-net、R-net、O-net;关于mtcnn的模型训练,输入的图片全部都是正样本(戴口罩的照片),未采用负样本的模型输入;
(1)构建P-net代码如下:
# -----------------------------##粗略获取人脸框#输出bbox位置和是否有人脸# -----------------------------#def create_Pnet(weight_path):# h,winput = Input(shape=[None, None, 3])# h,w,3 -> h/2,w/2,10x = Conv2D(10, (3, 3), strides=1, padding='valid', name='conv1')(input)x = PReLU(shared_axes=[1, 2], name='PReLU1')(x)x = MaxPool2D(pool_size=2)(x)# h/2,w/2,10 -> h/2,w/2,16x = Conv2D(16, (3, 3), strides=1, padding='valid', name='conv2')(x)x = PReLU(shared_axes=[1, 2], name='PReLU2')(x)# h/2,w/2,32x = Conv2D(32, (3, 3), strides=1, padding='valid', name='conv3')(x)x = PReLU(shared_axes=[1, 2], name='PReLU3')(x)# h/2, w/2, 2classifier = Conv2D(2, (1, 1), activation='softmax', name='conv4-1')(x)# 无激活函数,线性 。# h/2, w/2, 4bbox_regress = Conv2D(4, (1, 1), name='conv4-2')(x)model = Model([input], [classifier, bbox_regress])model.load_weights(weight_path, by_name=True)return model