【发布时间】:2015-03-18 22:32:14
【问题描述】:
我本质上是在 Java 中进行人脸识别和验证,使用 PCA 进行测试,然后使用 WMPCA。我已经完全实现了 PCA,但是它的运行速度非常慢,训练 7900 个图像数据集需要 15 分钟。
我查看了最长延迟在哪里,有些是不可避免的,例如预处理数据(获取面部区域、灰度、调整大小、存储)。然而,主要的延迟在于矩阵计算。
第一个大延迟是在协方差矩阵的计算过程中,然后从协方差矩阵中获取特征值和特征向量。我目前正在使用 Apache 库来实现这一点,但它似乎是单线程的,并且在计算时只消耗约 15% 的 CPU。它运行速度非常慢,虽然我找到了特征向量和特征值分解的可能替代方案,但我找不到用于协方差矩阵计算的替代快速库。
这是我计算上述内容时的代码 sn-p:
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 解决方案来计算协方差矩阵和特征分解?这似乎是主要的瓶颈。
【问题讨论】:
-
您是否尝试在与 C 一样的低级语言中对相同的操作进行基准测试?如果增益很重要,您可以使用 JNI 从 Java 接口它。您确实会失去可执行的可移植性,但这是一种可能的优化(例如 Tomcat 使用此类本机优化)。
-
我希望有一些我错过的 Java 解决方案,但是是的,与本机库接口是一种可能的解决方案。我记得读过一个我现在找不到链接的比较,它显示了在 Java 中使用 Apache 进行大型矩阵计算需要 50 秒,而 C 实现需要 4 秒。
-
您可能还忘记了虚拟机的大小。你检查过它的性能吗?
标签: java matrix covariance pca face-recognition