# 人脸识别 V2.0
# 一、简介
本文以 Siamese 网络为基础,改进了原有的通过训练分类器来检测人脸的方法,大大提高了识别的准确度。该系统基 python3.5/dlib/opencv2/tensorflow1.3-gpu 环境,主要实现了人脸识别的功能。
Siamese 网络是一种相似性度量方法,当类别数多,但每个类别的样本数量少的情况下可用于类别的识别、分类等。Siamese 网络也非常适合于进行人脸识别研究,被测者仅需提供最少 1 张照片,即可正确识别出被测者。这与利用分类器来识别人脸有着很大的不同,利用分类器进行训练的方法需要每一类中有足够多的样本才行,这其实在实际生活中是不现实的。原因如下:无法对每一个人采取足够多的样本,当类别过多,每一类别的样本也足够多时,机器性能也就跟不上了,无法训练出合适的模型;无法对陌生人脸进行划分,主要指不属于分类器中的类别会被划分为分类器中的类别,例如,分类器可以识别3 个人的人脸,当第 4 个人要识别时,他就会被误识别为这 3 个人中的其中一个。
Siamese 网络的主要思想是通过一个函数将输入映射到目标空间,在目标空间使用简单的距离(欧式距离等)进行对比相似度。在训练阶段去最小化来自相同类别的一对样本的损失函数值,最大化来自不同类别的一堆样本的损失函数值。Siamese 网络训练时的输入是一对图片,这一对图片是 X1,X2,标签是 y。当 X1,X2 是同类时,y 为 0,当 x1,X2 不同类时,y 为 1 。Siamese 网络的损失函数为
L=(1-y)LG(EW(X1,X2))+yLI(EW(X1,X2)),其中 EW(X1,X2)=||GW(X1)-GW(X2)||。GW(X)就是神经网络中的参数,其中 LG 是只计算相同类别对图片的损失函数,LI 是只计算不相同类别对图片的损失函数。GitHub 上有人使用 Tensorflow 在 MNIST 实现 Siamese 网络,链接。
然而,这还不够,仅仅利用 Siamese 网络来训练模型,还达不到好的效果。根据Siamese 网络的主要思想,有人发明了 Triplet 网络。triplet 是一个三元组,这个三元组是这样构成的:从训练数据集中随机选一个样本,该样本称为 Anchor,然后再随机选取一个和 Anchor (记为 x_a)属于同一类的样本和不同类的样本,这两个样本对应的称为 Positive(记为 x_p)和 Negative (记为 x_n),由此构成一个(Anchor,Positive,Negative)三元组。有了上面的 triplet 的概念, triplet loss 就好理解了。针对三元组中的每个元素(样本),训练一个参数共享或者不共享的网络,得到三个元素的特征表达,分别记为:f(xi^a),f (xi^p),f (xi^n),。triplet loss 的目的就是通过学习,让 x_a 和 x_p 特征表达之间的距离尽可能小,而 x_a 和 x_n 的特征表达之间的距离尽可能大,并且要让 x_a 与 x_n 之间的距离和 x_a 与 x_p 之间的距离之间有一个最小的间隔 t。
公式化表示就是:||f (xi^a)-f (xi^p)||+t<||f(xi^a)-f (xi^n)||,损失函数就是L={ ||f (xi^a)-f (xi^p)||-||f (xi^a)-f (xi^n)||+t }+。这里距离用欧式距离度量,+ 表示{ }内的值大于零的时候,取该值为损失,小于零的时候,损失为零。
推荐几篇论文供详细研究:文章末尾 - 论文推荐。
# 二、代码思路
### 数据集
本人用到过 2 种数据集,一种是 LFW 数据集,另一种是 CAS-PEAL-R1 数据集。CASPEAL-R1 数据集训练了一段时间,效果不太好,就舍弃掉了。现在用 LFW 数据集,如有条件,选用更大的数据集。
### 结构
主要有 face_lib 文件夹、model 文件夹、out 文件夹、temp 文件夹、train_faces 文件夹、get_align_face.py 文件、lfw_test.py 文件、run.py 文件、run_new.py 文件、test.py 文件。
#### face_lib 文件夹
该文件夹下有 align_dlib.py 文件、inference.py 文件、my_api.py 文件、 shape_predictor_68_face_landmarks.dat 文件。
- 其中 align_dlib.py 文件和 shape_predictor_68_face_landmarks.dat 文件取之于 Openface,主要作用是对齐人脸。我主要调用的是 align 方法。
代码示例如下:
```python
detector = align_dlib.AlignDlib(PREDICTOR_PATH) # PREDICTOR_PATH代表shape_predictor_68_face_landmarks.dat的目录 img = cv2.imread(path_name) # 读取图片
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转为RGB图片
face_align_rgb = detector.align(size, img_rgb) # img_rgb必须为RGB图片,size我设为96
```
- inference.py 文件只有一个 Siamese 类,主要进行神经网络的配置。
network 方法中:X 为输入图片,keep_f 为 dropout 的比率,采用的是 VGG16 的经典网络结构。输出的 f3 是一个 128 维的向量。
loss_with_spring 方法:计算 loss 值,阈值 margin=5.0。
look_like 方法:计算 2 张照片的欧氏距离。
- my_api.py 文件包含我自己写的一些类与方法。
GetAlignedFace 类:这个主要是把一张正常图片转化为大小为 96*96 对齐后的人脸图片。
Traversal 类: 包括 2 个方法,get_triplet_data 方法和 generate_train_data 方法。
get_triplet_data方法,读取一个文件夹 返回标签数(文件夹数)、图片数组和图片id,返回的都是列表(list)类型。generate_train_data方法,以遍历方式生成3元组训练数据。假设有4个类别,第一个类别有1张图片,第二个类别有 2张图片,第三个类别有3张图片,第四个类别有4张图片。那么标签数是4,图片数组face_array, 第一个类别的 第1张图片可用face_array0表示,图片id 用id_array表示,id_array=[[0], [0, 1], [0, 1, 2],[0, 1, 2, 3]]。id_array[0]中的0 表示第一类别,其中id_array[0]=[0]表示第一类的第一张图片。这2个列表一个是图片,一个是图片id,face_array0在内存中占用4KB(图片大小4kb)的空间,而id_array[0][0]几乎忽略不计。以遍历方式生成的3元组训练数据,只生成图片id的排列。取第一类的第一张图片为Anchor,即x_a =id_array0,我用0_0表示 ,由于第一类只有一张图片,故x_p=0_0,x_n就从另外3类中取一张图片。遍历生成的3元组是
```c++
{ 0_0,0_0,1_0;0_0,0_0,1_1;0_0,0_0,2_0;
0_0,0_0,2_1;0_0,0_0,2_2;0_0,0_0,3_0;0_0,0_0,3_1; 0_0,0_0,3_2;
0_0,0_0,3_3;1_0,1_1,0_0;1_0,1_1,2_0;1_0,1_1,2_1;1_0,1_1,2_2;
1_0,1_1,3_0;1_0,1_1,3_1;1_0,1_1,3_2;1_0,1_1,3_3;2_0,2_1,0_0;
2_0,2_1,1_0 ;2_0,2_1,1_1 ;2_0,2_1,3_0 ;2_0,2_1,3_1 ;2_0,2_1,3_2 ;
2_0,2_1,3_3 ;2_0,2_2,0_0 ;2_0,2_2,1_0 ;2_0,2_2,1_1; 2_0,2_2,3_0 ;
2_0,2_2,3_1; 2_0,2_2,3_2; 2_0,2_2,3_3; 2_1,2_2,0_0 ;2_1,2_2,1_0;
2_1,2_2,1_1; 2_1,2_2,3_0; 2_1,2_2,3_1; 2_1,2_2,3_2; 2_1,2_2,3_3;
3_0,3_1,0_0; 3_0,3_1,1_0; 3_0,3_1,1_1; 3_0,3_1,2_0; 3_0,3_1,2_1;
3_0,3_1,2_2; 3_0,3_2,0_0; 3_0,3_2,1_0; 3_0,3_2,1_1; 3_0,3_2,2_0;
3_0,3_2,2_1;3_0,3_2,2_2... },
```
等等,后面就不列出来了。
Random 类:只有一个方法:generate_train_data 方法。
这个方法是随机生成 3 元组,以上面的例子为例,随机生成的 3 元组是{ 0_0,0_0,1_0;1_0,1_1,2_1;2_0,2_2,3_0;3_0,3_3,2_1;}。思想是第一类中
取 2 张图片,当作 x_a,x_p,在随机从另外 3 类中取一张图片当做 x_n,该方法一次只能生成 4 个 3 元组。
LfwTest 类:这个主要利用 Lfw 数据集测试模型的性能的。negative_pairs.txt 包含 3000 对人脸,这些人脸对不属于同一类;postive_pairs.txt 也包含 3000 对人脸,这些人脸对属于同一类。针对这共 6000 对人脸来计算出他们的欧式距离。
LfwPlot 类:这个主要根据阈值和准确率来画出表格。针对 negative_pairs,欧式距离大于阈值的则认为判断正确;
没有合适的资源?快使用搜索试试~ 我知道了~
基于Python tensorflow的人脸识别【100012245】
共25个文件
py:9个
pyc:4个
txt:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 176 浏览量
2023-05-18
09:31:50
上传
评论 1
收藏 69.51MB ZIP 举报
温馨提示
本文以 Siamese 网络为基础,改进了原有的通过训练分类器来检测人脸的方法,大大提高了识别的准确度。该系统基 python3.5/dlib/opencv2/tensorflow1.3-gpu 环境,主要实现了人脸识别的功能。
资源推荐
资源详情
资源评论
收起资源包目录
100012245-基于Python tensorflow的人脸识别.zip (25个子文件)
face_tensorflow
.vscode
settings.json 91B
extracted.py 2KB
get_align_face.py 912B
LICENSE 1KB
faceshutil.py 890B
temp
lfw
lfw_test
negative_pairs.txt 36KB
postive_pairs.txt 36KB
Path_lfw2.txt 492KB
.idea
Program_19.iml 459B
workspace.xml 49KB
misc.xml 227B
modules.xml 272B
lfw_test.py 3KB
run.py 4KB
face_lib
shape_predictor_68_face_landmarks.dat 95.08MB
my_api.py 10KB
inference.py 7KB
__pycache__
align_dlib.cpython-35.pyc 7KB
inference.cpython-35.pyc 6KB
my_api.cpython-35.pyc 8KB
resnet.cpython-35.pyc 5KB
align_dlib.py 8KB
人脸识别V2.0说明文档.pdf 421KB
README.md 11KB
makefile.py 789B
共 25 条
- 1
资源评论
神仙别闹
- 粉丝: 4137
- 资源: 7484
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功