Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

R crashes using CSF on some clouds #12

Open
EvanZarrella opened this issue May 28, 2024 · 3 comments
Open

R crashes using CSF on some clouds #12

EvanZarrella opened this issue May 28, 2024 · 3 comments

Comments

@EvanZarrella
Copy link

Running the classify_ground function with the CSF algorithm on some point clouds leads to R crashing.
The CSF parameters : lidR::csf(sloop_smooth = FALSE, iterations = 1000L, class_threshold = 0.5, cloth_resolution = 0.2)
Tested on both R v4.3.2 and v4.4.0 running on an AMD Ryzen 9 7850X3D, 64Gb of RAM and a RTX 4080.
Using CloudCompare's implementation of the CSF gives satisfactory results.

I've put on my personnal drive a file that's crashing.
https://drive.google.com/file/d/1s3eehS0lKVO-wFlreCCP6UNWJchPm1cg/view?usp=sharing

Let me know if I can be of further help investigating this issue or if I need to post this on the RCSF github issue tracker.

@Jean-Romain
Copy link
Collaborator

Jean-Romain commented May 28, 2024

The following works for me. Please provide more details. OS, reproducible example and so on. Ideally try to reproduce without lidR, only using RCSF

library(lidR)
las = readLAS("~/Téléchargements/plot_1000351_6769761.las")
plot(las, color = "Classification")
mycsf = lidR::csf(sloop_smooth = FALSE, iterations = 1000L, class_threshold = 0.5, cloth_resolution = 0.2)
las = classify_ground(las, mycsf)
plot(las, color = "Classification")

@EvanZarrella
Copy link
Author

EvanZarrella commented May 28, 2024

Thank you for your response.

Regarding the OS, I'm on Windows 11, latest version.
Regarding more information, the cloth_resolution argument seems to be issue as plugin in 0.3 doesn't lead to any crashes
Tried with your code, crashed on the classify_ground so it is a reproductible example for me.
Tried the following code successfully :

las <- lidR::readLAS("plot_1000351_6769761.las")
data <- las@data
ground <- RCSF::CSF(data, sloop_smooth = FALSE, iterations = 1000L, class_threshold = 0.5, cloth_resolution = 0.2)

Leads me to believe that it comes from lidR and not the RCSF package.

@Jean-Romain
Copy link
Collaborator

I confirm it crashes on Windows and I can identify the issue on Linux even if it does not crash. It comes from the code of the CSF. The code is not mine. I'm not sure I can fix it. Maybe I should check if the original CSF has been updated.

==73165== Invalid read of size 8
==73165==    at 0x1C2FB974: c2cdist::calCloud2CloudDist(Cloth&, csf::PointCloud&, std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&) (c2cdist.cpp:50)
==73165==    by 0x1C2EADE0: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:180)
==73165==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73165==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73165==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B44C6: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B4EEC: ??? (in /usr/lib/R/lib/libR.so)
==73165==  Address 0x1f423ae8 is 24 bytes after a block of size 32 in arena "client"
==73165== 
==73165== Invalid read of size 8
==73165==    at 0x1C2FB98B: c2cdist::calCloud2CloudDist(Cloth&, csf::PointCloud&, std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&) (c2cdist.cpp:51)
==73165==    by 0x1C2EADE0: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:180)
==73165==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73165==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73165==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B44C6: ??? (in /usr/lib/R/lib/libR.so)
==73165==    by 0x49B4EEC: ??? (in /usr/lib/R/lib/libR.so)
==73165==  Address 0x1f423bc0 is 32 bytes before a block of size 16 in arena "client"
==73165== 

We have pretty much the same without lidR

