我不知道这是否是一个相关论坛,但我一直在这里关注本教程:
http://www.openimaj.org/tutorial/eigenfaces.html
出于某种原因,这对我来说还不够清楚。有些事情我不明白。它在某一时刻说,
实现特征脸识别器的第一步是使用训练图像来学习 PCA 基础,我们将使用 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:重建面
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()
-> 返回一个我可以显示的图像,它看起来像一张普通的脸,但它的尺寸真的很小(这是正常的吗?)。
应该做吗?
谢谢。