作者:宋志龙,算法工程师,Datawhale成员

人脸识别已经成为生活中越来越常见的技术,其中最关键的问题就是安全,而活体检测技术又是保证人脸识别安全性的一个重要手段,本文将向大家简单介绍活体检测,并动手完成一个活体检测模型的训练,最终实现对摄像头或者视频中的活体进行识别。

我们可以达成的效果

人脸识别的技术关键——活体检测

一般提到人脸识别技术,即指人脸比对或人脸匹配,即将待识别的人脸和系统中已经提前录入的人脸信息(如身份证照片)进行特征的比对,而在使用神经网络提取特征进行比对之前,需要首先对识别到的人脸进行活体检测,以确定摄像头前的人是个活人。因此整个人脸识别过程一般为(并非一定要这样):人脸检测 -> 关键点检测 -> 人脸对齐 -> 活体检测 -> 人脸特征提取 -> 人脸比对。

模型简介

本项目使用基于resnet18的二分类模型对RGB图像进行活体、非活体的分类识别, 网络结构如图所示,有关于resnet的知识可自行查阅。

数据集简介

本项目数据集使用中科院大型人脸活体检测数据库CACIA-SURF,这是一个包含大量不同年龄段人的多模态(RGB, Depth,IR)的数据集,其中包含大量真实活体人脸样本,也包含了对应的攻击样本(数据集已上传至开源数据平台Graviti)。

如图所示,图例中的攻击样本是以打印出来的人脸作为攻击样本,或者露出五官中的部分结合打印人脸一起作为攻击样本,当然还有别的攻击样本制作的形式。因此模型训练的目标就是要在遇到这些攻击样本的时候能够正确识别出它不是一个活体。

其中,RGB表示RGB图片,Depth表示深度图,IR表示近红外图。三个模态的数据可以都用来训练,以使模型适应不同图像采集设备的需求。为了简单,本项目仅使用RGB图像训练。

数据集目录结构如图所示:

Training中为训练集图片,Val为验证集图片,train_list.txt为训练集各个样本的路径及标签,val_private_list.txt为验证集各个样本的路径及标签,val_public_list.txt本项目暂时不用

代码简介

项目环境:python 3.7.4 、pytorch 1.4.0、其余的opencv、numpy啥的看缺啥装啥吧。。。

项目代码目录如图所示(代码地址见文末):

其中,alive_detect为自定义的文件夹,里面存放了一些测试视频,人脸检测模型权重等等文件。

loss文件夹内存放了一些损失函数的实现 model文件夹内存放了一些模型的实现

models文件夹是模型训练过程中权重的保存路径 process文件夹内存放了一些关于数据处理相关的代码

metric.py实现了一些指标的计算

utils.py实现了一些训练或测试用到的小功能函数

train_CyclicLR.py是训练代码,执行这个代码即可启动训练

train_Fusion_CyclicLR.py是多模态数据的训练代码。即同时使用上述数据集中的三种模态的数据进行训练

face_recognize.py是使用训练好的模型进行活体检测测试的代码

项目代码中给出了训练好的模型权重示例,models/baseline_color_32/checkpoint/global_min_acer_model.pth。

执行脚本face_recognize.py,即可调用训练好的模型完成活体检测。

训练过程示例

以resnet18模型为例,使用数据集中的RGB图片进行训练,输入模型尺寸大小为32。

开始训练:

cd alive_recognize_project#开启训练
#--model baseline , 以resnet18为例,可选其他模型,自行探索
#--image_size 32 , 输入活体检测模型的人脸图像大小为32
#--cycle_num 5,训练5个cycle周期
#--cycle_inter 50, 每个cycle周期内训练50个epoch
#--mode train , 开启训练模型
python train_CyclicLR.py --model baseline --image_mode color --image_size 32 --cycle_num 5 --cycle_inter 50 --mode train

对cycle_num和cycle_inter参数的说明,本项目学习率衰减策略采用周期性余弦衰减,cycle_num表示周期数,cycle_inter表示一个周期内训练的epoch数,即每经过cycle_inter个epoch,学习率从初始值下降到最低值,如下图所示。

然后就开始训练了,期间会打印出一些训练过程中的loss、acc、acer等信息,如需要别的日志信息可自行修改。

训练完成后的模型保存在路径models/baseline_color_32/checkpoint下,默认保存每个周期内最低acer模型、最后一个epoch训练结束的模型和全局最低acer模型,如下图所示。

在验证集上测试模型

python train_CyclicLR.py --mode infer_test --model baseline --image_mode color --image_size 32 --batch_size 8

验证集上结果,ACER=0.0358

模型效果测试

调用训练好的模型,对视频中的人脸进行活体检测。(也可以检测摄像头前的自己,本项目以视频文件为例)

测试脚本face_recognize.py参数:

--alive_detect_model:活体检测模型权重

--key_point_detect_model:关键点检测模型,路径为alive_detect/shape_predictor_68_face_landmarks.dat

--detect_vidio:待检测的视频片段存放路径

--detect_res:视频片段的检测结果存放路径

测试代码示例:

python face_recognize.py
--alive_detect_model models/baseline_color_32/checkpoint/global_min_acer_model.pth
--key_point_detect_model alive_detect/shape_predictor_68_face_landmarks.dat
--detect_vidio alive_detect/video_demo.mov
--detect_res alive_detect/res_video_demo.avi

