Sweety

Practice makes perfect

导航

卷积神经网络检测脸部关键点-theano

Posted on 2018-01-11 20:42  蓝空  阅读(714)  评论(0编辑  收藏  举报

前段时间做了一个kaggle上的一个很早的小项目,就是检测脸部关键点,Python环境好弄,但是当时为了速度用CPU加速,搞了将近一天(相关教程),其实详细流程也是根据一个相关教程上面的。防止丢失,把代码分享出来。

I. 介绍

卷积神将网络监测脸部关键点项目是是一个由Kaggle发起的在线比赛题目。该项目给出相关脸部96*96像素的人脸图片,目的是监测出人脸识别中最关键的15个点(也就是x、y共30个输出参数),来提取人脸识别中的关键点。在文章中,通过问题分析,介绍了使用卷积神经网络的方法(简称CNN)进行特征提取的过程,并对该问题解法进行了评价和改进意见。

II. 模型设计

本次采用LeNet-5的卷积神经网络,因为其在图像处理方面有着核心的作用,在该设计模型中,使用了卷积神经网络中的几个重要层,介绍如下:

  • 输入层:样本的输入,在本模型中使用的是1*96*96图像原始像素值,其中1代表灰度图像,也就是一个通道。
  • 卷积层:神经元与输入层中的一个局部区域相连,每个神经元都计算自己与输入层相连的小区域与自己权重的内积。卷积层会计算所有神经元的输出。在本模型中有多个卷积层,用于特征提取,其中滤波器采用theano中CNN原始滤波器。使用了3个卷积层,大小分别为[3*3]、[2*2]、[2*2]。
  • 汇聚层:在在空间维度(宽度和高度)上进行降采样(down sampling)操作,本模型采用两个[2*2]的汇聚层。
  • 全连接层将会计算分类评分,全连接层与常规神经网络一样,其中每个神经元都与前一层中所有神经元相连接。本模型使用了3个全连接层,分别是两个隐层和一个输出层,隐层大小为1000个神经元,输出层大小为30个神经元,即为最终结果。

另外,本模型采用学习动量的方式递归下降更新神经网络中的参数,也就是对其学习率(步长)进行动态的调整,在开始令其学习率较大,这样加快参数更新次数,随着次数的增加,减小学习率,防止其在最优解附近产生震荡的现象,从而从整体上提高模型效果,减小误差。
数据输入
输入数据为1个通道的灰度图像,其大小为[1*96*96],但是在图像中有部分干扰图像,也就是不是单纯的头部图像,其中正常的图像输出显示如图2.1。

图片描述
图2.1输入图片数据可视化

但是数据集中有部分脸部重要坐标确实,因此在7000多个训练集中,只有大概2000多个是完整的,需要作出相应处理,在本模型中暂时使用完整的数据集数据。
数据输出
识别出的具体脸部重要位置坐标(x,y)
根据训练集中的数据进行训练,相应的输出与之相同,即分别为如下变量对应x和y值:left_eye_center,right_eye_center,left_eye_inner_corner,left_eye_outer_corner,right_eye_inner_corner,right_eye_outer_corner,left_eyebrow_inner_end,left_eyebrow_outer_end,right_eyebrow_inner_end,right_eyebrow_outer_end_,nose_tip,mouth_left_corner,mouth_right_corner,mouth_center_top_lip,mouth_center_bottom_lip。这正是将要被预测的属性。
输出坐标可以可视化为如下图2.2.
这里写图片描述
图2.2 输出参数可视化

III. 数据输入和处理

首先进行数据输入。由于数据集中部分数据时是缺失的,因此对输入数据需要特殊处理,也就是对输入数据的进行过滤处理,也就是对csv数据进行筛选,选择出完整的数据集合,数据集大概大小是2000多个;
其次进行相应的数据填充。由于完整的数据集数目较少,因此如果仅仅使用少量数据,其将会在训练后期出现严重的过拟合现象,具体图像可视化如图3.1所示。所以对其进行相应的数据扩充操作,数据扩充的意思是我们人为地通过一些手段(变形、添加噪声等等)增加训练用例的个数。批量迭代器的工作是采集一个训练集合的样本矩阵,分成不同的批次(在本模型中采用128个用例一批)。当把训练样本分成批次的时候,批处理迭代器可以顺便把输入变形这件事做的又快又好。我们在进行批处理迭代的时候,以50%的几率进行水平翻转。这非常的方便,对某些问题来说这种手段可以让我们生产近乎无限的训练集,而不需要增加内存的使用。因此本模型中采取将图片翻转的方式进行扩充。

图3.1 小数据集过拟合现象

IV. 评价指标

按照官方的评价标准,采用的是RMSE的误差衡量标准:


这里写图片描述

因此需要尽可能采取相应手段缩小RMSE的值。

V. 训练效果

该模型最终跑在酷睿i5,搭载NVIDIA GeForce750M上,训练1000 epoch大概需要花费两个小时,每个epoch时间大概在7-8秒之间。
根据III小结中数据扩充方法,在进行图像扩充前后的结果显示可以看到效果有所提升,并且过拟合现象也有所缓解。
为详细描述最终效果,该模型最终详细结果可视化如图5.2所示。
这里写图片描述

图5.1 最终结果可视化

相关代码

相关参考