【问题标题】:Compute eigenvalues for large point clouds as quickly as possible with R用 R 尽可能快地计算大点云的特征值
【发布时间】:2021-05-01 14:43:48
【问题描述】:

我有很大的点云(每个点云有几百万个点)并且想要计算所有点的几何属性。为此,我需要计算特征值。我怎样才能尽快做到这一点?我的数据存储在 *.las 文件中,我使用包 lidR 将它们读入。我也使用这个包来计算点度量。根据this的帖子,我实现了这个版本:

# load data
cloud_raw <- readLAS(path_points)

# because eigen() is really slow, use C++
Rcpp::sourceCpp(code = "
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec eigen_values(arma::mat A) {
arma::mat coeff, score;
arma::vec latent;
arma::princomp(coeff, score, latent, A);
return(latent);
}")

metric_geometry_features <- function(x, y, z) {
  xyz <- cbind(x, y, z)
  cov_matrix <- cov(xyz)
  eigen_matrix <- eigen_values(cov_matrix)
  geometries = list(
    planarity = (eigen_matrix[2] - eigen_matrix[3]) / eigen_matrix[1],
    linearity = (eigen_matrix[1] - eigen_matrix[2]) / eigen_matrix[1]
  )
  return(geometries)
}

metrics <- point_metrics(cloud_raw, ~metric_geometry_features(X,Y,Z), k = 20)

但是,对于我的小型测试云来说,这仍然非常慢(1400 万点大约需要 15 分钟)。在计算时,它告诉 mit 它只使用一个线程,我不知道如何更改这一点,以及这是否会大大提高性能。无论如何,我不知道如何使这个过程更快。我知道必须有一种方法,因为当我使用“CloudCompare”软件时,处理速度要快得多,并且可以在几秒钟内完成。我还尝试使用来自 lidR 包的stdshapemetrics(),它使用了一个无法访问的函数fast_eigen_values()。这需要同样长的时间,并告诉我它只使用一个线程。

【问题讨论】:

    标签: r point-clouds eigenvalue lidr


    【解决方案1】:

    point_metrics() 的问题是它调用用户的 R 代码数百万次,这是有代价的。此外,它不能安全地多线程。该功能适用​​于原型设计,但对于生产,您必须编写自己的代码。例如,您可以使用 point_metrics() 重现函数 segment_shape(),但 segment_shape() 是纯 C++ 和多线程,并且通常快一个数量级。

    让我们尝试大约 3 百万点。这两个例子不等价(输出不同),但计算量几乎相同(特征值分解)。

    system.time({point_metrics(cloud_raw, .stdshapemetrics, k = 20)})
    #> 110 seconds
    set_lidr_threads(4L)
    system.time({segment_shapes(cloud_raw, shp_plane(k = 20))})
    #> 17 seconds
    

    此外,您可能会被建议使用足够的函数 readLAS() 作为您的点云的函数。前面的示例,如果使用readTLSLAS() 阅读,分别需要 190 和 50 秒,因为我的点云是 ALS。但如果您使用 TLS,您最好使用 readTLSLAS()

    另外,.stdshapemetrics 只不过是您已经找到的 C++ 的包装器。预计没有收益。

    作为结论:

    或者继续lidR repo 并请求原生快速特征值分解的新功能。

    【讨论】:

    • 似乎是一个合理的答案,不幸的是我不知道如何使用 C++。我想我找到了必须向 filter_shape 添加案例的地方。很抱歉打扰,但你能给我一些关于如何对我的 R 实现这些更改的提示吗?我知道我想改变什么,但我不知道如何将新代码放入我的 R 中。我以前从未修改过包。
    • 当然,请在gis.stackexchange.com/questions/tagged/lidr 上使用标签lidr 提出具体问题。在 SO 上,lidR 没有任何内容,而 170 多个 Q 集中在 GIS SE 上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2023-04-02
    • 2023-04-11
    • 2020-02-25
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多