2DPCA

您所在的位置:网站首页 胖图片带字 2DPCA

2DPCA

2024-07-14 21:42| 来源: 网络整理| 查看: 265

目录

一、为什么提出2DPCA(Why)

二、2DPCA数学公式(What)

(一)模型

(二)策略(优化目标)

(三)算法(如何计算投影向量)

(四)特征提取和图像重构

三、2DPCA编程(How)

第一幅插图是对此篇文章的总结,建议看完文章以后再行观看。本文主要参考了《Two-Dimensional PCA:A New Approach to Appearance-Based Face Representation and Recognition》

 

一、为什么提出2DPCA(Why)

PCA存在着以下问题:

       1、使用PCA进行图像分类识别时,需要将二维矩阵转换为一维向量,使得图像内在的结构信息丢失。

       2、使用PCA学习特征向量时,由一维向量构造的协方差矩阵尺寸过大,计算复杂度高。

       3、由于训练样本数量较少,协方差矩阵尺寸过大,因此PCA容易导致过拟合问题。

       因此考虑直接使用二维图像构造协方差矩阵,计算投影轴(特征向量),并直接使用二维图像进行投影获得图像的模式特征。

二、2DPCA数学公式(What) (一)模型

使用{}\left \{ A_{1},A_{2},...,A_{N} \right \}表示N个二维图像,图像尺寸为m\times n,2DPCA旨在使用二维图像计算n维标准正交列向量X作为投影轴,实现如下的特征提取:

                                                                                         Y=AX

其中Y为二维图形投影后得到的新特征,大小为m维。

(二)策略(优化目标)

那么如何度量投影轴X或者投影后特征Y?引入投影后特征的总散射,即投影后特征构造的协方差矩阵的迹,进行衡量。其定义如下:

                                                                                     J(X)=trace(S)

其中S表示投影后特征构造的协方差矩阵,J(X)表示协方差矩阵的迹。根据协方差的性质,我们的目标是最大化J(X)

                                                                                                \underset{X\in R^{n}}{arg\;max}\;J(X)

由于我们往往计算多个投影轴,因此将上述优化公式广义化为求取k个特征向量:

                                                                                \begin{aligned} &{X_{1},X_{1},...,X_{k}}={arg\;max}\;J(X)\\ &X_{i}^{T}X_(j)=0,i\neq j \end{aligned}

接下来进行J(X)的公式推导。

首先计算投影后特征构造的协方差矩阵,S表示如下:

                                                                          \begin{aligned} S&=E\left \{ (Y-\overline{Y} )(Y-\overline{Y} )^{T}\right \} \\ &=E\left \{ (AX-\overline{A}X)(AX-\overline{A}X)^{T} \right \}\\ & =E\left \{ [(A-\overline{A})X] [(A-\overline{A})X]^{T}\right \} \end{aligned}

根据上式,可以根据以下公式J(X)

                                                                   J(x)=trace(S)=X^{T}{E[(A-\overline{A})^{T}(A-\overline{A})]X

定义图像协方差矩阵如下:

                                                                                \begin{aligned} G&=E[(A-\overline{A})^{T}(A-\overline{A})] \\ &= \frac{1}{M}\sum_{i=1}^{N}(A_{i}-\overline{A})^{T}(A_{i}-\overline{A}) \end{aligned}

显而易见,图像协方差矩阵是直接使用N个二维图像直接构建,尺寸为n*n。

(三)算法(如何计算投影向量)

此时有J(X)=X^{T}GX,因此寻找最大化J(X)n维列向量X转换为求取图像协方差矩阵G的特征向量。

1、载入所有二维图像矩阵\left \{ A_{1},A_{2},...,A_{N} \right \},计算平均图像\overline{A}=\frac{1}{N}\sum_{i=1}^{N}A_{i}

2、对所有二维图像进行中心化处理,计算图像协方差矩阵G= \frac{1}{M}\sum_{i=1}^{N}(A_{i}-\overline{A})^{T}(A_{i}-\overline{A})

3、计算图像协方差矩阵的特征向量和特征值,选择前k个最大特征值以及对于特征向量组成投影矩阵。

(四)特征提取和图像重构

假设图像矩阵为A,尺寸为m\times n;对应前k个最大特征值的特征向量{X_{1},X_{1},...,X_{k}}组成投影矩阵W,尺寸为n\times k。将图像矩阵投影到第i个特征向量上,可以得到第i个主成分,尺寸为m\times 1

                                                                               Y_{i}=AX_{i},i=1,2,..,k

将k个主成分组成特征矩阵(特征图像)Y=XW=[Y_{1},...,Y_{k}],尺寸为m\times k

使用特征提取得到的主成分和学习得到的特征向量计算重构子图像,亦或者使用特征矩阵和投影矩阵计算前k个重构子图像相加得到的重构图像。

重构子图像:Y_{i}X_{i}^{T}

重构图像:\tilde{A}=YW^{T}= \sum_{i=1}^{k}Y_{i}X_{i}^{T}

三、2DPCA编程(How)

使用VS2015+opencv 3.4.1进行编程,编程语言为C++,主要根据第二节的第三小节的步骤进行。我将ORL人脸数据库中每个人的10幅图像随机分为5幅训练图像和5幅测试图像,因此得到了训练数据集和测试数据集,大小都为200幅图像。使用训练数据集计算特征向量,载入训练数据集中一副图像进行特征提取和重构。

1、程序初始参数设置:

#include #include using namespace std; using namespace cv; //void //{ //定义需要修改的变量 int eigenNum = 2; //特征向量数目 int trainNum = 200; //训练样本数目 int testNum = 200; //测试样本数目 int nrows = 112, ncols = 92; //样本大小 string trainPath = "F:\\机器学习\\DataSet\\facetrain\\"; //训练样本存储路径 string testPath = "F:\\机器学习\\DataSet\\facetest\\"; //测试样本存储路径 //定义程序所需变量 string samplePath;//当前样本 Mat srcSample; //当前样本 Mat sampleAve = Mat::zeros(nrows, ncols, CV_32FC1);//样本均值 Mat covMatrix = Mat::zeros(ncols, ncols, CV_32FC1);//协方差矩阵 Mat eigenVecs(ncols, eigenNum, CV_32FC1); //特征向量 Mat eigenVals(eigenNum, 1, CV_32FC1); //特征值 vector trainSamples; //存储训练样本

2、载入所有二维图像矩阵\left \{ A_{1},A_{2},...,A_{N} \right \},图像大小为112*92,计算平均图像\overline{A}=\frac{1}{N}\sum_{i=1}^{N}A_{i}

//加载图像,计算均值(图像ID号从1开始) for (int i = 1; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3