注:--detect_res保存的视频文件默认avi格式,若需要保存其他格式可以自行修改代码。

测试结果示例

扩展

  1. 关于模型训练,可继续调参以期在验证集获得更好的效果。

  2. 关于数据集,可以使用全部三种模态的数据,使用FaceBagNet模型进行多模态人脸活体检测模型的训练。已经给出相关代码,可自行查看。

数据集获取:https://gas.graviti.cn/dataset/datawhale/CASIA-SURF

代码地址:https://github.com/ZJUTSong/Alive_Detect


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑黄海广老师《机器学习课程》课件合集
本站qq群851320808,加入微信群请扫码:

点阅读原文获取数据集↓

【深度学习】人脸识别模型的动手实践!相关推荐

  1. 两个月入门深度学习,全靠动手实践!一位前端小哥的经验分享

    两个月入门深度学习,全靠动手实践!一位前端小哥的经验分享   在当前社会,技术日新月异,一个全栈工程师不及时学习新知识,掌握AI技能,再过两年就算不上"全栈"了. 产品发烧友.前端 ...

  2. 人脸识别模型的动手实践!

    作者:宋志龙 来源:Datawhale 人脸识别已经成为生活中越来越常见的技术,其中最关键的问题就是安全,而活体检测技术又是保证人脸识别安全性的一个重要手段,本文将向大家简单介绍活体检测,并动手完成一 ...

  3. 【百家稷学】深度学习与嵌入式平台AI实践(北京交通大学实训)

    继续咱们百家稷学专题,本次是有三AI在北京交通大学进行的暑期课程教学.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 分享主题 本次分享是在北京交通大学计算机与信息技术学院进行,主题是& ...

  4. 深度学习笔记(7) 实践层面(二)

    深度学习笔记(7) 实践层面(二) 1. 正则化 2. dropout 正则化 3. 其他正则化方法 1. 正则化 深度学习可能存在过拟合问题--高方差,在确定模型之后有两个解决方法 正则化 准备更多 ...

  5. 【LiveVideoStack线上分享】FFmpeg深度学习模块架构与代码实践

    FFmpeg可谓是音视频开发中的一把瑞士军刀,其中filter提供了很多音视频特效与图像处理的功能,除了传统的FFmpeg+OpenGL/OpenCV以外,深度学习模块提供了一种新的方式.本周四晚19 ...

  6. numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践

    <<深度学习框架PyTorch入门与实践>>读书笔记 <深度学习框架PyTorch入门与实践>读后感 小作者:马苗苗  读完<<深度学习框架PyTorc ...

  7. 深度学习笔记(8) 实践层面(三)

    深度学习笔记(8) 实践层面(三) 1. 归一化 / 标准化输入 2. 权重初始化 3. 梯度检验 1. 归一化 / 标准化输入 训练神经网络,特征必须要在0到1之间 此时就只能加速训练的方法就是归一 ...

  8. 深度学习笔记(6) 实践层面(一)

    深度学习笔记(6) 实践层面(一) 1. 训练,验证,测试集 2. 偏差,方差 3. 学习曲线 1. 训练,验证,测试集 训练神经网络时,需要做出很多决策,例如: 神经网络分多少层:每层含有多少个隐藏 ...

  9. R语言︱H2o深度学习的一些R语言实践——H2o包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言H2o包的几个应用案例 笔者寄语:受启发 ...

最新文章

  1. 加州大学戴维斯分校 计算机科学,加州大学戴维斯分校的计算机专业如何?
  2. 转,大佬关于虚拟内存与物理内存关系讲解。
  3. linux 误删除mysql表能恢复吗_Linux下Oracle误删除数据文件恢复操作
  4. JSP数据交互(一)
  5. 【无线***实战】小试无线安全
  6. 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案
  7. list、tuple、dict、set、map
  8. C++_类和对象_C++运算符重载_函数调用运算符重载_---C++语言工作笔记060
  9. python中 将字符串和字典的相互转换
  10. [译]GLUT教程 - 整合代码2
  11. 201521123033《Java程序设计》第3周学习总结
  12. Oracle数据库出现“本地计算机上的OracleOraDB11g_homeTNSListener服务启动后停止.....”问题解决方案...
  13. AllenNLP框架学习笔记(数据篇之二)
  14. 拉格朗日插值的优缺点_对拉格朗日插值法与牛顿插值法的学习和比较
  15. 计算机中 加减运算 的 实现原理
  16. 二进制数的反码和补码
  17. 网络词汇泛滥:神马都是浮云?
  18. Java命令行开关_java命令行操作
  19. 小刘同学的第七十四篇博文
  20. Delphi with Lua5.1.3

热门文章

  1. css选择器中间的空格
  2. u3d资源打包只能打包场景材质,不能打包脚本
  3. WebBrowser1.Navigate重复载入同一页面时载入的是旧页面
  4. TradingView 初识
  5. OSI七层模型加协议
  6. C#之IComparable用法,实现ListT.sort()排序
  7. Linux 常用命令笔记 (持续更新)
  8. C语言 二维数组复制、清零及打印显示
  9. 数据分页 THINKPHP3.2 分页 三种分页方法
  10. Solution : Cannot add new node – Rule SQL Server Database Services feature state failed.