Skip to content

jinze1994/DeepID1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f417c61 · Dec 23, 2016

History

14 Commits
Dec 22, 2016
Dec 23, 2016
Dec 22, 2016
Dec 23, 2016
Dec 22, 2016
Dec 22, 2016
Dec 22, 2016
Dec 22, 2016
Dec 22, 2016

Repository files navigation

DeepID1

Implementation of DeepID1 using tensorflow.

简要说明

Face Verification(人脸验证)是人脸识别中的经典任务。即给定两张图片,判定这两张图片是否属于同一个人。

DeepID 是2014年香港中文大学的汤晓鸥团队提出的一系列算法,共有三代。 这一系列基于卷积神经网路的方法,将LWF数据集上的人脸识别史无前例的推进到了99%。具体关于此方法的介绍见此

本代码是 DeepID1 的 tensorflow 开源实现。代码结构简单易懂。 使用了开放的 Youtube Aligned Face 数据集,在 8:1:1 的切分下达到了 95% 的识别精度。

环境配置

python3: numpy, scipy, pillow, tensorflow

dataset: Youtube Aligned Face

RAM: >= 12GB

代码概述

.
├── crop.py           # 对数据库图片进行剪裁
├── split.py          # 将数据按照 8:1:1 划分为训练集、验证集和测试集
├── vec.py            # 将数据格式化为向量形式
├── deepid1.py        # 训练卷积神经网络,将模型参数存入 checkpoint
├── predict.py        # 根据训练出的网络模型进行人脸验证
├── checkpoint        # 存放模型参数
│   ├── 30000.ckpt
│   ├── 30000.ckpt.meta
│   └── checkpoint
├── data              # 图片数据库目录
│   ├── aligned_images_DB.tar.gz
├── log               # tensorflow 生成的 log 文件,便于可视化
│   ├── test
│   └── train
├── README.md

运行步骤

cd data; tar -zxf aligned_images_DB.tar.gz 解压缩图片数据库

./crop.py 对数据库中的图片进行剪裁,由于该数据已经对齐,因此只需将人脸区域剪裁到 (55,47) 的像素即可。

./split.py 对剪裁后的数据库文件按照 8:1:1 的规模进行切分,分别作为训练集、验证集和测试集。每个人保留固定数目的图片(100张)进行训练。为生成测试集,对每个人构造 5 对同一个人的图片 pair,再构造 5 对不同人的图片 pair,作为测试集。

./vec.py 将数据格式化为向量形式,存入 data/dataset.pkl。便于训练时直接从该文件读取数据。

./deepid1.py 训练卷积神经网络,将模型参数存入 checkpoint,将运行时的统计数据存入 log。(大约需要一天左右训练完成,可以在文件内修改训练轮数和收敛速率等参数)

tensorboard --logdir=log 查看图模型及训练统计数据。

./predict.py 对测试集数据,利用训练好的网络提取特征,对比特征的 consine 相似度,得出判别是否同一个人的结果

实验参数

卷积神经网络完全按照 deepid1 的规格搭建,具体网络结构如下:

一些其它的超参数设置如下:

梯度下降方法 初始学习率 激活函数 batch size 预测向量距离
AdamOptimizer 1e-4 relu 1024 cosine

收敛过程

下图展示了训练过程中的收敛情况,第一幅图展示了softmax精确度随迭代次数增加的收敛情况;第二幅图展示了loss值随迭代次数的收敛情况。蓝线代表训练集的统计数据,红线代表验证集的统计数据。

可以看出,精确度随迭代次数呈 S 型变化,在训练集上到达了 100%,在验证集上最终到达 95% 左右。loss 也随迭代次数不断下降,根据验证集的曲线并未上升,我们可以判断出训练并未过拟合。

准确率

与训练过程中的softmax准确率不同,这里的准确率是指测试集上,判断一个图片 pair 是否同一个人的准确率。

迭代轮数 准确率
10000 94.77%
15000 95.92%
20000 95.99%
25000 95.83%
30000 95.86%
由于小于 10000 的迭代轮数的 checkpoint 没有保存,因此懒得再跑了。可以看出,该实现在 Youtube face 数据集上的人脸验证准确率可稳定在 95% 以上。模型之前并未见过测试集中的人脸,可以看出我们的实现是成功的!

About

Implementation of DeepID1 using tensorflow.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages