京东开源人脸识别项目faceX-zoo

简介:

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

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值