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

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

I. 介绍

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

II. 模型设计

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

  • 输入层:样本的输入,在本模型中使用的是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 小数据集过拟合现象.net

IV. 评价指标

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


这里写图片描述

所以须要尽量采起相应手段缩小RMSE的值。

V. 训练效果

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

图5.1 最终结果可视化

相关代码教程

相关参考递归

相关文章
相关标签/搜索