什么是SeetaFace开源人脸识别引擎

jopen 7年前
   <p style="text-align: center;"><a href="/misc/goto?guid=4958986215170887219" title="openSUSE"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/e67f2f70f84f503c011e77ef46377edc.jpg" /></a></p>    <p>区分不同的人是很多智能系统的必备能力。为实现此目的,一种可能的技术手段是通过对人脸的光学成像来感知人、识别人,即所谓的人脸识别技术。经过几十年的研发积累,特别是近年来深度学习技术的涌现,人脸识别取得了长足的进步,在安防、金融、教育、社保等领域得到了越来越多的应用,成为计算机视觉领域最为成功的分支领域之一。</p>    <p>然而,人脸识别并非完全成熟的技术,离公众期望的全面应用尚有距离,还需要学术界、工业界的共同努力。为此,整个人脸识别社区需要有基准(Baseline)系统,而且基准系统的水平显然会极大影响着该领域的发展水平。可是令人尴尬的是,这个领域迄今尚无一套包括所有技术模块的、完全开源的基准人脸识别系统!我们希望改变现状,因此开源了 SeetaFace 人脸识别引擎。该引擎由中科院计算所山世光研究员带领的人脸识别研究组研发。代码基于 C++ 实现,且不依赖于任何第三方的库函数,开源协议为 BSD-2,可供学术界和工业界免费使用。</p>    <p>SeetaFace 人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块(SeetaFace Detection)、面部特征点定位模块(SeetaFace Alignment)以及人脸特征提取与比对模块 (SeetaFace Identification)。</p>    <p>人脸检测模块 SeetaFace Detection 采用了一种结合传统人造特征与多层感知机(MLP)的级联结构,在 FDDB 上达到了 84.4% 的召回率(100 个误检时),并可在单个 i7 CPU 上实时处理 VGA 分辨率的图像。面部特征点定位模块 SeetaFace Alignment 通过级联多个深度模型(栈式自编码网络)来回归 5 个关键特征点(两眼中心、鼻尖和两个嘴角)的位置,在 AFLW 数据库上达到 state-of-the-art 的精度,定位速度在单个 i7 CPU 上超过 200fps。人脸识别模块 SeetaFace Identification 采用一个 9 层的卷积神经网络(CNN)来提取人脸特征,在 LFW 数据库上达到 97.1% 的精度(注:采用 SeetaFace 人脸检测和 SeetaFace 面部特征点定位作为前端进行全自动识别的情况下),特征提取速度为每图 120ms(在单个 i7 CPU 上)。</p>    <p>下面对上述三个模块的情况做简要介绍,更详细的介绍请参考我们相应的学术论文。</p>    <p><strong>人脸检测模块 SeetaFace Detection</strong></p>    <p>该模块基于我们提出的一种结合经典级联结构和多层神经网络的人脸检测方法实现,其所采用的漏斗型级联结构(Funnel-Structured Cascade,FuSt)专门针对多姿态人脸检测而设计,其中引入了由粗到精的设计理念,兼顾了速度和精度的平衡。</p>    <p>如图 1 所示,FuSt 级联结构在顶部由多个针对不同姿态的快速 LAB 级联分类器构成,紧接着是若干个基于 SURF 特征的多层感知机(MLP)级联结构,最后由一个统一的 MLP 级联结构(同样基于 SURF 特征)来处理所有姿态的候选窗口,整体上呈现出上宽下窄的漏斗形状。从上往下,各个层次上的分类器及其所采用的特征逐步变得复杂,从而可以保留人脸窗口并排除越来越难与人脸区分的非人脸候选窗口。</p>    <p style="text-align: center;"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/f490b32f80b68ab5ff04560e352f618e.jpg" /></p>    <p style="text-align:center">图 1. SeetaFace 人脸检测模块所采用的 FuSt 漏斗型级联结构</p>    <p>与 SeetaFace Detection 开源代码配套开放的是一个准正面人脸检测模型(使用了约 20 万人脸图像训练而来),可以实现准正面人脸的准确检测(旋转角度约 45 度以内,但对于姿态偏转较大的人脸也具备一定的检测能力)。图 2 给出了一些检测结果的示例(注:测试时图像金字塔下采样比例设置为 0.8,滑动步长设置为 4 和2,最小人脸设置为 20x20)。在人脸检测领域最重要的评测集 FDDB 上对 SeetaFace Detector 进行评测,在输出 100 个误检时(FPPI=0.035)召回率达到 84.4%,输出 1000 个误检时召回率达到 88.0%。</p>    <p style="text-align: center;"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/308145b6ce146426d9b11e8d9096fe35.jpg" /></p>    <p style="text-align:center">图 2. SeetaFace Detection 人脸检测结果的示例</p>    <p>图 3 则给出了 SeetaFace Detector 在 FDDB 上的离散型得分 ROC 曲线,并与其它已发表的学术界公开结果(从 FDDB 官网获得)进行了对比。不难看出,尽管 SeetaFace 人脸检测器并非目前精度最高的,但在学术界公开的结果中仍然具有很强的竞争力,而且可以完全满足多数人脸识别系统的需求。</p>    <p style="text-align: center;"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/7bd80e2d81a54fe5715a3d1c36f04736.jpg" /></p>    <p style="text-align:center">图 3. SeetaFace Detector 在 FDDB 上的 ROC 曲线</p>    <p>此外,与其他算法相比,SeetaFace Detector 在速度上有一定优势。对于 640x480 大小的 VGA 图像,检测速度的对比情况如表 1 所示。其中,SeetaFace 的速度在单个 3.40GHz 的 i7-3770 CPU 上测得,Cascade CNN 在 CPU 上的速度在 2.0GHz 的 CPU 上测得(引自原文)。而各方法在 GPU 上的速度在 NVIDIA Titan Black GPU 上测得。</p>    <p style="text-align: center;"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/ca676a26f4c1fc98fbad01139d72c999.jpg" /></p>    <p style="text-align:left"><strong>特征点定位模块 SeetaFace Alignment</strong></p>    <p>面部特征点定位(人脸对齐)在人脸识别、表情识别、人脸动画合成等诸多人脸分析任务中扮演着非常重要的角色。由于姿态、表情、光照和遮挡等因素的影响,真实场景下的人脸对齐任务是一个非常困难的问题。形式上,该问题可以看作是从人脸表观到人脸形状的复杂非线性映射。为此,SeetaFace Alignment 采用的是我们提出的一种由粗到精的自编码器网络(Coarse-to-Fine Auto-encoder Networks, CFAN)来求解这个复杂的非线性映射过程。</p>    <p>如图 4 所示,CFAN 级联了多级栈式自编码器网络,其中的每一级都刻画从人脸表观到人脸形状的部分非线性映射。具体来说,输入一个人脸区域(由人脸检测模块得到),第一级自编码器网络直接从该人脸的低分辨率版本中快速估计大致的人脸形状 S0。然后,提高输入人脸图像的分辨率,并抽取当前人脸形状 S0(相应提升分辨率)各特征点位置的局部特征,输入到下一级自编码器网络来进一步优化人脸对齐结果。以此类推,通过级联多个栈式自编码器网络,在越来越高分辨率的人脸图像上逐步优化人脸对齐结果。</p>    <p style="text-align: center;"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/d4f2ce74bd634e8c9c31748ecfacdaf7.jpg" /></p>    <p style="text-align:center">图 4. 基于由粗到精自编码器网络(CFAN)的实时人脸对齐方法</p>    <p>此次开源的 SeetaFace Alignment 基于上述 CFAN 方法实现了 5 个面部关键特征点(两眼中心,鼻尖和两个嘴角)的精确定位,训练集包括 23,000 余幅人脸图像(标注了 5 点)。需要注意的是,为加速之目的,在基本不损失精度的情况下,开源实现中将 CFAN 级联的数目减少到了 2 级,从而可在单颗 Intel i7-3770 (3.4 GHz CPU)上达到每个人脸 5ms 的处理速度(不包括人脸检测时间)。</p>    <p>图 5 给出了一些用 SeetaFace Alignment 开源引擎定位面部 5 点的效果示例,可见其对表情、姿态、肤色等均具有较好的鲁棒性。在 AFLW 数据集上的量化评价和对比情况如图 6 所示,其中平均定位误差根据两眼中心距离做了归一化。不难看出,SeetaFace Alignment 取得了 state-of-the-art 的定位结果。</p>    <p style="text-align:center"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/8dc265a004d2113d89c1a1507c37904f.jpg" /></p>    <p style="text-align:center">图 5. SeetaFace Alignment 定位结果示例</p>    <p style="text-align:center"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/2d3bc43b9dc84288f75b1c72d0743197.jpg" /></p>    <p style="text-align:center">图 6. SeetaFace Alignment 在 AFLW 数据集上的定位误差及对比情况</p>    <p>其中 LE:左眼,RE:右眼,N:鼻尖,LM:左嘴角,RM:右嘴角</p>    <p><strong>人脸特征提取与比对模块 SeetaFace Identification</strong></p>    <p>人脸识别本质上是要计算两幅图像中人脸的相似程度,其一为<strong>注册阶段</strong>(类比人的相识过程)输入系统的,另一幅为<strong>识别阶段</strong>(即再见时的辨认过程)的输入。为此,如图 7 所示,一套全自动的人脸识别系统在完成前述的人脸检测与人脸对齐两个步骤之后,即进入第三个核心步骤:<strong>人脸特征提取和比对</strong>。这个阶段也是深度学习风起云涌之后进步最大的模块,目前大多数优秀的人脸识别算法均采用卷积神经网络(CNN)来学习特征提取器(即图 7 中的函数F)。</p>    <p style="text-align:center"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/02a49cd1a2792b031f5f704fd32886cd.jpg" /></p>    <p style="text-align:center">图 7. 人脸识别系统的核心流程</p>    <p>SeetaFace 开源的人脸特征提取模块也是基于卷积神经网络的。具体地说,其实现的是深度卷积神经网络 VIPLFaceNet:一个包含 7 个卷积层与 2 个全连接层的 DCNN。其直接修改自 Hinton 教授的学生 Alex Krizhevsky 等于 2012 年设计的 AlexNet(即引爆 CNN 在视觉中广泛应用的网络)。</p>    <p>如表 2 对比所示,与 AlexNet 相比,VIPLFaceNet 将 5x5 的卷积核拆分为两层 3x3 的卷积核,从而增加了网络深度,而并没有增加计算量;VIPLFaceNet 还减少了每个卷积层的 kernel 数目以及 FC2 层的节点数。同时,通过引入 Fast Normalization Layer(FNL),加速了 VIPLFaceNet 的收敛速度,并在一定程度上提升了模型的泛化能力。测试表明,在相同训练集情况下,VIPLFaceNet 在 LFW 测试集上识别错误率比 AlexNet 降低了 40%,而训练和测试时间分别为 AlexNet 的 20% 和 60%。</p>    <p style="text-align:center"><img alt="什么是SeetaFace开源人脸识别引擎" src="https://simg.open-open.com/show/59c28ca4efeaee0e6e83fd7ccc180ebf.jpg" /></p>    <p>与开源的 SeetaFace Identification 代码一起发布的人脸识别模型是使用 140 万人脸图像训练出来的,这些训练图像来自于约 1.6 万人,其中既有东方人也有西方人。人脸特征直接采用 VIPLFaceNet FC2 层的 2048 个结点的输出,特征比对可简单采用 Cosine 计算相似度,然后进行阈值比较(验证应用)或排序(识别应用)即可。</p>    <p>该引擎在多数人脸识别场景下均具有良好的性能,例如,在 LFW standard Image-Restricted 测试协议下,使用 SeetaFace Detector 与 SeetaFace Alignment 检测并对齐人脸,采用 SeetaFace Identification 进行特征提取和比对,可以达到 97.1% 的识别正确率(请注意:这是系统全自动运行的结果,对少量不能检到人脸的图像,截取中间区域输入人脸对齐模块即可)。速度方面,在单颗 Intel i7-3770 CPU 上,开源代码提取一张人脸之特征的时间约为 120ms(不含人脸检测和特征点定位时间)。</p>    <p><strong>开源网址</strong></p>    <p>目前,SeetaFace 开源人脸识别引擎已全部发布在 Github 上供国内外同行和工业界使用,项目网址为:<a href="/misc/goto?guid=4958996367718601726">https://github.com/seetaface/SeetaFaceEngine</a></p>    <p>来自: <a href="/misc/goto?guid=4958996367828568217" id="link_source2">雷锋网</a></p>