las <- rlas::read.las("~/Téléchargements/plot_1000351_6769761.las")
ground <- RCSF::CSF(data, sloop_smooth = FALSE, iterations = 1000L, class_threshold = 0.5, cloth_resolution = 0.2)
==73621== Invalid read of size 8
==73621==    at 0x1C2FB974: c2cdist::calCloud2CloudDist(Cloth&, csf::PointCloud&, std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&) (c2cdist.cpp:50)
==73621==    by 0x1C2EADE0: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:180)
==73621==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73621==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73621==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B44C6: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B163B: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==  Address 0x1d01fae8 is 8 bytes before a block of size 32 free'd
==73621==    at 0x484C91D: operator delete(void*, unsigned long) (vg_replace_malloc.c:1101)
==73621==    by 0x1C2EF658: deallocate (new_allocator.h:145)
==73621==    by 0x1C2EF658: deallocate (alloc_traits.h:496)
==73621==    by 0x1C2EF658: _M_deallocate (stl_vector.h:354)
==73621==    by 0x1C2EF658: void std::vector<Particle*, std::allocator<Particle*> >::_M_realloc_insert<Particle* const&>(__gnu_cxx::__normal_iterator<Particle**, std::vector<Particle*, std::allocator<Particle*> > >, Particle* const&) (vector.tcc:500)
==73621==    by 0x1C2ECEA8: push_back (stl_vector.h:1198)
==73621==    by 0x1C2ECEA8: makeConstraint (Cloth.h:101)
==73621==    by 0x1C2ECEA8: Cloth::Cloth(Vec3 const&, int, int, double, double, double, double, int, double) (Cloth.cpp:75)
==73621==    by 0x1C2EAC44: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:141)
==73621==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73621==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73621==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73621==  Block was alloc'd at
==73621==    at 0x4848F75: operator new(unsigned long) (vg_replace_malloc.c:483)
==73621==    by 0x1C2EF692: allocate (new_allocator.h:127)
==73621==    by 0x1C2EF692: allocate (alloc_traits.h:464)
==73621==    by 0x1C2EF692: _M_allocate (stl_vector.h:346)
==73621==    by 0x1C2EF692: void std::vector<Particle*, std::allocator<Particle*> >::_M_realloc_insert<Particle* const&>(__gnu_cxx::__normal_iterator<Particle**, std::vector<Particle*, std::allocator<Particle*> > >, Particle* const&) (vector.tcc:440)
==73621==    by 0x1C2ECEC1: push_back (stl_vector.h:1198)
==73621==    by 0x1C2ECEC1: makeConstraint (Cloth.h:100)
==73621==    by 0x1C2ECEC1: Cloth::Cloth(Vec3 const&, int, int, double, double, double, double, int, double) (Cloth.cpp:75)
==73621==    by 0x1C2EAC44: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:141)
==73621==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73621==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73621==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73621== 
==73621== Invalid read of size 8
==73621==    at 0x1C2FB98B: c2cdist::calCloud2CloudDist(Cloth&, csf::PointCloud&, std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&) (c2cdist.cpp:51)
==73621==    by 0x1C2EADE0: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:180)
==73621==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73621==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73621==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B44C6: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B163B: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==  Address 0x1d01fbc0 is 16 bytes before a block of size 16 free'd
==73621==    at 0x484C91D: operator delete(void*, unsigned long) (vg_replace_malloc.c:1101)
==73621==    by 0x1C2EF658: deallocate (new_allocator.h:145)
==73621==    by 0x1C2EF658: deallocate (alloc_traits.h:496)
==73621==    by 0x1C2EF658: _M_deallocate (stl_vector.h:354)
==73621==    by 0x1C2EF658: void std::vector<Particle*, std::allocator<Particle*> >::_M_realloc_insert<Particle* const&>(__gnu_cxx::__normal_iterator<Particle**, std::vector<Particle*, std::allocator<Particle*> > >, Particle* const&) (vector.tcc:500)
==73621==    by 0x1C2ECEC1: push_back (stl_vector.h:1198)
==73621==    by 0x1C2ECEC1: makeConstraint (Cloth.h:100)
==73621==    by 0x1C2ECEC1: Cloth::Cloth(Vec3 const&, int, int, double, double, double, double, int, double) (Cloth.cpp:75)
==73621==    by 0x1C2EAC44: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:141)
==73621==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73621==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73621==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73621==  Block was alloc'd at
==73621==    at 0x4848F75: operator new(unsigned long) (vg_replace_malloc.c:483)
==73621==    by 0x1C2EF692: allocate (new_allocator.h:127)
==73621==    by 0x1C2EF692: allocate (alloc_traits.h:464)
==73621==    by 0x1C2EF692: _M_allocate (stl_vector.h:346)
==73621==    by 0x1C2EF692: void std::vector<Particle*, std::allocator<Particle*> >::_M_realloc_insert<Particle* const&>(__gnu_cxx::__normal_iterator<Particle**, std::vector<Particle*, std::allocator<Particle*> > >, Particle* const&) (vector.tcc:440)
==73621==    by 0x1C2ECDDF: push_back (stl_vector.h:1198)
==73621==    by 0x1C2ECDDF: makeConstraint (Cloth.h:101)
==73621==    by 0x1C2ECDDF: Cloth::Cloth(Vec3 const&, int, int, double, double, double, double, int, double) (Cloth.cpp:66)
==73621==    by 0x1C2EAC44: CSF::do_filtering(std::vector<int, std::allocator<int> >&, std::vector<int, std::allocator<int> >&, bool) (CSF.cpp:141)
==73621==    by 0x1C2F1588: R_CSF(Rcpp::DataFrame_Impl<Rcpp::PreserveStorage>, bool, double, double, int, int, double) (R_CSF.cpp:57)
==73621==    by 0x1C2F7BDE: _RCSF_R_CSF (RcppExports.cpp:21)
==73621==    by 0x495A237: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x495A88C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49961FF: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B119C: ??? (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B150A: Rf_eval (in /usr/lib/R/lib/libR.so)
==73621==    by 0x49B36DE: ??? (in /usr/lib/R/lib/libR.so)
==73621== 

@Jean-Romain Jean-Romain transferred this issue from r-lidar/lidR May 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants