本篇文章3269字,读完约8分钟

雷锋。(公开号码:雷锋。科技评论出版社:你可能已经在一些手机软件上看到过给人脸添加特殊效果的应用。他们给自画像视频添加了一些可爱有趣的对象,其中一些更有趣,可以通过检测表情自动选择相应的对象。本文将推广一种使用深度学习的人脸表情检测方法,并简要介绍传统的检测方法。

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

过去,很难检测人脸及其特征,包括眼睛、鼻子和嘴巴,甚至很难从它们的形状中提取表情。现在,这项任务可以通过深入学习神奇地解决,任何聪明的年轻人都可以在几个小时内完成。本文由佐治亚理工学院的学生彼得·斯克瓦莱宁纳的雷·科技评论编辑,将介绍这种实现方法。

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

传统方法

假设你像我一样需要人脸跟踪(在本文中,一个人的面部运动通过网络摄像头与动画角色同步)。您可能会发现,之前实现此任务的最佳算法是基于剑桥人脸跟踪器或openface的局部约束模型(clm)。该方法将检测任务分解为几个步骤,即检测形状向量特征(asm)、布丁图像模板(aam)和使用预先训练好的线性支持向量机进行检测优化。

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

首先对关键点进行粗略估计,然后利用预先训练好的包含人脸信息的图像进行svm处理,同时对关键点的位置进行校正。重复这个过程很多次,直到误差低于我们的要求。此外,值得一提的是,该方法假设图像上的人脸位置已经被估计,例如使用viola-jones检测器(哈尔级联)。然而,这种方法非常复杂,高中生很难实现。总体结构如下:

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

深度学习为了实现本文开头提到的目标,让青少年能够进行人脸检测,我们介绍了深度学习的方法。在这里,我们将使用一个非常简单的卷积神经网络(cnn)在一些包含人脸的图像上检测人脸的重要部分。为此,我们首先需要一个培训数据库。在这里,我们可以使用卡格尔提供的人脸识别挑战数据库,它包含15个关键点;或者更复杂的数据库muct,它有76个关键点(太好了!).

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

显然,高质量的图像训练数据库是必不可少的。在这里,我们向那些“可怜的”大学生致敬,他们“牺牲”了他们的时间和精力来标记这些毕业图像,以便我们能够进行这些有趣的实验。

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

以下是基于kaggle数据库的巴洛克面部外观和关键点:

该数据库由15个关键点的96*96分辨率图像组成,包括双眼5个点和鼻口5个点。

对于任何图像,我们必须首先定位脸部,也就是说,使用上面提到的viola-jones检测器,并基于哈尔级联架构(如果你仔细观察这个实现过程,你会发现它类似于cnn的概念)。如果你想更进一步,你也可以使用fcn(完全卷积网络)和使用深度预测图像分割。

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

无论您使用什么方法,opencv都很简单:

灰度_图像= cv2.cvtcolor(图像,cv2.color_rgb2gray)

face_cascade =

cv2 . cascadeciabler(' haarcscade _ frontal face _ default . XML '

(

边框(_ box =)

face _ cascade . detect多尺度(灰度_图像,1.25,6)

使用以上几行代码,您可以在图像中框住脸部。

然后,对于每个返回的人脸帧,我们提取相应的子图像,将其调整为灰度图像,并将大小转换为96*96。新生成的图像数据成为我们完整的cnn网络的输入。cnn的架构采用最常见的5*5卷积层(实际上,每层有3层,每层有24、36和48个relus),然后使用2个3*3卷积层(每层有64个relus),最后使用3个完全连接的层(包括500、90和30个单元)。同时,最大池用于避免过度合并全局平均池,以减少平滑参数的数量。这种架构的最终输出是30个浮点数,它们对应于15个关键点的x和y坐标值。

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

以下是keras的实施过程:

模型=顺序()

model . add(batchnormalization(input _ shape =(96,96,1)))

model.add(卷积2d(24,5,5,border_mode= "相同"、

init='he_normal ',input_shape=(96,96,1),

dim_ordering="tf "))

model.add(激活(“relu”))

model . add(max pool 2d(pool _ size =(2,2),steps =(2,2),

border_mode="valid "))

model.add(卷积2d(36,5,5))

model.add(激活(“relu”))

model . add(max pool 2d(pool _ size =(2,2),steps =(2,2),

border_mode="valid "))

model.add(卷积2d(48,5,5))

model.add(激活(“relu”))

model . add(max pool 2d(pool _ size =(2,2),steps =(2,2),

border_mode="valid "))

model.add(卷积2d(64,3,3))

model.add(激活(“relu”))

model . add(max pool 2d(pool _ size =(2,2),steps =(2,2),

border_mode="valid "))

model.add(卷积2d(64,3,3))

model.add(激活(“relu”))

model . add(global average pool 2d());

model . add(density(500,activation="relu "))

model . add(density(90,activation="relu "))

模型. add(密集(30))

您可能希望选择均方根传播(rmsprop)优化和均方误差(mse)作为损失函数和精度指标。您可以在30个训练周期内获得80%-90%的验证精度,并实现模型堆(优化器=' rms prop ',损耗=' MSE ',度量=)

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

[‘精确度’])

check pointer = model check point(file path = ' face _ model . H5,

verbose=1,save_best_only=true)

时代= 30

hist = model.fit(x_train,y_train,validation_split=0.2,

shuffle=true,epochs = epochs,batch_size=20,回调=

[checkpointer],verbose=1)

只需执行以下指令来预测关键点位置:

特征=模型.预测(区域,批次大小=1)

好吧。现在你已经学会了如何检测面部关键点!

请注意,您的预测结果是15对(x,y)坐标值,如下图所示:

如果上述操作不能满足您的需求,您还可以采取以下步骤:

实验如何在保持准确性和提高推理速度的同时减少卷积层和滤波器的数量;

用迁移学习代替卷积(例外是我最喜欢的)

使用更详细的数据库

做一些高级的图像增强来提高鲁棒性

你可能仍然认为这太简单了,所以我建议你学习做一些3d处理。你可以参考facebook和nvidia如何进行人脸识别和跟踪。

此外,你可以用你所学到的东西做一些新奇的事情(你可能总是想做,但不知道如何去做):

在视频聊天中,把一些有趣的图片放在脸上,比如太阳镜、滑稽的帽子和胡子;

交换面孔,包括你和你的朋友、动物和物品等的面孔。

在自拍实时视频中用一些新发型、珠宝和化妆品测试产品;

测试你的员工是因为喝酒不适合某些任务;

从人们的反馈表情中提取流行表情;

Gans用于实时人脸-卡通变换,网络用于实时人脸和卡通表情的同步。

好了~既然你已经学会了如何制作自己的视频聊天过滤器,那就做一个有趣的吧!

《Viadata science @ medium》,雷主编,科技评论。

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

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

地址:http://www.hcsbodzyz.com/hcxw/10210.html