From raw forest scans to thousands of QSMs on your laptop, in minutes.
๐ Book & Tutorial ยท ๐ r-lidar.com
Arbor is a production-grade C++ library for large-scale processing of forest mobile laser scanning (MLS) data, with an R package API. It takes you through the entire workflow: from initial ground classification to final QSM reconstruction, including wood/foliage semantic segmentation and individual tree instance segmentation.
It handles real-world, noisy data, leaf-on scans, automatically without requiring parameter tuning or manual intervention and can produce up to 1.000 QSMs per minute
The internal algorithm follows a classical, rule-based approach rather than a learning-based one. It does not use deep learning, AI models, or training data. Consequently, it does not depend on the characteristics of a particular training dataset and can be applied directly to new datasets without retraining.
install.packages('arbor', repos = c('https://r-lidar.r-universe.dev', 'https://cloud.r-project.org'))
The Arbor Book is a complete, illustrated guide to the full pipeline with example datasets you can download and run right now.
Minimal Reproducible Example. Please note that this is a very small 9 ร 9 m dataset designed and edited to provide a reproducible example with a shippable file size (< 10 MB). Consequently, it is suboptimal because of edge effects in a dataset that consists mostly of edges. Please refer to the book for more details and real-world examples.
library(lidR)
library(arbor)
f <- system.file("extdata", "9x9.laz", package = "arbor")
# Using 0.6 instead 0.25 recommanded in the book because it is
# a pre-decimated scene
las <- lidR::readTLS(f, select = 'xyz', filter = "-keep_random_fraction 0.6")
las <- hybrid_homogeneization(las)
las <- segment_ground(las)
las <- wood_likelihood(las)
las <- segment_semantic(las)
see <- find_seeds(las)
las <- segment_instance(las, see)
las <- flag_buffer(las, see, -0.75) # don't use 0.75 in real data
las <- flag_small_trees(las, 1)
qsf <- qsf(las)
plot_semantic(las)
plot_instance(las)
plot(las, color = "UserData")
plot(qsf, pal = "chocolate4")