每一个实际问题的数据解答都是通过建立并求解一个数学模型,这同样适用于人脸识别。人脸识别就是在寻找一个函数,对于每一张人脸,它都可以完美找出其人脸特征值(可以理解为能够反应出这张人脸核心特征的向量,利用这组特征,可以大概率的识别出该人) ,即图像向量映射为人脸特征向量。
1 一张图片的计算机表示
数字图像是连续的光信号经过传感器的采样在空间域上的表达。一张图像是由一个包含若干个像素点的矩形框组成的,试着把上图在“画图”软件中放大会有更直观的感受,下面是上图放大后的效果。
可以看到图像是由很多个小格子组成的,每个小格子都只有一种颜色,这是构成图像的最小单元——像素(pixel)。彩色图像的每个像素的颜色一般由红绿蓝色 (RGB)三原色叠加形成。通常情况下,RGB各有256级亮度,因此 R,G,B各占8bit,则一个像素就一共24bit。
2 图像灰度化
当彩色图片RGB中的R=G=B时,就说此图片为灰度图片,注意:灰度图片也是三维的RGB,不是像黑白图的一维。
但是在机器学习中,我们把彩图转成RGB相同的灰色图,因为三个维度一样,我们只取一个维度,这样就简化了运算,但是会丢失一些信息。
黑色到白色之间的灰度值(grayscale),如下图:
彩色图像转换成灰度图像最简单的方法是平均法,将同一个像素位置3个通道RGB的值进行平均。
3 什么是深度学习?
机器学习 约等于 寻找一个数学模型来描述事物。
深度学习和所有机器学习方法一样,是一种用数学模型对真实世界中的特定问题进行建模,以解决该领域内相似问题的过程。
例如打麻将胡牌在数学上可以看成是
深度学习就是把计算机要学习的东西看成一大堆数据,把这些数据丢进一个复杂的、包含多个层级的数据处理网络(深度神经网络),然后检查经过这个网络处理得到的结果数据是不是符合要求——如果符合,就保留这个网络作为目标模型,如果不符合,就一次次地、锲而不舍地调整网络的参数设置,直到输出满足要求为止。
深度学习是采用神经网络,用于解决线性不可分的问题。深度学习分为三个步骤:
(1)建立网络架构
(2)决定学习的目标(如误差小于x。。。)
(3)学习,找出“最优”的模型函数
步骤一:定义一系列函数模型(构建网络架构)
权重和偏差就是整个网络的参数,不一样的参数就会定义出不一样的模型函数。给定一组参数,就是定义一个函数;给定一个网络架构,就是定义了一个函数集。因此把参数最佳化,就能获取比较好的结果。
步骤二:决定学习的目标——使整体误差最小
为了使初始模型经过训练后成为一个能够满足我们要求的模型,我们需要准备一个训练集,这个训练集包括训练数据和标签。把所有输入经过模型后输出的误差相加,就得到了总体误差。总体误差应该越小越好,我们需要找的最优模型应该具有最小的误差,而这个模型之间误差的不同的原因在于模型中的参数不同。
步骤三:如何获得“最优”模型?——梯度下降法
4 CNN卷积神经网络
卷积神经网络由三部分构成:
-第一部分是输入层
-第二部分由 n 个卷积层和池化层的组合而组成的
-第三部分由一个全连结的多层感知机分类器构成
卷积神经网络有两大特征,一是局部连接(稀疏连接),二是权值共享(参数共享)。
所谓局部连接,就是卷积层的节点仅仅和其前一层的部分节点相连接,只用来学习局部特征。局部感知结构的构思理念来源于动物视觉的皮层结构,其指的是动物视觉的神经元在感知外界物体的过程中起作用的只有一部分神经元。在计算机视觉中,图像中的某一块区域中,像素之间的相关性与像素之间的距离同样相关,距离较近的像素间相关性强,距离较远则相关性就比较弱,由此可见局部相关性理论也适用于计算机视觉的图像处理领域。因此,局部感知采用部分神经元接受图像信息,再通过综合全部的图像信息达到增强图像信息的目的。
卷积层的另一大特征是权值共享,比如一个3*3的卷积核,共9个参数,它会和输入图片的不同区域作卷积,来检测相同的特征。而只有不同的卷积核才会对应不同的权值参数,来检测不同的特征。如下图所示,通过权值共享的方法,这里一共只有3组不同的权值,如果只用了局部连接的方法,共需要3*4=12个权值参数,而加上了权值共享的方法后,现在仅仅需要3个权值,更进一步地减少参数数量。
5 为何CNN适合图像识别?
6 人脸识别模型训练
假定照片为x,特征值为y,也就是说存在一个函数f(x)=y可以完美的找出照片的人脸特征值。现在我们有一个f*(x)近似函数,其中它有参数w(或者叫权重w)可以设置,例如写成f*(x;w),若有训练集x及其id标识y,设初始参数p1后,那么每次f*(x;w)得到的y`与实际标识y相比,若正确则通过,若错误则适当调整参数w,如果能够正确的调整好参数w,f*(x;w)就会与理想中的f(x)函数足够接近,我们就获得了概率上足够高准确率的f*(x;w)函数。这一过程叫做监督学习下的训练。而计算f*(x;w)值的过程因为是正常的函数运算,我们称为前向运算,而训练过程中比较y`与实际标识id值y结果后,调整参数p的过程则是反过来的,称为反向传播。(参考链接:技术角度详解人脸识别)
假设只训练甲、乙、丙三个人的图片,那么甲乙丙的照片标签向量分别可以定义为:
甲:[1,0,0];乙:[0,1,0];丙:[0,0,1]
假设该次输入图片为甲,最后网络输出一个3维(有多少类就输出多少维)的特征向量,如[-1,3,4],损失函数将其转换到(0~1)的概率空间,[0.1,0.2,0.7],和正确答案[1,0,0]计算损失。由于第一组参数是随机给定,首先的输出和正确答案之间肯定有很大差距。正因为此才要通过这样去反向调整参数从而去逼近正确答案,当与正确答案之间的差距足够小的时候,人脸识别模型就训练好了,训练好的人脸识别模型就可以投入实用了。
人脸图片的二进制表示其实就是一组特征向量,只不过这个特征向量过于庞大且不好去匹配其他人脸,因此需要去冗余和泛化,提取出一组最具代表性的人脸特征来识别人脸。每经过一层网络就是特征向量的一次简化,经过一次卷积就简化一次,经过一次池化又简化一次,经过一层全连接网络又精简一次。
其实网络层数越多,泛化能力越弱,越容易过拟合,只不过因为目前解决的问题(如人脸识别)的复杂度足够高,因此才会出现网络层数越多,性能越好的表现。