请教高手:关于使用PCA算法实现人脸识别系统(C代码)

Ryan Zhao 2011-01-14 03:54:40
目前在用OPENCV和C实现PCA算法,以下是我对该算法过程的一些理解,先请各位高手帮忙看看理解的有没有问题:

1、从YALE人脸库中读取了20张训练图片(4个人,每个人5张照片)
2、计算这20张照片的平均图片(将所有图片的对应像素的灰度值累加除20)
3、将这20张训练图片合并成一个10000行*20列的矩阵——训练矩阵——X
4、将每张训练图片减去平均图片,并合并为一个10000行*20列的矩阵——去均值矩阵——A
5、矩阵A的转置矩阵AT*A,并将每个元素除以20,得到20*20的协方差矩阵C
6、计算协方差矩阵C的特征值和特征向量,其中特征值为一个20*20的对角矩阵——W,特征向量矩阵为20*20的U_test
7、计算W的-1/2次方矩阵,得到矩阵——W_M
8、计算XT*U_test*W_M,得到子空间矩阵——U(10000行*20列)

完成以上操作后,按照论文上的说法,子空间矩阵中的每个列向量为一个特征脸。通过单步调试,我发现U中的每个数值都非常小,而且都比较接近,通过归一化到0~255空间后,除了最后一个向量可以显示为特征脸的样子以外,其余向量中的数值都非常接近255,显示出一张白色的图片。下面是我的两个问题:

1、以上算法的实现过程是否有误?
2、如何显示特征脸?

注:以上过程用matlab也实现了 结果是一致的
...全文
883 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuxiawang2006 2011-08-18
  • 打赏
  • 举报
回复
不知道楼主的问题解决了没有,特征脸能否正确显示,如何显示的?
guangfakeji 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 jizuobiao 的回复:]
目前在用OPENCV和C实现PCA算法,以下是我对该算法过程的一些理解,先请各位高手帮忙看看理解的有没有问题:

1、从YALE人脸库中读取了20张训练图片(4个人,每个人5张照片)
2、计算这20张照片的平均图片(将所有图片的对应像素的灰度值累加除20)
3、将这20张训练图片合并成一个10000行*20列的矩阵——训练矩阵——X
4、将每张训练图片减去平均图片,并合并为一个10000……
[/Quote]
我做出的特征脸也需要归一化到0-255后才能显示。但是没有全黑或全白的情况。也不知道的是不是正确的!!!!只能摸索前进啊
Ryan Zhao 2011-01-21
  • 打赏
  • 举报
回复
那归一化是怎么操作呢?
[Quote=引用 20 楼 zhengqifire 的回复:]
你自己去百度下吧,一般线代书上都有,我上次用svd实现后发现特征向量竟然不正交了

引用 17 楼 zhengqifire 的回复:

你可以先验证下特征向量是不是正交的
[/Quote]
  • 打赏
  • 举报
回复
你自己去百度下吧,一般线代书上都有,我上次用svd实现后发现特征向量竟然不正交了[Quote=引用 17 楼 zhengqifire 的回复:]

你可以先验证下特征向量是不是正交的
[/Quote]
Ryan Zhao 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zhengqifire 的回复:]
你可以先验证下特征向量是不是正交的
[/Quote]
您归一化的操作是怎么做的呢?
Ryan Zhao 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zhengqifire 的回复:]
你可以先验证下特征向量是不是正交的
[/Quote]
具体怎样测,能简单说明一下么?谢谢
  • 打赏
  • 举报
回复
你可以先验证下特征向量是不是正交的
  • 打赏
  • 举报
回复
俺以前做的时候好像有添加一步施密特正交化和归一化,你可以试试看
Ryan Zhao 2011-01-19
  • 打赏
  • 举报
回复
就这样沉下去了么?........
zyrr159487 2011-01-18
  • 打赏
  • 举报
回复
持续关注此贴
wendy425 2011-01-17
  • 打赏
  • 举报
回复
“M. Kirby 和 L. Sirovich [Kkirby,1990]用PCA方法表征人脸图像,他们认为任何一幅图像都可以用一组本征脸的线性加权和来近似重构,其权重系数可以通过将人脸图像在本征脸空间投影得到。”

