OpenImaj 教程和 EigenFaces
OpenImaj Tutorial and EigenFaces
我不知道这是否是一个相关的论坛,但我一直在这里关注这个教程:
http://www.openimaj.org/tutorial/eigenfaces.html
出于某种原因,我还不够清楚。
有些事情我不明白。它在某一时刻说,
实现特征脸识别器的第一步是使用训练图像来学习 PCA 基础,我们将使用它来将图像投影到可用于识别的特征中。 EigenImages class 需要一个图像列表,从中学习基础(即每个人的所有训练图像),还需要知道我们希望我们的特征有多少维度(即有多少特征向量对应于要保留的最大特征值):
它开始编写这段代码:
List<FImage> basisImages = DatasetAdaptors.asList(training);
int nEigenvectors = 100;
EigenImages eigen = new EigenImages(nEigenvectors);
eigen.train(basisImages);
所以我不明白。 train()
方法训练到底是什么?据我了解,它只是应用 PCA,对吗?在我看来,训练总是与感知器或另一个神经网络或带参数的算法相关联。
我还需要一些帮助来理解练习 13.1.1,
13.1.1。练习 1:重建人脸
Eigenfaces 算法(特别是从 PCA 过程)提取的特征中一个有趣的 属性 是可以根据特征重建原始图像的估计值。尝试通过如上所述构建 PCA 基础来执行此操作,然后从测试集中提取随机选择的面部特征。使用 EigenImages#reconstruct() 将特征转换回图像并显示它。您需要规范化图像 (FImage#normalise()) 以确保其正确显示,因为重建可能会给出大于 1 或小于 0 的像素值。
示例中有一些代码已经提取了特征:
Map<String, DoubleFV[]> features = new HashMap<String, DoubleFV[]>();
for (final String person : training.getGroups()) {
final DoubleFV[] fvs = new DoubleFV[nTraining];
for (int i = 0; i < nTraining; i++) {
final FImage face = training.get(person).get(i);
fvs[i] = eigen.extractFeature(face);
}
features.put(person, fvs);
}
所以如果我只是这样称呼:
eigen.reconstruct(fvs[i]).normalise()
-> returns 我可以显示的图像,它看起来像一张普通的脸,但尺寸真的很小(这正常吗?)。
应该做吗?
谢谢。
第一个问题
PCA 有两个阶段:
- 学习(“训练”)将数据投影到低维空间的线性变换 space。这样做的方式是,转换后的 space 中的第一个轴(主轴)位于“训练”数据中方差最高的方向;第二个轴在与第一个轴成直角的最大方差方向上;等等。
- 将学习到的变换应用于数据(“投影”数据)以降低其维度。
您会发现大多数关于 PCA 的描述都假设您有一些数据并且您只想降低其维度。更具体地说,假设这两个步骤中的数据是相同的。然而,情况并非如此。您可以对具有代表性的数据样本执行步骤 1 以学习转换,然后将步骤 2 应用于不同的数据(尽管要使结果有意义,该数据应来自同一人群)。
对于 Eigenfaces,您可以从部分或全部“训练”面部数据中学习 PCA 变换,然后使用变换投影所有训练数据并训练监督分类器。当你想测试系统时,你使用学习到的 PCA 变换将一个以前看不见的数据项投影到低维 space,然后将其传递给分类器。
第二个问题
eigen.reconstruct(fvs[i]).normalise()
是正确的做法。重建的图像将具有与用于 training/testing 的所有图像相同的尺寸(特征脸方法的一个限制是所有输入必须具有相同的尺寸)。在本教程中,AT&T 人脸数据集包含分辨率相对较低的图像(92x112 像素)。
我不知道这是否是一个相关的论坛,但我一直在这里关注这个教程:
http://www.openimaj.org/tutorial/eigenfaces.html
出于某种原因,我还不够清楚。 有些事情我不明白。它在某一时刻说,
实现特征脸识别器的第一步是使用训练图像来学习 PCA 基础,我们将使用它来将图像投影到可用于识别的特征中。 EigenImages class 需要一个图像列表,从中学习基础(即每个人的所有训练图像),还需要知道我们希望我们的特征有多少维度(即有多少特征向量对应于要保留的最大特征值):
它开始编写这段代码:
List<FImage> basisImages = DatasetAdaptors.asList(training);
int nEigenvectors = 100;
EigenImages eigen = new EigenImages(nEigenvectors);
eigen.train(basisImages);
所以我不明白。 train()
方法训练到底是什么?据我了解,它只是应用 PCA,对吗?在我看来,训练总是与感知器或另一个神经网络或带参数的算法相关联。
我还需要一些帮助来理解练习 13.1.1,
13.1.1。练习 1:重建人脸
Eigenfaces 算法(特别是从 PCA 过程)提取的特征中一个有趣的 属性 是可以根据特征重建原始图像的估计值。尝试通过如上所述构建 PCA 基础来执行此操作,然后从测试集中提取随机选择的面部特征。使用 EigenImages#reconstruct() 将特征转换回图像并显示它。您需要规范化图像 (FImage#normalise()) 以确保其正确显示,因为重建可能会给出大于 1 或小于 0 的像素值。
示例中有一些代码已经提取了特征:
Map<String, DoubleFV[]> features = new HashMap<String, DoubleFV[]>();
for (final String person : training.getGroups()) {
final DoubleFV[] fvs = new DoubleFV[nTraining];
for (int i = 0; i < nTraining; i++) {
final FImage face = training.get(person).get(i);
fvs[i] = eigen.extractFeature(face);
}
features.put(person, fvs);
}
所以如果我只是这样称呼:
eigen.reconstruct(fvs[i]).normalise()
-> returns 我可以显示的图像,它看起来像一张普通的脸,但尺寸真的很小(这正常吗?)。
应该做吗?
谢谢。
第一个问题
PCA 有两个阶段:
- 学习(“训练”)将数据投影到低维空间的线性变换 space。这样做的方式是,转换后的 space 中的第一个轴(主轴)位于“训练”数据中方差最高的方向;第二个轴在与第一个轴成直角的最大方差方向上;等等。
- 将学习到的变换应用于数据(“投影”数据)以降低其维度。
您会发现大多数关于 PCA 的描述都假设您有一些数据并且您只想降低其维度。更具体地说,假设这两个步骤中的数据是相同的。然而,情况并非如此。您可以对具有代表性的数据样本执行步骤 1 以学习转换,然后将步骤 2 应用于不同的数据(尽管要使结果有意义,该数据应来自同一人群)。
对于 Eigenfaces,您可以从部分或全部“训练”面部数据中学习 PCA 变换,然后使用变换投影所有训练数据并训练监督分类器。当你想测试系统时,你使用学习到的 PCA 变换将一个以前看不见的数据项投影到低维 space,然后将其传递给分类器。
第二个问题
eigen.reconstruct(fvs[i]).normalise()
是正确的做法。重建的图像将具有与用于 training/testing 的所有图像相同的尺寸(特征脸方法的一个限制是所有输入必须具有相同的尺寸)。在本教程中,AT&T 人脸数据集包含分辨率相对较低的图像(92x112 像素)。