赞
踩
1、人脸识别基本过程
2、人脸检测和人脸对齐
3、人脸表征
4、人脸匹配
5、训练参数介绍
6、效果展示
7、源码地址
8、总结
人脸识别的主要过程分为四部分:
(1)、人脸检测
(2)、人脸对齐
(3)、人脸表征
(4)、人脸匹配
以上过程为人脸识别通用的四大步骤,前两个模块:人脸检测和人脸对齐笔者将在这个
项目中使用了一个库函数完成,实则可以去参考一下使用MTCNN算法去完成。这里时间
紧迫,如果后续有时间,会使用MTCNN算法重新改进一次。
通常情况下,我们在日常使用人脸识别模块时候,不能保证每一次人脸都是能够正对着摄像头,这对人脸的检测和如何使用人脸对齐技术则显得十分重要。笔者在使用Tensorflow深度学习框架下成功训练出基于MTCNN算法的人脸检测和人脸对齐模块。当然对于人脸检测的方法不仅局限于MTCNN算法,还有当今非常火爆的目标检测算法--YOLOv5算法,但相比较下,YOLOv5模型偏大,对移动边缘端这种算力不足的设备不能很好的实现实时视频流的效果,固然在本文不进一步讨论YOLOv5算法。
效果展示图
人脸表征是整个人脸识别的较为重要的模块。人脸表征顾名思义,也是对人脸进行特征向量的提取过程。通常的做法是将人脸送入神经网络,进而得到一个特定维数的特征向量(笔者使用的是512维度的特征向量),维数的大小由神经网络决定,提取到的特征向量应该是要可以很好的表征一个的人脸数据。
在整个人脸识别模块中,为了能够部署在小巧轻量的人工智能开发板上,对于神经网络的选择上需要选择轻量化的模型,例如MobileNet、Shufflenet等。该模块中使用得则是Mobilefacenet,一种基于轻量化人脸识别的神经网络。Mobilefacenet正是基于MobileNetV2改进而来,具体的改进有三点:
1、针对平均池化层,采用了可分离卷积代替平均池化层。深度可分离卷积在MobileNet中可谓是熟客了,深度可分离卷积能够在减少输出通道、减少计算参数数量,同时保持算法性能不变。
2、针对人脸识别任务,采用ArcFace/Insightface的损失函数进行训练。
3、针对网络结构,通道扩张倍数变小;使用Prelu代替relu;使用batch Normalization。神经网络结构如下图所示
原论文地址:sv-lncs (arxiv.org)
人脸匹配过程就是通过获取数据库中已保存的人脸特征向量与当前检测到人脸的特征向量进行对比,计算二者的相似度,相似度越高,说明人脸匹配的相关性越强。在计算二者人脸的相似度通常有欧式距离、标准化欧式距离、马氏距离、余弦距离,笔者在项目中使用的是余弦距离,严格来讲余弦距离不是距离,而只是相似性。其他距离直接测量两个高维空间上的点的距离,余弦的结果为在[0,1]之中,如果距离为0则两个点“相同”。在项目中,人脸匹配也设置了一点的阈值做为限制。
在人脸识别的项目上,训练时所使用的数据集为CASIA-Webface,CASIA-WebFace是一款免费开源的用于人脸识别的数据集,它是从IMDb网站上进行数据爬取,IMDb网站上包含了许多名人的照片以及姓名,截至目前2021.12.30,共有一万五千个名人数据集和四十九万张照片。
项目中送入图片大小为112*112,batch_size为64,学习率为0.01,分类数量为10575个类别,迭代训练次数为10次,由于训练数据集数量较大,
笔者所使用的RTX4000显卡迭代十次的时间也要花掉8个小时左右,其他小伙伴可以根据情况自己动态调整迭代训练的次数。
ps:使用的设备为笔者的笔记本电脑,使用cpu运行推理,平均可以跑到25帧左右。
人脸识别: zhazhaming/face_attendance (github.com)
项目是笔者在暑假期间参加人工智能挑战赛道的比赛,耗时半个月完成,其中还有很多细节没有完善,依旧存在很多不足,欢迎各位小伙伴指正。后续将进行使用MTCNN算法对人脸的检测和人脸对齐进行改进、使用YOLOv5进行人脸检测,并量化部署到移动边缘端设备中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。