OpenImaj教程和EigenFaces

时间:2015-09-17 19:04:43

标签: java image-processing openimaj

我不知道这是否是一个相关论坛,但我一直在这里关注本教程:

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;返回一个我可以显示的图像,它看起来像一张普通的脸,但它的尺寸确实很小(这是正常的吗?)。

应该这样做吗?

感谢。

1 个答案:

答案 0 :(得分:2)

第一个问题

PCA有两个阶段:

  1. 学习(&#34;培训&#34;)将数据投影到低维空间的线性变换。这样做是为了使变换空间中的第一轴(主轴)处于&#34;训练&#34;中的最高方差的方向。数据;第二轴与第一轴成直角的方向最大;等等。
  2. 将学习过的变换应用于数据(&#34;投射&#34;数据),以减少其维数。
  3. 您发现的大多数PCA描述都假设您已经获得了一些数据,而您只是想减少其维数。更具体地,假设两个步骤中的数据是相同的。但是,情况并非必须如此;您可以对有代表性的数据样本执行步骤1以学习转换,然后将步骤2应用于不同的数据(尽管结果有意义,此数据应来自同一群体)。

    在Eigenfaces的情况下,您可以从部分或全部的培训中学习PCA转换&#34;面对数据,然后通过变换投射所有训练数据并训练有监督的分类器。如果要测试系统,可以使用学习的PCA转换将以前看不见的数据项投影到较低维空间中,然后将其传递给分类器。

    对于第二个问题

    eigen.reconstruct(fvs[i]).normalise()是正确的方法。重建的图像将具有与用于训练/测试的所有图像相同的尺寸(特征脸方法的限制是所有输入必须具有相同的大小)。在本教程中,AT&amp; T人脸数据集由相对较低分辨率的图像(92x112像素)组成。