教你一个简单的深度学习方法检测人脸面部特征

作者: 佚名 2017-09-04 20:06:32

笔者按:你可能在一些手机软件上已经看到了给人脸增加特效的app,它们将一些可爱有趣的物体添加到自拍视频中,有些更有趣的还能检测表情自动选择相应的物体。这篇文章将会科普一种使用深度学习进行人脸表情检测的方法,并简要介绍下传统的检测方法。

教你一个简单的深度学习方法检测人脸面部特征

在过去,检测面部及其特征,包括眼睛、鼻子、嘴巴,甚至从它们的形状中提取表情是非常困难的,而现在,这项任务可以通过深度学习“神奇”地得到解决,任何一个聪明的年轻人都可以在几个小时内完成。雷锋网 AI 科技评论编译的这篇来自佐治亚理工大学学生 Peter Skvarenina 的文章将介绍这一实现方法。

“传统”的方法(CLM)

假设你和我一样,现在需要进行人脸追踪(在这篇文章的情况下,是指将一个人的面部动作通过网络摄像头同步到一个动画人物上去),你可能会发现,以前实现这个任务最好的算法是局部约束模型(CLM),基于Cambridge Face Tracker或者OpenFace。这种方法是将检测的任务进行分解,分成检测形状向量特征(ASM)、布丁图像模板(AAM)和使用预先训练的线性SVM进行检测优化这几个步骤逐一处理。

教你一个简单的深度学习方法检测人脸面部特征

首先对关键点进行粗略估计,然后使用含有部分人脸信息的预训练的图像进行SVM处理,同时对关键点的位置进行校正。重复这个过程多次,直到其产生的误差低于我们的要求。另外,值得一提的是,这一方法假定了图像上的人脸位置已经被估计,如使用Viola-Jones检测器(Haar级联)。但是,这种方法非常复杂并不是高中级别的学生可以轻易实现的,整体架构如下:

教你一个简单的深度学习方法检测人脸面部特征

深度学习(Deep Learning)

为了实现文中一开始提到的,使得青少年可以进行人脸检测的目标,我们向大家介绍深度学习的方法。在这里,我们将会使用一种非常简单的卷积神经网络(CNN,convolutional neural network)并在一些含有人脸的图像上进行人脸重要部位的检测。为此,我们首先需要一个训练的数据库,这边我们可以使用Kaggle提供的人脸部位识别挑战赛的数据库,包含15个关键点;或者一个更复杂些的数据库MUCT,它有76个关键点(超棒的!)。

很显然的,有质量的图像训练数据库是必不可少的,这里,我们向“可怜的”本科学生致敬,他们为了毕业“牺牲”了自己的时间和精力对这些图像进行了标注,从而使得我们可以进行这些有趣的实验。

如下是基于Kaggle数据库的巴洛克面部和关键点的样子:

教你一个简单的深度学习方法检测人脸面部特征

这个数据库是由灰度96*96分辨率的图像组成的,并且有15个关键点,分别包含两个眼睛各5个点、鼻子嘴巴共5个点。

对于任何一个图像来说,我们首先要对脸部进行定位,即使用上文提到的Viola-Jones检测器并基于Haar级联架构(如果说你仔细看看这一实现过程,会发现它与CNN的概念相近)。如果你想更近一步,也可以使用全卷积网络(FCN,Fully Convolutional Network)并使用深度预测进行图像分割。

教你一个简单的深度学习方法检测人脸面部特征

不管你使用什么方法,这对OpenCV来说都很简单:

  1. Grayscale_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)  
  2. face_cascade =  
  3. cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’  
  4.  
  5. bounding_boxes =  
  6. face_cascade.detectMultiScale(grayscale_image, 1.25, 6) 

使用如上的几行代码,可将图像中的人脸框出来。

然后,对每一个返回的人脸框,我们提取其中相应的子图像,将它们调整到灰度图像并将尺寸转换为96*96。新产生的图像数据则成为了我们完成的CNN网络的输入。CNN的架构采用最通用的,5*5的卷积层(实际上是3个layer,每层分别是24、36和48个ReLU),然后用2个3*3的卷积层(每个有64个ReLU),最后使用3个全连接层(包含500、90和30个单元)。同时使用Max Pooling来避免过拟合并使用global average pooling来减少平滑参数的数量。这一架构的最终输出结果是30个浮点数,这对应着15个关键点每个的想x,y坐标值。

如下是Keras的实现过程:

  1. model = Sequential()  
  2. model.add(BatchNormalization(input_shape=(96, 96, 1)))  
  3. model.add(Convolution2D(24, 5, 5, border_mode=”same”,  
  4. init=’he_normal’, input_shape=(96, 96, 1),  
  5. dim_ordering=”tf”))  
  6. model.add(Activation(“relu”))  
  7. model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  8. border_mode=”valid”))  
  9. model.add(Convolution2D(36, 5, 5)) 
  10. model.add(Activation(“relu”))  
  11. model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  12. border_mode=”valid”))  
  13. model.add(Convolution2D(48, 5, 5))  
  14. model.add(Activation(“relu”))  
  15. model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  16. border_mode=”valid”)) 
  17. model.add(Convolution2D(64, 3, 3))  
  18. model.add(Activation(“relu”))  
  19. model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2),  
  20. border_mode=”valid”))  
  21. model.add(Convolution2D(64, 3, 3))  
  22. model.add(Activation(“relu”))  
  23. model.add(GlobalAveragePooling2D());  
  24. model.add(Dense(500, activation=”relu”))  
  25. model.add(Dense(90, activation=”relu”))  
  26. model.add(Dense(30)) 

