我基本上是在Java中进行人脸识别和验证,使用PCA和WMPCA进行测试。我已经完全实现了PCA,但运行速度非常慢,15分钟即可训练7900个图像数据集。
我已经看过最长延迟的位置,有些是不可避免的,例如预处理数据(获取面部区域,灰度,调整大小,存储)。然而主要的延迟是矩阵计算。
第一个大延迟是在协方差矩阵的计算过程中,然后从协方差矩阵中得到特征值和特征向量。我目前正在使用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();
在获得权重和特征脸时,我使用Apache和Jama进行其他更通用的矩阵计算。这两个库都被审查得非常慢,我猜一个替代方案可能是像JBlas这样的库,但这只会加快这一部分。
我不想遇到长时间在每个库所需的数据格式之间进行转换的问题。
有没有人知道协方差矩阵计算的任何Java解决方案然后是特征分解?这似乎是主要的瓶颈。
答案 0 :(得分:0)
这可能取决于操作的类型,但是在较低级别的语言(例如C)中繁重的计算可能会更快。您应该尝试对它们进行基准测试,如果增益足够重要,您可以使用JNI来连接C来自Java的例程。
此类优化目前在一些众所周知的应用程序中使用,例如Tomcat。