前言

这个程序完全是基于模式识别课上老师讲的内容实现的。采用基于子空间的正交投影距离的分类器算法

思路

  • 以已知的一个人的一组人脸照片作为自变量A,以待判定的一张人脸为因变量Y,尝试做一个回归拟合。
  • 以拟合出来的结果计算回归误差 ei。计算所有的人脸的回归误差。以当中的最小误差作为选择标准

实例

比如说,我们有以下实例:

假设数据库中的人脸图片依次为 x11, x12, x13, x21, x22, x23, x31, x32, x33
待识别对象为 x14, x24, x34

根据思路,代码流程如下:

  1. 将数据库 9 张图片每一张拉成一个列向量,横向合并为矩阵 A
  2. 待识别的一张图片拉成列向量,记为 y
  3. 对于矩阵 A 的每一列 Ai,与 y 做回归拟合。拟合系数计算公式 x=(Ai+)y

Ai+ 代表Ai 的广义逆。

  1. 计算回归拟合的回归误差。回归误差计算公式 e2=y-Ai.*x
  2. 选择误差最小的列向量对应的图片,标记为识别结果

代码

reg.m

function b=reg(x, y)
    b=inv(x'*x)*x'*y;
end

recognize.m

%% m 是误差序列, n 是最小误差下标

function [m n]=recognize(A, y)
    m=[];
    for i=1:size(A,2)
        x=reg(A(:,i),y);
        temp=(y-A(:,i).*x);
        m=[m temp'*temp];
    end
    n=find(m==min(m))
end

使用

a11 = imread('11.png');
a12 = imread('12.png');
...
a33 = imread('33.png');

a11 = double(a11(:));
a12 = double(a12(:));
...
a33 = double(a33(:));

%% 得到人脸数据 A
A = [a11 a12 a13 a21 a22 a23 a31 a32 a33];

%% 输入识别对象 y
y = imread('x.png');
y = double(y(:));

%% 识别
[m n] = recognize(a, b)

%% 输出结果的 m 代表误差序列,n 代表最佳结果的下标
%% 即矩阵 A 第 n 列被认为是识别对象同一张脸