前言
这个程序完全是基于模式识别课上老师讲的内容实现的。采用基于子空间的正交投影距离的分类器算法
思路
- 以已知的一个人的一组人脸照片作为自变量A,以待判定的一张人脸为因变量Y,尝试做一个回归拟合。
- 以拟合出来的结果计算回归误差 ei。计算所有的人脸的回归误差。以当中的最小误差作为选择标准
实例
比如说,我们有以下实例:
假设数据库中的人脸图片依次为 x11, x12, x13, x21, x22, x23, x31, x32, x33。
待识别对象为 x14, x24, x34
根据思路,代码流程如下:
- 将数据库 9 张图片每一张拉成一个列向量,横向合并为矩阵 A
- 待识别的一张图片拉成列向量,记为 y
- 对于矩阵 A 的每一列 Ai,与 y 做回归拟合。拟合系数计算公式 x=(Ai+)y
Ai+ 代表Ai 的广义逆。
- 计算回归拟合的回归误差。回归误差计算公式 e2=y-Ai.*x
- 选择误差最小的列向量对应的图片,标记为识别结果
代码
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 列被认为是识别对象同一张脸
暂无评论