简介:

FaceX-Zoo是一个专为人脸识别而生的开源库,是目前准确率最高的开源人脸识别项目。FaceX-Zoo是基于PyTorch实现的。它提供了一个训练模块,其中有各种supervisory head和骨干网络,以实现最先进的人脸识别; 同时也提供了一个标准化的评估模块,该模块只需编辑一个简单的配置就可以评估大多数流行基准中的模型。此外,还提供了一个简单的功能齐全的face SDK,用于验证和初步应用训练过的模型。除了人脸识别,还针对实际应用开发了特定功能(如人脸戴口罩等)。

训练模块支持多种人脸图像预处理,支持多个主流骨干网和监督学习头,并提供了多种并行和加速策略。评估模块除了预处理和多种骨干网可选外,还针对主流人脸数据集的评估协议进行了兼容,方便算法比较。应用组件则提供了可人脸识别实际应用中需要的人脸识别、对齐、戴口罩等功能,后续官方还计划加上人脸解析、重打光等。

关于名称:

“face”-此repo主要用于人脸识别。

“X”-我们还致力于提供人脸识别以外的功能,例如面部切割、面部打光。

“zoo”-有很多算法和模型在这个repo。

运行环境:

  • python >= 3.7.1
  • pytorch >= 1.1.0
  • torchvision >= 0.3.0

识别流程说明:

FaceX-zoo实现人脸识别包含三个步骤,第一步人脸检测,第二步人脸对齐,第三步人脸检测

人脸检测(face detection):使用的目前准确度最好的retina网络,经过实测比常见的yolo,ssd和MTCNN等准确很多

人脸对齐(face alignment):人脸对齐主要是人脸关键点的检测,使用的是人脸关键点的检测模型是pfld

人脸识别(face recognition):人脸识别提供了多种模型mobilefacenet,retnet50-ir等网络的预训练模型和网络结构

框架结构:

FaceX-Zoo的架构。实框中的模块是当前版本中已经提供的模块,虚线框中的模块将在后续版本中添加。上图巧妙地展示了FaceX-Zoo的总体架构。整个项目主要包括四个部分:培训模块、评估模块、附加模块和face SDK,其中前两个模块是本项目的核心部分。培训和评估模块包括预处理、培训模式、主干、监督负责人和测试协议等几个组成部分。作者将详细说明如下。

预处理:

这个模块在将图像发送到网络之前完成图像的基本转换。对于训练,作者实现了常用的操作,如大小调整、归一化、随机裁剪、随机翻转、随机旋转等。可根据不同需求,灵活添加定制操作。对于评估,只使用大小调整和标准化。同样地,测试增强,如五种作物,水平翻转等,也可以通过自定义轻松添加到作者的框架中。

训练模式:

将传统的人脸识别训练模式作为基线例程。具体来说,通过DataLoader对训练输入进行调度,然后将训练输入发送到骨干网进行前向传递,最后计算一个准则作为训练损失进行后向更新。此外,作者考虑了人脸识别中的一种实际情况,即使用浅分布数据[11]来训练网络。因此,作者整合了最近的训练策略,以促进浅面数据的训练。

骨干网络:

利用骨干网提取人脸图像的特征。作者在FaceX-Zoo中提供了一系列最先进的骨干架构,如下所示。此外,只要修改配置文件并添加体系结构定义文件,就可以在PyTorch的支持下轻松定制任何其他体系结构选择:

  • MobileFaceNet:为移动设备上的应用程序提供一个高效的网络。

  • ResNet:一系列用于通用视觉任务的经典架构。

  • SE-ResNet:配备SE块的ResNet,重新校准通道的特征响应。

  • HRNet:深度高分辨率表示学习网络。

  • EfficientNet:一组在深度、宽度和分辨率之间扩展的架构。

  • GhostNet:一个旨在通过廉价操作生成更多特征地图的模型。

  • AttentionNet:一个由注意模块堆叠而成的网络,用来学习注意感知功能。

  • TF-NAS:由NAS搜索的一系列具有延迟约束的架构

监督头:

监控头定义为实现人脸准确识别的监控单点及其相应的计算模块。为了学习人脸识别的判别特征,通常对预测的logit进行一些具体的操作,如归一化、缩放、添加边距等,然后再发送到softmax层。作者在FaceX-Zoo中实现了一系列的softmaxstyle损失,如下:

  • AM-Softmax:在目标logit上增加余数保证金惩罚的附加保证金损失。

  • ArcFace:一个附加的角度边距损失,在目标角度上增加边距惩罚。

  • AdaCos:基于余弦的softmax损耗,超参数无和自适应缩放。

  • AdaM-Softmax:自适应margin loss,可以自适应地调整不同类别的margin。

  • CircleLoss:一个统一的公式,用类级标签和成对标签学习。

  • CurricularFace :一个损失函数,在不同的训练阶段,自适应地调整简单和困难样本的重要性。

  • MV-Softmax:一种损失函数,自适应地强调错误分类的特征向量,指导判别特征学习。NPCFace:一个损失函数,它强调对消极和积极难题的训练。

模型评估测试

有各种基准来衡量人脸识别模型的准确性。其中许多侧重于特定的人脸识别挑战,比如跨年龄、跨姿势和跨种族。其中常用的测试协议主要基于LFW[18]和megface[20]的基准。作者将这些协议集成到FaceX-Zoo中,使用简单,指令清晰,通过简单的配置,人们可以很容易地在单个或多个基准上测试他们的模型。此外,通过添加测试数据和解析测试对,可以方便地扩展额外的测试协议。值得注意的是,还提供了一个基于megface的蒙面人脸识别基准

  • LFW:它包含了从网上收集的13,233张带有姿势、表情和照明变化的身份图像。作者提供了在这个经典基准上10倍交叉验证的平均精度。

  • CPLFW:包含3930个身份的11322张图像,侧重于跨姿态人脸验证。遵循官方协议,采用10倍交叉验证的平均精度。

  • CALFW:它包含了4022个身份的12174张图像,旨在跨年龄人脸验证。采用10倍交叉验证的平均精度。

  • AgeDB30:它包含了12240张图像,440个身份,每个测试对有30岁的年龄差距。作者提供了10倍交叉验证的平均准确性。

  • RFW:包含了11,430个身份的40,307幅图像,被提出用来测量人脸识别中潜在的种族偏见。RFW中有四个测试子集,分别为African, Asian, Caucasian和Indian,作者分别提供每个子集的平均准确率。

  • megface:它包含80个探测身份和100万个画廊干扰物,旨在评估大规模的人脸识别性能。作者提供了megface的k级识别准确性。

  • megface - mask:它包含与megface相同的探测身份和图库干扰物,而每个探测图像都由一个虚拟面具添加。该协议旨在评估大规模蒙面人脸识别的性能。

口罩识别实验:

Background:由于最近全球COVID- 19大流行,蒙面人脸识别已成为许多场景下的关键应用需求。然而,用于训练和评估的掩蔽人脸数据集很少。为了解决这个问题,作者授权了FaceX-Zoo的框架,通过名为FMA-3D (3D-based face mask Adding)的专门模块,在现有的人脸图像中添加虚拟面具。

FMA-3D:给定一个真正的戴面具的脸图像(图2 (a))和B non-masked脸图像(图2 (d)),作者合成一个写实的戴面具的脸图像的面具和面部区域B。首先,作者利用一个面具分割模型[23]从图像中提取面具区域(图2 (B)),然后映射纹理映射到UV空间真实感三维人脸重建方法PRNet[12](图2 (c))。对于图像B,作者采用与A相同的方法计算UV空间中的纹理贴图(图2(e))。接下来,作者在UV空间中混合蒙版纹理贴图和人脸纹理贴图,如图2(f)所示。最后,根据图像b的UV位置图绘制混合纹理图,合成出蒙面图像(图2(g))。图3为FMA-3D合成的更多蒙面图像。与基于2d和基于gan的方法相比,作者的方法在鲁棒性和保真性方面表现出了优异的性能,特别是对于大的头部姿态。

图2:在人脸图像上佩戴虚拟口罩的方法。蒙版模板可以根据输入的蒙版面从多种选择中采样

训练蒙面人脸识别模型。借助作者的FMA-3D,可以方便地从现有的非掩模数据集中合成大量的掩模人脸图像,如MS-Celeb-1M-v1c。由于现有的数据集已经有了ID标注,作者可以直接使用它们来训练人脸识别网络,而不需要额外的标注。训练方法可以是传统的常规或SST,以及训练头和骨干可以实例化与FaceXZoo集成的选择。注意,测试基准可以以相同的方式从非屏蔽版本扩展到屏蔽版本。

实验和结果:利用FMA-3D,作者将MS-Celeb1M-v1c的训练数据合成为其掩码版本MS-Celeb1M-v1c- mask。它包括MSCeleb1M-v1c中每个身份的原始人脸图像,以及与原始人脸对应的蒙面人脸图像。作者选择MobileFaceNet作为骨干,MV-Softmax作为监控头。该模型经过18个epochs的训练,批量大小为512。学习速率初始化为0:1,然后在epoch选择10, 13和16。为了对模型进行蒙面识别任务的评价,作者利用FMA-3D合成了基于megface的蒙面数据集,命名为megface -mask,其中包含了蒙面探针图像,保留了未蒙面画廊图像。

在未来,作者将从广度、深度和效率三个方面对FaceX-Zoo进行改进。首先,将包含更多的附加模块,如face解析和face lightning,从而丰富FaceX-Zoo中的X功能。第二,随着深度学习技术的发展,骨干架构和监督负责人模块将不断得到补充。第三,通过分布式数据并行技术和混合精度训练来提高训练效率。

模型效果:

下表是使用不同的骨干网(使用MV-Softmx做Head)在多个人脸数据集上的识别结果:

下表是使用不同监督学习Head(使用MobileFaceNet做骨干网)在多个人脸数据集上的识别结果:

可见,相同骨干网下各个Head(损失函数)所得到的结果差别不是很大。

从上面两个表格中我们可以看得出,骨干网对最终精度的影响更大,近几年出现的损失函数貌似并没有太大区别。

针对在实际应用中单ID训练样本可能极少的Shallow Face Learning问题,作者开发了普通和Semi-siamese 两种训练方式,其对比结果如下:

可见使用Semi-siamese 策略后,性能暴增!

看来这种跟数据强相关的技术,对精度的提升更明显。

项目中用到的一些名词说明:

* conventional_training 常规训练方式
* 项目中train_amp.py 是混合精度训练
* semi-siamese_training 简称SST,是一种新的训练方法,叫半连体训练,可以解决浅人脸学习中的挑战(每个ID都有有限的样本)
* SOTA也就是state-of-the-art,若某篇论文能够称为SOTA,就表明其提出的算法(模型)的性能在当前是最优的。
* SOTA主干模型:由SOTA主干训练的具有相同头部的模型,即MV Softmax。
* SOTA头模型:由具有相同主干的SOTA头训练的模型,即MobileFaceNet。
* 大多数现有的公共人脸数据集,如MS-Celeb-1M和VGGFace2,在广度(大量的id)和深度(足够的样本数)两个方面为训练提供了丰富的信息。然而,在许多真实的人脸识别场景中,训练数据集的深度是有限的,即每个ID只有两张人脸图像,我们将这种情况定义为浅层人脸学习,并发现现有的训练方法存在问题。与深度人脸数据不同,浅层人脸数据缺乏类内多样性。因此,它会导致特征维数的崩溃,因此学习的网络很容易在崩溃维数中退化和过度拟合。针对这一问题,本文提出了一种新的训练方法半连体训练(SST)。由一对半连体网络构成前向传播结构,利用更新廊道队列计算训练损失,对浅层训练数据进行有效优化。我们的方法没有额外的依赖性,因此可以灵活地与现有的损失函数和网络结构集成。在各种人脸识别基准上的大量实验表明,该方法不仅在浅层人脸学习中,而且在传统的深层人脸数据中,都显著地提高了训练效果。

* alignment是人脸对齐,但是人脸检测和人脸关键点检测是对齐的前提条件。其主要思路是通过检测人脸关键点,然后作仿射变换等进行人脸对齐。
* backbone:翻译为主干网络的意思,既然说是主干网络,就代表其是网络的一部分,那么是哪部分呢?翻译的很好,主干部分,哈哈哈哈,文字游戏了哈。这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,共后面的网络使用。这些网络经常使用的是resnet VGG等,而不是我们自己设计的网络,因为这些网络已经证明了在分类等问题上的特征提取能力是很强的。在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。
* head:head是获取网络输出内容的网络,利用之前提取的特征,head利用这些特征,做出预测。
* neck:是放在backbone和head之间的,是为了更好的利用backbone提取的特征
* bottleneck:瓶颈的意思,通常指的是网网络输入的数据维度和输出的维度不同,输出的维度比输入的小了许多,就像脖子一样,变细了。经常设置的参数 bottle_num=256,指的是网络输出的数据的维度是256 ,可是输入进来的可能是1024维度的。
* GAP:在设计的网络中经常能够看到gap这个层,我之前不知道是干啥的,后了解了,就是Global Average Pool全局平均池化,就是将某个通道的特征取平均值,经常使用AdaptativeAvgpoold(1),在pytorch中,这个代表自适应性全局平均池化,说人话就是将某个通道的特征取平均值。

参考:

https://blog.csdn.net/hallobike/article/details/112972340

https://blog.csdn.net/qq_42722197/article/details/112914823

