人类只需要很短的时间,就可以记住一个人的样子,并在下次遇到他(她)的时候说出这个人的名字。但是对计算机来说,像人类一样识别人脸是很困难的任务。在深度学习之前,有很多技术尝试让计算机实现“识别”人脸的功能,但是效果都差强人意。现在在深度学习的支持下,人脸识别取得了巨大的成功,已经广泛应用于各类场景。例如,在金融支付领域,已经在越来越多地使用人脸识别技术,误差达到了亿分之一的水平。
那么人脸识别是如何做到的呢?人类是通过提取不同的个体所对应的人脸的特征后,根据这些特征进行识别。特征是学习过程中的重要概念,是一个对象区别于其他对象的地方,任何“识别”都需要通过找到这些“特征”才能完成。
例如,对于汽车来说,车标就是最好的特征之一,通过车标可以快速识别出它是什么品牌。进一步,如果想获得车辆的具体型号,就需要更深层的特征,例如:
①车的形状;
②车的发动机和排量;
③车的其他参数等。
一般地,用来进行识别的特征需要满足下述特点。
①能够区分不同的对象;
②容易提取;
③容易比对。
例如,区分不同的人,一个常用的方法是识别他们的指纹特征。指纹特征包括分叉数量、分叉点、指纹形状等,这些特征,用指纹采集器瞬间就可以确定。指纹能够区分不同的人,同时在采集器地支持下容易提取也容易比对。也就是说,指纹是满足上述特点的“特征”。
在人脸识别这样的任务中,人脸的特征是什么?有些非常简单的特征,例如:
①眼睛数量:2;
②鼻子数量:1;
③眼睛连线与鼻子中线垂直。
但绝大多数人的这些特征是相同的,所以此类特征并不足以区分两个人。如何挖掘更深层次的人脸特征呢?在使用深度学习之前,直方图以及基于直方图的特征使用得较为广泛,而且基于直方图的识别方法现在仍然在行业中使用。下面给出直方图的定义和说明。
直方图是统计中经常使用的图表之一,英文叫作Histogram,也叫作质量分布图,是由统计学家卡尔·皮尔逊首先提出的。
直方图使用一系列高度不等的纵向条纹或线段描述数据的分布情况。一般用横轴表示数据区间,纵轴表示分布情况。它是一种精确地描述数值型数据分布的图形表示方法。
构建直方图可遵循如下步骤。
①将数据的取值范围进行划分,分成一系列相连的区间,注意划分完毕的区间的长度通常是(但这不是必需的)相等的;
②计算取值落在相应区间中的数据的条数;
③该区间的纵轴坐标表示取值数量的占比,即
下面以一个班级某门考试的成绩作为例子来熟悉直方图的构建方法,所使用的数据如表8-1所示。
表8-1 成绩分布
可以看到,成绩分布在60到100之间,假设学校按照如下方式划分成绩的等级。
优:90~100;
良:80~89;
中:70~79;
及格:60~69。
这相当于将[60,100]这个区间划分成了4个小区间。接下来用直方图来观察数据的分布情况。读者可以先自己动手统计,然后学习用Python来生成直方图(图8-1)。
In[1]:import pandas as pd
#导入pandas 模块
In[2]:data=pd.read_excel('grade.xlsx',header=0)
In[3]:data.shape
Out[3]:(20,2)
In[4]:data['成绩'].hist(bins=4)
#指定成绩所在列的数据是分析对象,bins的含义是把指定数据分成几部分
图8-1 成绩分布直方图
该直方图反映了这个班级的成绩的重要特征。
想象这样的场景:某一所学校对不同的班级,都建立了类似的直方图。在考试之后,如果学校依据成绩对班级进行分类,则教务处只需要使用4个参数(优、良、中、及格各自的数量),就可以对不同班级的学习状况进行大致的分类了,而无须比较每个班级所有同学的考试成绩。当然如果采用上述划分方式后,有两个班级成绩分布相同,那么这4个参数就不足以区分这两个班级,需要进一步挖掘更细致的特征。
一般的人脸识别是通过采集到的人脸照片来进行识别的,对于一张含有人脸的图片,可以使用它的颜色分布(或者灰度分布)作为数据生成直方图,而不同的人脸颜色数据对应的直方图一般是不同的,这样就可以区分不同的人脸了,第二节将会更详细地介绍如何使用这种方法区分人脸。