上一篇博文中,我们了解了人脸检测与面部特征点检测的背景,并提到了当前技术方案存在特征点位置不稳定的缺点,需要新的解决方案。那么,目前又有哪些方案可以用呢?

Github rocks!

在程序员眼中,Github恐怕是比微信还要重要的存在了吧!以“face landmark”为关键词,在Github中一共检索到171项结果。有两项repo吸引了我的注意力,一项是OpenFace[1],在Github上有1.7k多star数;另一项为face-landmark-localization[2],作者是复旦大学的一名博士。

OpenFace

OpenFace来自CMU大学,在简介中它是这样描述的:

OpenFace – a state-of-the art tool intended for facial landmark detection, head pose estimation, facial action unit recognition, and eye-gaze estimation.

此言不假,经过我的实际测试,OpenFace可以实时稳定的对人脸的面部特征点进行检测。不仅如此,它还提供了表情检测与注视点检测的功能,非常强大。

cmu-openface

OpenFace的原理可以参见他们发表的论文,在repo主页可以看到。

face-landmark-localization

从说明与代码来看,作者用dlib作为人脸面部检测器,使用深度学习框架caffe作为特征提取以及特征点的检测器,同时姿态的输出也是基于神经网络。并且在较早的一项issue[3]中,作者表示她的训练数据来源于300-W。

qixing-landmark

哈?300-W又是神马?

人脸特征点检测大赛300-W

经过一番检索,终于在Imperial College London(帝国理工学院)的网站上找到了真身[4]。300-W是300 Faces In-The-Wild Challenge的简称,该项竞赛专注于人脸特征点的检测,并且与ICCV这类著名的计算机视觉活动相伴举行。在该竞赛中,参赛队伍需要从600张图片中检出人脸,并且将面部的68个特征点全部标记出来。更加幸运的是,2016的这篇论文[5]中,作者对现有的9个人脸特征点公开数据库以及2015年300-W竞赛的结果做了详细的描述,一下子节省了我大量的时间。

站在前人肩膀上大概就是这种感觉吧!

人脸特征点数据库

论文中工涉及到了9个人脸特征点数据库,并分成两类。

  1. 可控环境下获得的数据:Multi-PIE、XM2VTS、FRGC-V2和AR。
  2. 不可控环境下获得的数据:LFPW、HELEN、AFW、AFLW和IBUG。

这些数据库的来源多种多样,并且每个从数据库都采用了不同的标记策略和标记数量,导致各个库之间根本不具可比性。幸运的是,作者采用了一种半监督的方法,重新对这些数据库进行了标记!你以为这就很了不起的时候,他们把标记后的数据[6]免费放出来了...

不过,公开的标记数据并不包含全部9个数据库,仅仅包含7个,且有一些数据库仅仅提供了特征点的坐标,不包含图像数据。我简单整理了一下。

  • 300-W:图片+数据。
  • XM2VTS:仅数据,图片需要付费购买。
  • FRGC Ver.2:仅数据,图片需要获得授权才能拿到。
  • LFPW:图片+数据。
  • HELEN:图片+数据。
  • AFW:图片+数据。
  • IBUG:图片+数据。

所以,最后拿到手的有效数据集只有5个:300-W、LFPW、HELEN、AFW和IBUG。总共3.2GB,大约有4000多份样本。这个数量的样本恐怕是不够的。

在浏览官网的时候有一个意外的发现:300-W竞赛的进阶版300-VW[7],同样是面部特征点的检测,只不过检测的对象从图片变成了视频。数据集提供了几乎每一帧的人脸特征点数据。所以一段20秒的视频可以提取出约500张画面,300-VW里大约有500多段视频,所以理论上可以提取出大概250000份图片样本!

啊!此刻心中的感觉复杂而难以描述。

检测方法

除了数据集意外,论文还对2015年提交的TOP5检测方法做了总结概括。其中一篇采用深度学习的方案吸引了我的注意力。论文题为”Approaching Human Level Facial Landmark Localization by Deep Learning[8]”,作者来自国内一家知名的公司旷视科技[9]

这篇论文中,作者采用了两级神经网络级联的方式,实现了由粗到细的landmark检测。

第一级网络负责从图片中初步检出68个特征点的大致位置。不算pooling layer共计10层,输入层大小为128x128,8个卷积层,2个全连接层。在第一级网络完成检测后,根据检测到的68个特征点计算人脸姿态,然后将姿态“矫正”到接近正脸,然后把矫正后的、分别包含68个点的较小一点的图像区域输入到第二级神经网络。

第二级神经网络负责对检测结果进行细化,输出最终的坐标。这一级不算pooling layer共计7层,输入层大小28x28,5个卷积层,2个全连接层。需要注意的是,第二级神经网络的数量众多,每一个特征点对应了一个神经网络。

旷视科技应该是将该方法用在人脸识别上。如果需求精度不高,可以考虑仅仅使用第一级网络结构输出68个特征点的位置。

接下来的计划

数据有了,方法上神经网络看起来有戏。接下来就该动手了!在下一篇文章中,我们将对现有数据进行分析,尝试找到适合神经网络训练的数据集表示方法。


  1. https://github.com/TadasBaltrusaitis/OpenFace ↩︎

  2. https://github.com/qiexing/face-landmark-localization ↩︎

  3. https://github.com/qiexing/face-landmark-localization/issues/5 ↩︎

  4. 300 Faces In-the-Wild Challenge (300-W) ↩︎

  5. 300 Faces In-The-Wild Challenge: database and results ↩︎

  6. iBUG Facial point annotations ↩︎

  7. 300 Videos in the Wild (300-VW) Challenge & Workshop (ICCV 2015) ↩︎

  8. Approaching Human Level Facial Landmark Localization by Deep Learning ↩︎

  9. https://www.megvii.com/ ↩︎