在给定Yale数据集上完成以下工作:在给定的人脸库中,通过算法完成人脸识别,算法需要做到能判断出测试的人脸是否属于给定的数据集。如果属于,需要判断出测试的人脸属于数据集中的哪一位。否则,需要声明测试的人脸不属于数据集。
这是一个一对多的人脸比对问题。
数据集为给定Yale人脸数据集。数据集中共涉及15个人,每人11张黑白人脸图像,图像大小为100*100。每张图像已剪裁好位置至正对人脸。该数据集的特点就是,数据少,图像小。如下图:
HOG(Histogram of Oriented Gridients)特征检测算法,最早是由法国研究员Dalal等在CVPR-2005上提出来的,一种解决人体目标检测的图像描述子,是一种用于表征图像局部梯度方向和梯度强度分布特性的描述符。其主要思想是:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓。
HOG特征提取分为以下几个步骤:
1)色彩和伽马归一化:为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。
2)计算图像梯度:计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。
3)构建方向的直方图:将图像划分成cell,cell中的每一个像素点都为某个基于方向的直方图通道投票。
4)将细胞单元组合成大的区间:将相邻的小cell组成block,统计每个block的cell信息,将其归一化,组成新的特征向量。
5)收集HOG特征:将整幅图的block特征向量整合成一个特征向量。
KNN是K nearest neighbor的缩写,中文名称是k-近邻算法。邻近样本,就是离它最近的k个样本,通过计算其与所有已知样本的距离来确定。一般使用的是欧氏距离, 即两点间的空间距离,为两点向量差的L2范数。两个n维向量A(x11,x12,…,x1n)和B(x21,x22,…,x2n)间的欧氏距离为:
分类过程:
1,计算已训练集中样本与待测样本之间的距离
2,按距离排序
3,选取与当前样本距离最小的k个邻居样本
4,确定此k个样本中各个类别的频率
5,频率最高的类别作为该样本的预测分类
注意事项
KNN算法的三要素:k值选择、距离度量和分类决策规则都会对分类结果产生重要影响;
K值选择:K值的选择与样本分布有关,一般选择一个较小的K值,可以通过交叉验证来选择一个比较优的K值,默认值是5;
距离度量:不同的距离度量方法所确定的k个邻近点是不同的,会对结果产生影响,一般选用欧氏距离;
分类决策规则:一般是多数表决,即k个邻居中多的说的算。可以根据不同距离的邻居对该样本产生的影响赋予不同的权重。
在本实验中,我们采用HOG+KNN的方法对我们人脸识别问题进行建模。通过HOG提特征,送入KNN进行分类。具体模型流程如下:
a)预处理图片
b)分配数据:将数据集data划分为不同的train与test(详见数据集处理)
c)对data(train和test)贴标签(1-11)
d)train训练出一个model
e)传入test,计算acc_class
在本实验中,采用的一个初始网络如下:
2次3*3卷积,然后maxpooling一次,后面加6个残差块,一共15层。每个残差块2次卷积,每次卷积后都进行BN(批量归一化)+ReLU激活。残差块结构图如下:
设置训练参数:
超参数 | 数值设置 |
---|---|
Batch_size | 64 |
Learning rate | 0.001 |
Iteration | 100000 |
num_images_per_id | 4 |
batch_size=16,num_images_per_id=4,则表示每个iteration都随机抽取16个id,每个id4张图来训练。
本实验选择了余弦相似性度量,为什么不是常用的softmax分类器?
给定一个具有N张训练图像的数据集,其中,相关的类标签为L,深度网络的标准方法是使用卷积神经网络处理输入图像,并在网络顶部放置一个softmax分类器,用于计算每个类的得分,softmax分类器将会选择概率最大的类作为输出。通过训练ResNet模型实现对同一类物体的关联性度量,对于若干张同类物体的图片,由softmax分类器所获得的后验概率并不能用来表征这些图片中物体的相似性。
本实验首先利用基于余弦相似性度量的ResNet模型对人脸的外观进行线下预训练,得到表征人脸外观的128维特征向量作为外观描述子,然后在线上跟踪过程中,为每一个图片库创建一个特征向量集,存储最近成功关联的100帧图片的特征向量,其中=100。并提出深度关联度量的概念,即将100个由深度学习得到的特征向量中与当前帧的检测目标集之间余弦距离最小的结果作为外观匹配度,对图片库集和检测目标集进行关联。
HOG+KNN实验在matlab 2014b 上进行。
ResNet的实验环境如下:
数据集的划分:
对于数据集的15个人,我们按不同的比例分成训练集(train)和测试集(test)两部分。分配比例如下:
train : test = 10:1
train : test = 9:2
train : test = 8:3
train : test = 7:4
train : test = 6:5
train : test = 5:6
train : test = 4:7
train : test = 3:8
HOG+KNN实验结果:
可以看到,随着每个人测试图片数量的上升,预测的准确率大部分都在逐渐升高,但是在训练集数目为8时(每人),预测的准确率却低于在训练集数目为7时(每人)的准确率。
噪声集测试:
取前5个人的10张图片作训练集,而5个人的其中一张图片加剩下10个人的全部图片做测试集,测试结果如下图:
该图为误差图,其中横坐标为每个人的图片编号,纵坐标为每个人的编号,蓝色代表预测正确,黄色代表预测错误。
ResNet实验结果:
训练迭代图及误差匹配如下图:
具体错误信息如下图:
具体匹配错误信息矩阵:
本实验中首先对传统手工提取特征进行了分析。HOG提取特征如下图:
实验中对级联匹配进行了分析,对匹配算法的过程可视化:外观特征的余弦度量矩阵:两张图的每个脸之间都有一个相似性度量值,蓝色的是每行每列中最小的,对于大于外观阈值的匹配点,统一赋予一个大于外观阈值的值, 这里外观阈值为0.5,如下图:
使用匈牙利算法,获取最小成本的分配,返回得到两张图的最小成本匹配对之间的索引,如下图:
总而言之,这两种方法都在给定的数据集上达到了很好的效果。HOG+KNN是一种较为传统且有效的人脸识别方式,鉴于数据量较小,与深度学习的方法相比,也得到了和深度学习相当的效果。但当数据集大的时候,深度网络的优势能体现得更明显。
(ps:实验做过挺久了,参考了一些博主的文章,若有博主介意私信我一一列举。)