根据这句话,特征向量应该就是特征脸。我还没有编写过程序,目前还处于理论阶段。
Ryan Zhao 2011-01-17
  • 打赏
  • 举报
回复
我目前只能显示出最后一个向量的特征脸
Ryan Zhao 2011-01-17
  • 打赏
  • 举报
回复
之所以搞这么复杂是这样的:
如果直接计算原矩阵的特征值和特征向量,该矩阵的size是10000行*10000列(因为样本图片是100*100的),如此大规模的矩阵需要相当多的内存和计算时间,而且OPENCV提供的库函数只能计算20*20以下的矩阵。因此我采用了很多论文中提到的SVD定理,通过间接方式求得特征值和特征向量。现在没有采用降维是因为目前的特征值是20个数,而如果采用占比前99%的特征值的话,大概需要18个左右的特征值,我觉得跟那个没什么差距就没有采用。另外您显示出特征脸了么?怎么显示的?
[Quote=引用 5 楼 wendy425 的回复:]
5、矩阵A的转置矩阵AT*A,并将每个元素除以20,得到20*20的协方差矩阵C
这个关于协方差的计算,matlab和OpenCV还是有些不一样的,就是除以n或者n-1的问题,其实我也不知道谁的对;

7、计算W的-1/2次方矩阵,得到矩阵——W_M
8、计算XT*U_test*W_M,得到子空间矩阵——U(10000行*20列)

没必要这么复杂,直接选择其中比较大的几个特征值,并按……
[/Quote]
Ryan Zhao 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 a34914841 的回复:]
我也做图像处理,不过没搞过人脸识别,只做运动跟踪,呵呵,向楼主学习
[/Quote]
无语.....
a34914841 2011-01-17
  • 打赏
  • 举报
回复
我也做图像处理,不过没搞过人脸识别,只做运动跟踪,呵呵,向楼主学习
Ryan Zhao 2011-01-17
  • 打赏
  • 举报
回复
确实是这样的,但是这个特征向量在实际应用过程中不能直接求出,因为计算的时间和空间复杂度都比较大。我曾经试过直接计算。内存占用量超过1G,电脑很卡。所以必须用SVD算法间接求得
[Quote=引用 9 楼 wendy425 的回复:]
“M. Kirby 和 L. Sirovich [Kkirby,1990]用PCA方法表征人脸图像,他们认为任何一幅图像都可以用一组本征脸的线性加权和来近似重构,其权重系数可以通过将人脸图像在本征脸空间投影得到。”

根据这句话,特征向量应该就是特征脸。我还没有编写过程序,目前还处于理论阶段。
[/Quote]
验证码识别 2011-01-16
  • 打赏
  • 举报
回复
高 深
wendy425 2011-01-16
  • 打赏
  • 举报
回复
5、矩阵A的转置矩阵AT*A,并将每个元素除以20,得到20*20的协方差矩阵C
这个关于协方差的计算,matlab和OpenCV还是有些不一样的,就是除以n或者n-1的问题,其实我也不知道谁的对;

7、计算W的-1/2次方矩阵,得到矩阵——W_M
8、计算XT*U_test*W_M,得到子空间矩阵——U(10000行*20列)

没必要这么复杂,直接选择其中比较大的几个特征值,并按顺序排列它们对应的特征向量,就可以当做特征子空间U了,没有必要全选。
假如选择的是k个特征向量(一般选最大的前几个,且一般k小于样本数目20),则最后的特征Y=U'*y
y是待测图像,则最终的特征Y的大小就是(k*10000)*(10000*1)=k*1,就是说一幅图像就用k个数值表示就可以了,这就是PCA的降维所在。我看的论文中说的那些特征向量直接对应了特征脸,并且,k的取值一般都要小于样本数目。
这些都是一维PCA,二维PCA又略有不同。
zyrr159487 2011-01-15
  • 打赏
  • 举报
回复
这个。。对我来说就有点高端了
TandyT 2011-01-15
  • 打赏
  • 举报
回复
我也做图像处理,不过没搞过人脸识别,只做运动跟踪,呵呵,向楼主学习
加载更多回复(1)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