京东开源人脸识别项目faceX-zoo相关推荐

  1. 京东开源人脸识别工具包:覆盖最强模型,支持训练跑分

    2021-01-25 18:07:28 机器之心报道 作者:泽南 高度模块化和可扩展的设计是 FaceX-Zoo 的优势. 近年来,基于深度学习的人脸识别技术取得了重要进展.但是人脸识别模型的实际部署 ...

  2. 开源人脸识别项目insightface_pytorch

    insightface_pytorch主要做了以下几个方面的工作: * 使用的相关算法 人脸检测: 由原来的retina改成了MTCNN,准确度差了不少 人脸对齐: 由原来的Dense U-Net改成 ...

  3. 通过使用5个开源的人脸识别项目来增加你的计算机视觉项目经历

    作者|MRINAL WALIA 编译|Flin 来源|medium 人脸识别是一种能够从图像或视频源的视频帧中实时识别或验证人的技术. 在今天的文章中,我们将讨论五个开源人脸识别项目,以提高你在数据科 ...

  4. 最佳 开源 人脸识别算法_开源项目的最佳社会结构是什么?

    最佳 开源 人脸识别算法 代码审查是一种实践,可促进开源项目中的快速协作,知识共享和最高质量. 代码审查的社会结构是项目的定义特征. 开源项目的最佳社会结构是什么? 在本文中,我们通过分析三个常见模型 ...

  5. 开源的动态人脸识别项目

    1.1 中科院计算所开源人脸识别引擎SeetaFace seetaface/SeetaFaceEngine 1.2

  6. 史上最简单的人脸识别项目登上GitHub趋势榜

    来源 | GitHub Trending整理 | Freesia译者 | TommyZihao出品 | AI科技大本营(ID: rgznai100) 导读:近日,一个名为 face_recogniti ...

  7. 基于Python的开源人脸识别库:离线识别率高达99.38%

    基于Python的开源人脸识别库:离线识别率高达99.38% 2019年04月18日 18:13:18 AI终结者 阅读数 1233 项目地址:https://github.com/ageitgey/ ...

  8. Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38%

    Python人脸识别教程 - 基于Python的开源人脸识别库:离线识别率高达99.38% 仅用 Python 和命令行就可以实现人脸识别的库开源了.该库使用 dlib 顶尖的深度学习人脸识别技术构建 ...

  9. python开源的人脸识别库_什么是 SeetaFace 开源人脸识别引擎

    区分不同的人是很多智能系统的必备能力.为实现此目的,一种可能的技术手段是通过对人脸的光学成像来感知人.识别人,即所谓的人脸识别技术.经过几十年的研发积累,特别是近年来深度学习技术的涌现,人脸识别取得了 ...

最新文章

  1. php dedecms 记录访问者ip,dedecms实现显示访问者ip地址的方法
  2. Pytorch完成基础的模型-线性回归
  3. Doctype作用? 严格模式与混杂模式如何区分?它们有何意义
  4. python整数类型-Python 的数值类型(整数、长整数、浮点数和复数)
  5. HDU4970 Killing Monsters dp
  6. Sparsity稀疏编码(三)
  7. HTML表格,table,thead,tbody,tfoot,th,tr,td,的属性以及跨行,跨列
  8. Going Dutch BAPC( 状态转移DP)
  9. sql语句分析是否走索引_MySql 的SQL执行计划查看,判断是否走索引
  10. HashSet存储自定义对象保证元素唯一性图解原理及代码优化
  11. 刚刚做了一个菜单导航变亮的效果,共享一下吧!
  12. pb实现简单计算器的思想_【python实用编程之简单矩阵计算器实现】GUI编程
  13. 从王者荣耀里我学会的前端新手指引
  14. 什么样的老板不适合找运营?
  15. Ubuntu18.04 如何用gcc编译objective-c
  16. 自走棋服务器没有响应,从爆火到凉凉,多多自走棋宣布停服,加入腾讯属于无奈?...
  17. 基于 mini2440 电阻式触摸屏(二):S3C2440 电阻式触摸屏接口、内部ADC结构
  18. 计算机动画原理课程设计选题,组成原理课程设计设计一台模型计算机.pdf
  19. [DZ X2.5实用教程] DZ X2.5(Discuz!)论坛-QQ企业OR域名邮箱作为发信邮箱设置教程
  20. Python-Snappy的安装 以及报错解决

热门文章

  1. PHP快手直播弹幕采集,获取斗鱼弹幕php版(原创)
  2. Git上传代码报错Push rejected: Push to origin/master was rejected
  3. openwrt修改ip地址
  4. 问题1201:打印数字图形
  5. 最近面试SAR ADC总是被问到DAC 单位电容的取法
  6. [solved] login to server failed: EOF
  7. 高中数学立体几何高考真题解题技巧(名师总结)
  8. ArcGIS API for JavaScript根据两个点坐标在地图上画线
  9. 企业内网安全体系化发展方向
  10. win8系统桌面计算机,Win8计算机桌面管理软件