基于线性回归的人脸识别算法
首先对《Linear Regression for Face Recognition》作者Imran Naseem和Roberto Togneri表示感谢,本文将基于这篇论文介绍如何运用线性回归模型解决人脸问题。欢迎读者评论发言,共同学习进步!
符号说明
符号 | 含义 |
---|---|
\(N\) | 类别数 |
\(q\) | 特征数 |
\(p_i\) | 训练集第 \(i\) 类样本数 |
注:训练集\(X=\{X_1, X_2, \cdots,X_N\}\),其中 \(X_i\) 中所有样本都来自第 \(i\) 类。
简介
对于线性回归相信大家都不陌生,高中的时候我们就已经学了最小二乘法对其进行求解。给定一组离散变量
人脸识别听上去给人一种很高大上的感觉,至少笔者在进入人脸识别研究领域之前是这么觉得的。而,真实世界中人脸识别过程主要由四个阶段组成:人脸检测、图像预处理、面部特征提取和特征识别。首先系统从视频或者相机中捕获图像,检测并分割出其中的人脸区域;接下来通过归一化、对齐、滤波等方法改善图像的质量,这里的质量主要由最终的人脸识别率决定;特征提取(降维)环节尤为重要,其初衷是减少数据量从而减轻计算负担,但良好的特征选取可以降低噪音和不相关数据在识别中的贡献度,从而提高识别精度;特征识别阶段需要根据提取的特征训练一个分类器,对于给定的测试样本,根据训练器对其进行分类。
常见的人脸识别算法可分为重建性质的和判别性质的。前者包括主成分分析(PCA)、独立成分分析(ICA)等方法,这一类方法在图像污染情况下比较鲁棒;后者典型方法为线性判别分析,该类方法往往在图像干净的情况下效果较好。有研究表明,特征空间的选择并不是太重要,真正关键的是特征空间的维度以及分类器的设计。
本文介绍的线性回归分类算法(Linear Regression Classification, LRC)是一种重建算法,用每一类的样本线性组合对测试样本进行重建,效果最好的便为测试样本所在类。这种分类器属于最近子空间法(Nearest Subspace, NS)。
线性回归分类(LRC)
算法介绍
首先得就下面这一点达成共识:来自同一类的样本共处于一个线性空间中。这意味着同一类中的一个样本可以被该类中其他样本线性表示,基于此Imran Naseem等人提出了一个特定于类的模型,并把人脸识别问题转化为线性回归问题。对测试样本 \(y\in R^{q\times 1}\),尝试用同一个类中的所有训练样本对其进行线性表示,表示得最好的类我们就认为是测试样本所在的类。
那么怎么进行线性表示呢?什么才算表示得最好呢?
如图所示,假设训练集中有两个类别,每个类别有三张图片,这时如何判断 \(y\) 属于哪个类别呢?
A:\(y\) 是我的,你看它和我大儿子 \(A_1\) 二儿子 \(A_2\) 三儿子 \(A_3\) 长得都好像啊。
B:你说长得像就像吗,我还说 \(y\) 和我儿子长得像呢。
A:不信咱去问问欧几里得前辈,老前辈肯定支持我。
B:去就去,谁怕谁啊。
O:孩子们,你们找我什么事啊?
A:村里来了个寻亲的大学生,是我家娃,老B非得说是他家的。
B:胡说,明明就是我家的娃,也就我和孩他妈这么优秀才能生出来大学生。
O:原来是这样啊,我来看看。
\[||A_1-y||_2<||B_1-y||, ||A_2-y||_2<||B_2-y||, ||A_3-y||_2<||B_3-y||. \]O:小B啊,\(y\) 确实和小A家三个娃比较像,看来应该是他家的。
B涨红了脸,有些紧张局促。
B:万一发生基因突变了呢,谁不知道我家基因优越,适应能力强。说不定小 \(y\) 结合了我家三个娃的优点呢!
A:哼,你就吹吧。
O:哦?倒也不是不可能,容我再来看看。
\[\hat y_A=\min{(k_1A_1+k_2A_2+k_3A_3-y)}, \hat y_B=\min{(t_1B_1+t_2B_2+t_3B_3-y)}, \hat y_A<\hat y_B. \]O:看起来小 \(y\) 还是小A更像嘛!好吧,就这样吧,我要休息了。
A:哈哈哈,娃是我的了。
B:呜呜呜。
严谨(装b)来说:对于类别 \(i\),寻找一组系数 \(w_{i1},w_{i2},\cdots,w_{ip_i}\) 使其满足 \(y=w_{i1}X_{i1}+w_{i2}X_{i2}+\cdots+w_{ip_i}X_{ip_i}\)。如果存在这样的一组系数,说明测试样本 \(y\) 处于第 \(i\) 类样本生成的线性空间中,从而把 \(y\) 归为第 \(i\) 类。但实际问题中由于噪声等原因的存在,上式等号几乎不会成立,这时怎么判定 \(y\) 类别呢?
令 \(y_i=w_{i1}X_{i1}+w_{i2}X_{i2}+\cdots+w_{ip_i}X_{ip_i},i=1,2\cdots,N\),选择 \(w_i\) 使 \(y_i\) 尽量逼近 \(y\),也就是使 \(distance(y,y_i)\) 尽量小,把其最小值记为 \(d_i(y),i=1,2\cdots,N\)。向量 \(d(y)\) 中最小值对应的坐标 \(\hat y_{class}=argmin_id_i(y)\)即可认为是 \(y\) 的类别,因为 \(y\) 距离这个空间距离更近。
下面展示算法的详细具体流程。
算法:线性回归分类 |
---|
输入:训练集\(X=\{X_1, X_2, \cdots,X_N\}\),其中 \(X_i \in R^{q\times p_i}\);测试样本 \(y\in R^{q\times 1}\). |
流程: 1. 建立每一类测试样本到测试样本的回归模型,计算回归系数 \(\hat\beta_i \in R^{p_i\times1}\), $$\hat\beta_i=(X_iTX_i){-1}X_i^Ty, i=1,2,\cdots,N.$$ 2. 对每个回归系数 \(\hat\beta_i \in R^{p_i\times1}\) 计算回归预测值,\(\hat y_i=X_i \hat\beta_i, i=1,2,\cdots,N\). 3. 计算 \(y\) 和 \(\hat y_i\) 之间距离,$d_i(y)= |
输出:测试样本预测类别 \(\hat y_{class}\). |
个人思考
我们寻找的是某个类别中所有样本到测试样本的一个线性表示,但是为什么算法起名为线性回归人脸识别呢?对于线性回归模型,在求出回归系数后,我们给它一个输入,相应的就会有一个输出。LRC算法中我们给它一张测试人脸图像作为输入,尽管它给出样本预测类别作为输出,但显然输入和输出之间是不存在线性关系的。那么回归究竟在“哪里”呢,它实际的输入和输出又是什么呢?
先来看一下算法中唯一和线性搭边的式子,
\[y_i=w_{i1}X_{i1}+w_{i2}X_{i2}+\cdots+w_{ip_i}X_{ip_i}. \]把 \(X_{i1}, X_{i2}, \cdots,X_{iP_i}\) 理解为自变量,\(y_i\) 理解为因变量,换个符号重新整理一下,
\[y=k_1x_1+k_2x_2+\cdots+k_{p_i}x_{p_i}. \]这样看上去就像理论回归方程了。\(x_i\) 和 \(y\) 的取值为图片的像素,所以回归实际的输入和输出是像素值。具体而言,输入为训练集中某一类别所有图像某一位置的像素值,输出为测试图像同一位置的像素值。
于是出现了反常的现象:样本数居然是固定的,而特征数却可以改变。因为样本数量取决于图像像素值大小,特征数量取决于同一类别中图片数目。
想到这里感觉好有意思,数学真的是太神奇了!
分块LRC算法
分块表示法是处理遮挡人脸识别的一个有效方法。被连续遮挡污染的图像像素都是相邻的,基于这一认知,可以把人脸图像分割为多个子图像,对每个子图像分别进行上面LRC的算法。一般采用投票法确定最终分类结果,但这样会使有噪声的块和干净的块对结果做出相同的贡献,造成不好的后果。例如,如果图像有四分之三的区域被污染了,那么尽管用于识别的有效信息集中在干净的四分之一的区域,但投票法却更多地利用了被污染的四分之三区域的信息,分类结果自然难以差强人意。
减少污染部分对结果的贡献是一件比较困难且复杂的事情,因为人脸图像先验分布是未知的。本文展示了一个简单但有效的算法(PS:真的是简单粗暴!)以降低污染图像块的重要性,从而提高准确率。
把图像均等分为 \(M\) 个块,对每 \(k=1,2,\cdots,M\) 块采用上一节的LRC算法,将算法第 4 步中的 \(min_id_i(y)\) 记为 \(d_k\) 。选用 \(d_k\) 最小值对应的块作为最终分类依据,给出分类结果。
简单地说就是把图像分为 \(M\) 个块,对这些块分别处理。如果第 \(z\) 块位置测试样本被训练样本表示的最好,那么就根据第 \(z\) 块的信息进行分类。太粗暴了吧!这样的话对划分块数的选择肯定不够鲁棒,如果块的大小只够包含一只眼睛, 那么很有可能最终结果就由这个块确定,但其他块包含着另一只眼睛、嘴巴、鼻子等,信息根本就没有得到充分的利用。个人觉得如果对块数限定一个阈值,范围之内采取投票法进行决策可能效果会更好一些。但也许作者早就考虑到了这一点了,只是效果不好,后期有空编程对比一下。
总结
本文介绍了如何运用线性回归模型处理人脸识别的问题。基于同一类样本共处一个线性空间的前提条件,分别建立每一类到测试样本的回归模型,模型解释效果最好的即认为是测试样本的类。针对遮挡问题,本文介绍了一种简单但有效的分块LRC算法。将图像分为多个块,对每个块分别应用LRC算法,选择模型效果最好的块作为分类依旧进行决策。
本人认为分块LRC算法的性能持保留态度,采用阈值投票法其性能应该会提升,后期抽时间做实验验证一下。