Java 中的快速矩阵计算

use*_*855 5 java matrix face-recognition covariance pca

我本质上是在用 Java 进行人脸识别和验证,然后用 PCA 和 WMPCA 进行测试。我已经完全实现了 PCA,但是它运行得非常慢,训练 7900 个图像数据集需要 15 分钟。

我已经查看了最长延迟的位置,有些是不可避免的,例如预处理数据(获取面部区域、灰度、调整大小、存储)。然而,主要的延迟是在矩阵计算中。

第一个大延迟是在计算协方差矩阵期间,然后从协方差矩阵中获取特征值和特征向量。我目前正在使用 Apache 库来实现这一点,但它似乎是单线程的,在计算这个时只消耗约 15% 的 CPU。它运行得很慢,虽然我已经找到了特征向量和特征值分解的可能替代方案,但我找不到用于协方差矩阵计算的替代快速库。

这是我计算上述内容时的代码片段:

    Log.append("Computing covariance matrix...");
    // Compute covariance
    RealMatrix matrix = new Covariance(new BlockRealMatrix(
        dataWithAverageSubtracted).transpose()).getCovarianceMatrix();

    Log.append("Computing eigen decomposition...");
    // Get the eigenvalues and eigenvectors
    EigenDecomposition eigen = new EigenDecomposition(matrix);

    eigenValues = eigen.getRealEigenvalues();
    // Transpose because rows need to be eigenvectors not columns
    vectors = eigen.getV().transpose().getData();
Run Code Online (Sandbox Code Playgroud)

在获取权重和特征面时,我同时使用 Apache 和 Jama 进行其他更通用的矩阵计算。经审查,这两个库都非常慢,我想替代方案可能是 JBlas 之类的库,但这只会加快本节的速度。

我不想遇到花费很长时间在每个库所需的数据格式之间进行转换的问题。

有谁知道计算协方差矩阵然后进行特征分解的任何 Java 解决方案?这似乎是主要的瓶颈。

Ser*_*sta 1

它可能取决于操作的类型,但在较低级别的语言(例如 C)中,繁重的计算可能会更快。您应该尝试对它们进行基准测试,如果增益足够重要,您可以使用 JNI 与 Java 中的 C 例程进行接口。

此类优化目前用于一些众所周知的应用程序,例如 Tomcat。