updated README.md and requirements.txt
face ├─ main.py # 主程序 ├─ *UI.py # qtUI界面 ├─ *UI.ui # qtUI界面 ├─ backend # 后端数据库相关 ├─ recognition # 人脸识别相关 │ ├─ Recognizer.py # 对识别器做进一步封装 │ ├─ align # 人脸检测 │ ├─ data # 该目录被加入到.gitignore中,包括数据集及模型 │ ├─ run # 识别单元测试 │ │ ├─ embeddings.py │ │ └─ test.py │ └─ train # 训练模型 └─ sql # SQL语句 └─ comprehensive_design_3.sql
data文件结构:CASIA-WebFacemodel_origin
data ├─ dataSet │ └─ [CASIA-WebFace] ├─ graph # *训练时自动生成 ├─ model # 自行训练的模型存放位置 ├─ [model_origin] # 已经训练好模型 ├─ output # 运行过程中的视频输出位置(可选项) └─ pictures ├─ *.jpg # 以文件名为标注的人脸图片(只用于单元测试) └─ embeddings.h5 # *运行时自动生成
系统主要通过人脸识别算法维护一个数据库,完成人脸识别考勤的目的。
主要分为两个表:
三层模型依次训练,其中详细说明参考tensorflow-MTCNN 。
该部分参考FaceNet的结构,即使用inception_resnet_v1作为模型主体架构,输出一定维度的图片embeddings。
FaceNet的损失函数采用的是triplet_loss,即对于某张训练图片img,再选取一张同一类别一张图作为pos,选取不同类别的一张图作为neg。
使pos_dist与neg_dist的差总保持一定阈值,实际训练中在每一batch中对于某一img,选取同一类别图像作为pos,选取embeddings平方和大于pos的不同类别图像作为neg,依次构成三元组来训练模型依次构成三元组来训练模型。
triplet_loss的公式如下:
但是这样训练三元组模型收敛极慢,A Discriminative Feature Learning Approach for Deep Face Recognition 提出的center_loss可加速模型的收敛。公式如下:
代码中的损失函数采用softmax交叉熵和center_loss相结合。softmax交叉熵为了使类间距离变大,center_loss是计算某一图片与该类别图片embeddings的均值的损失,为了使类间距离变小。论文中采取minst实验来说明损失函数的功能,如下图所示:
在实际训练中并不是遍历整个数据集来求取某类别center的embeddings,而是只针对每一个batch中出现的类别的center通过batch内相同类别的图像embeddings来进行一定学习率的更新,未出现该批次的类别的center不进行更新。
优化器采用Adam(Adaptive Moment Estimation),这个算法是另一种计算每个参数的自适应学习率的方法,相当于 RMSprop + Momentum。除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值。梯度更新规则为:
根据训练好的模型生成带有身份图像的embeddings,其数据包括:
此后每次运行模型时会与这个embeddings数据进行比对,如果比对结果为空,即认为当前数据为待标识数据。将这个数据标注为已知标识之后,重新写入到h5文件中即可完成对人脸数据的录入。
人脸识别考勤系统
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
FACE人脸识别考勤
一、目录说明
data文件结构:
CASIA-WebFace
model_origin
二、概要设计
系统主要通过人脸识别算法维护一个数据库,完成人脸识别考勤的目的。
三、详细设计
1、数据库设计
主要分为两个表:
2、模型介绍
人脸识别模块基于Tensorflow框架,算法参考FaceNet 网络结构,采用Center_loss 作为损失函数。2.1、预处理
MTCNN 被证明是在复杂场景中非常有效的面部标志检测器。模型主要通过三层网络级联(PNet, RNet, ONet)来实现对人脸更精确的检测, 论文中的示例如下:
三层模型依次训练,其中详细说明参考tensorflow-MTCNN 。
2.2、模型训练
该部分参考FaceNet的结构,即使用inception_resnet_v1作为模型主体架构,输出一定维度的图片embeddings。
2.2.1、损失函数
FaceNet的损失函数采用的是triplet_loss,即对于某张训练图片img,再选取一张同一类别一张图作为pos,选取不同类别的一张图作为neg。
使pos_dist与neg_dist的差总保持一定阈值,实际训练中在每一batch中对于某一img,选取同一类别图像作为pos,选取embeddings平方和大于pos的不同类别图像作为neg,依次构成三元组来训练模型依次构成三元组来训练模型。
triplet_loss的公式如下:

但是这样训练三元组模型收敛极慢,A Discriminative Feature Learning Approach for Deep Face Recognition 提出的center_loss可加速模型的收敛。

公式如下:
代码中的损失函数采用softmax交叉熵和center_loss相结合。

softmax交叉熵为了使类间距离变大,center_loss是计算某一图片与该类别图片embeddings的均值的损失,为了使类间距离变小。
论文中采取minst实验来说明损失函数的功能,如下图所示:
在实际训练中并不是遍历整个数据集来求取某类别center的embeddings,而是只针对每一个batch中出现的类别的center通过batch内相同类别的图像embeddings来进行一定学习率的更新,未出现该批次的类别的center不进行更新。
2.2.2、优化器
优化器采用Adam(Adaptive Moment Estimation),这个算法是另一种计算每个参数的自适应学习率的方法,相当于 RMSprop + Momentum。

除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值。
梯度更新规则为:
2.3、模型运行
根据训练好的模型生成带有身份图像的embeddings,其数据包括:
此后每次运行模型时会与这个embeddings数据进行比对,如果比对结果为空,即认为当前数据为待标识数据。
将这个数据标注为已知标识之后,重新写入到h5文件中即可完成对人脸数据的录入。
三、系统测试
1、录入&检测&考勤打卡
2、检索