你可能想选择均方根传播(rmsprop)优化和均方误差(MSE)作为损失函数和精度指标。只需要在输入图像上使用批处理正常化和全局平均遍历(global average polling)和HE normal weight初始化,你就可以在30个训练周期内获得80%-90%的验证准确率并实现<0.001的误差:

  1. model.compile(optimizer=’rmsprop’, loss=’mse’, metrics=  
  2. [‘accuracy’])  
  3. checkpointer = ModelCheckpoint(filepath=’face_model.h5',  
  4. verbose=1, save_best_only=True 
  5. epochs = 30  
  6. hist = model.fit(X_train, y_train, validation_split=0.2,  
  7. shuffle=True, epochs=epochs, batch_size=20, callbacks=  
  8. [checkpointer], verbose=1) 

教你一个简单的深度学习方法检测人脸面部特征

教你一个简单的深度学习方法检测人脸面部特征

简单的执行如下指令对关键点位置进行预测:

  1. features = model.predict(region, batch_size=1) 

好了!现在你已经学会了怎么去检测面部关键点了!

提醒一下,你的预测结果是15对(x,y)坐标值,可在如下图像中表现出来:

教你一个简单的深度学习方法检测人脸面部特征

如果上述的操作还不能满足你的需求,你还可以进行如下步骤:

  • 实验如何在保持精度和提高推理速度的同时减少卷积层和滤波器的数量;
  • 使用迁移学习来替代卷积的部分(Xception是我的最爱)
  • 使用一个更详细的数据库
  • 做一些高级的图像增强来提高鲁棒性

你可能依然觉得太简单了,那么推荐你学习去做一些3D的处理,你可以参考Facebook和NVIDIA是怎么进行人脸识别和追踪的。

另外,你可以用已经学到的这些进行一些新奇的事情(你可能一直想做但不知道怎么实现):

  • 在视频聊天时,把一些好玩的图片放置在人脸面部上,比如:墨镜,搞笑的帽子和胡子等;
  • 交换面孔,包括你和朋友的脸,动物和物体等;
  • 在自拍实时视频中用一些新发型、珠宝和化妆进行产品测试;
  • 检测你的员工是因为喝酒无法胜任一些任务;
  • 从人们的反馈表情中提取当下流行的表情;
  • 使用对抗网络(GANs)来进行实时的人脸-卡通变换,并使用网络实现实时人脸和卡通动画表情的同步。

好了~你现在已经学会了怎么制作你自己的视频聊天滤镜了,快去制作一个有趣的吧!

深度学习 检测 人脸追踪
上一篇:IEEE论文提出径向变换实现图像增强 下一篇:深度学习可视化工具大盘点(附资源)
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

18个挑战项目带你快速入门深度学习

AlphaGo 大战李世?h之后,深度学习技术便在国内变得异常火。吸引了大批的技术人员争相学习,那么到底如何才能更快速的入门深度学习呢?下面给大家介绍的 18 个挑战项目,通过实践动手带你快速入门深度学习!

实验楼 ·  3天前
盘点 | 8个你可能不知道的深度学习应用案例

深度学习与传统机器学习系统的不同之处在于,它能够在分析大型数据集时进行自我学习和改进,因此能应用在许多不同的领域。

天极网 ·  3天前
2019年较热门的5大深度学习课程

今天,我们将和大家盘点一下,当下较流行的深度学习资源/课程,可以帮助你们提升深度学习技能。

猿哥 ·  2019-09-26 05:16:24
DeepMind一次性开源3个新框架!深度强化学习应用落地即将迎来春天?

深度强化学习(Deep Reinforcement Learning,DRL)一直是近年来人工智能的一些重大突破的核心。然而,尽管 DRL 有了很大的进步,但由于缺乏工具和库,DRL 方法在主流解决方案中仍然难以应用。

杨鲤萍 ·  2019-09-20 09:38:18
一步一步带你完成深度学习与对象检测之人脸识别

要进行人脸识别,就要搜集用户的人脸图片,我们从网站上搜集了几个明星的照片来进行本期文章的分享。此部分文章是人脸识别的第一部分,人脸数据的搜集与提取,后期我们分享人脸识别系统的神经网络训练与人脸识别。

人工智能研究所 ·  2019-09-18 07:20:34
看懂这十步,8岁的小朋友都能理解深度学习

如果对当今人工智能的主流技术——深度学习没有了解,可能真的会有人觉得,当前的科学家们在创造无所不能、无所不知的电影AI形象。那么,如何用最浅显的方式,给大众解释什么是深度学习呢?快来看看吧!

佚名 ·  2019-09-17 16:56:39
PyTorch版《动手学深度学习》开源了,最美DL书遇上超赞DL框架

李沐等人的开源中文书《动手学深度学习》现在有 PyTorch 版实现了。不论是原书中的示例代码,还是实战项目,原来的 MXNet 都可以无缝转化到 PyTorch 代码。

ShusenTang ·  2019-09-17 10:23:45
2019年10大机器学习Q&A,面试应知!

本文整理了一些最常见的机器学习面试问题及其相应的回答。机器学习有志者以及经验丰富的ML专业人员可以在面试前以此巩固其基础知识。

读芯术 ·  2019-09-09 11:07:00
Copyright©2005-2019 51CTO.COM 版权所有 未经许可 请勿转载