https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-and-algorithm/
在上一篇博文中,我们了解了人脸检测与面部特征点检测的背景,并提到了当前技术方案存在特征点位置不稳定的缺点,需要新的解决方案。那么,目前又有哪些方案可以用呢?
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可以实时稳定的对人脸的面部特征点进行检测。不仅如此,它还提供了表情检测与注视点检测的功能,非常强大。
OpenFace的原理可以参见他们发表的论文,在repo主页可以看到。
face-landmark-localization
从说明与代码来看,作者用dlib作为人脸面部检测器,使用深度学习框架caffe作为特征提取以及特征点的检测器,同时姿态的输出也是基于神经网络。并且在较早的一项issue[3]中,作者表示她的训练数据来源于300-W。
哈?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个人脸特征点数据库,并分成两类。
- 可控环境下获得的数据:Multi-PIE、XM2VTS、FRGC-V2和AR。
- 不可控环境下获得的数据: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个特征点的位置。
接下来的计划
数据有了,方法上神经网络看起来有戏。接下来就该动手了!在下一篇文章中,我们将对现有数据进行分析,尝试找到适合神经网络训练的数据集表示方法。