我不知道这是否是一个相关论坛,但我一直在这里关注本教程:
http://www.openimaj.org/tutorial/eigenfaces.html
由于某种原因,对我来说还不够明确。 有一些我不明白的事情。它曾经说过,
实现特征脸识别器的第一步是使用训练图像来学习PCA基础,我们将用它来将图像投影到我们可用于识别的特征中。 EigenImages类需要一个图像列表,从中学习基础(即每个人的所有训练图像),还需要知道我们想要多少维度的特征(即与最大特征对应的特征向量的数量)要保留的特征值:
它写下这段代码:
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:重建面孔
由特征脸算法(特别是来自PCA过程)提取的特征的一个有趣特性是可以从特征重建原始图像的估计。尝试通过如上所述构建PCA基础来执行此操作,然后从测试集中提取随机选择的面部的特征。使用EigenImages#reconstruct()将要素转换回图像并显示。您需要对图像进行标准化(FImage#normalize())以确保其正确显示,因为重建可能会使像素值大于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()
- &gt;返回一个我可以显示的图像,它看起来像一张普通的脸,但它的尺寸确实很小(这是正常的吗?)。
应该这样做吗?
感谢。
答案 0 :(得分:2)
PCA有两个阶段:
您发现的大多数PCA描述都假设您已经获得了一些数据,而您只是想减少其维数。更具体地,假设两个步骤中的数据是相同的。但是,情况并非必须如此;您可以对有代表性的数据样本执行步骤1以学习转换,然后将步骤2应用于不同的数据(尽管结果有意义,此数据应来自同一群体)。
在Eigenfaces的情况下,您可以从部分或全部的培训中学习PCA转换&#34;面对数据,然后通过变换投射所有训练数据并训练有监督的分类器。如果要测试系统,可以使用学习的PCA转换将以前看不见的数据项投影到较低维空间中,然后将其传递给分类器。
eigen.reconstruct(fvs[i]).normalise()
是正确的方法。重建的图像将具有与用于训练/测试的所有图像相同的尺寸(特征脸方法的限制是所有输入必须具有相同的大小)。在本教程中,AT&amp; T人脸数据集由相对较低分辨率的图像(92x112像素)组成。