CloudCompare / CloudComPy

Python wrapper for CloudCompare
Other
283 stars 40 forks source link

Error When Using RANSAC_SD #39

Closed xiangtaoxu closed 2 years ago

xiangtaoxu commented 2 years ago

@prascle , Paul thanks for providing the RANSAC functionality.

When trying out your newest release, I keep having (memory?) errors when calling computeRANSAC_SD.

See below for error message (CloudComPy39) xu-eeb@AS-EEB-XU-02:~/projects/TLS$ python ransac_test.py QSocketNotifier: Can only be used with threads started with QThread /home/paul/projets/CloudComPy/CloudComPy/CloudCompare/libs/qCC_db/src/ccLog.cpp [53] : trace OFF JsonRPCPlugin::JsonRPCPlugin /home/paul/projets/CloudComPy/CloudComPy/CloudCompare/libs/qCC_db/src/ccLog.cpp [48] : trace ON /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [51] : computeRANSAC_SD free(): corrupted unsorted chunks Aborted

I am attaching my code example and the data I used. Could you help to check with this?

Thanks! ransac_test.zip

prascle commented 2 years ago

Hello, Unfortunately, I do not reproduce the bug (on Linux / conda CloudComPy39). Do you observe this on Linux or Windows ? Is this message systematic ? Maybe something different on the details of the Conda package versions installed ?

Paul

(CloudComPy39) paul@paul-XPS-15-9570:~/projets/SynologyDrive/CloudCompPy/bug_data/issue39/ransac_test$ ipython3 -i ransac_test.py 
Python 3.9.12 | packaged by conda-forge | (main, Mar 24 2022, 23:25:59) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.32.0 -- An enhanced Interactive Python. Type '?' for help.
QSocketNotifier: Can only be used with threads started with QThread
/home/paul/projets/CloudComPy/CloudComPy/CloudCompare/libs/qCC_db/src/ccLog.cpp [53] : trace OFF
JsonRPCPlugin::JsonRPCPlugin
/home/paul/projets/CloudComPy/CloudComPy/CloudCompare/libs/qCC_db/src/ccLog.cpp [48] : trace ON
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [51] : computeRANSAC_SD
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [58] : found 16 shapes
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=2.042257/h=3.178094)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0001
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Dip: 003 deg. - Dip direction: 035 deg.
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Plane_0001
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.201233/h=0.577289)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0002
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.181713/h=0.619714)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0003
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.267315/h=0.814636)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0004
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.181423/h=0.511005)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0005
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.183238/h=0.537320)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0006
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.167474/h=0.618635)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0007
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.263807/h=0.840111)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0008
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.150854/h=0.571635)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0009
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.189704/h=0.690868)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0010
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.116342/h=0.520201)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0011
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Dip: 026 deg. - Dip direction: 091 deg.
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Plane_0002
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.122222/h=0.685761)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0012
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.090921/h=1.083139)
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0013
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 0
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Leftovers
/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [85] : found 16 separate clouds
[3124, 2059, 1361, 1415, 1536, 1191, 937, 866, 1109, 747, 894, 813, 1174, 621, 628, 34395]
prascle commented 2 years ago

I can now reproduce the problem, it happens randomly, I will try to catch a backtrace abort... Paul

xiangtaoxu commented 2 years ago

Sounds like some more tricky memory problem...

I can always reproduce it on my machine. The platform is WSL2 (Ubuntu 20.04) on Windows11

prascle commented 2 years ago

I think it's a memory corruption, I have a Valgrind trace that gives two invalid writes to previously released blocks... This bug will be difficult, Ransac's C++ is particularly tricky.

prascle commented 2 years ago

Hello, I may have a solution: can you try this version ? I think I found a solution for the invalid write, without inducing memory loss. I don't reproduce the abort anymore with this version.

Paul

xiangtaoxu commented 2 years ago

Perfect, it is working on my end as well!

One question is that, the results slightly change every time I run the codes. Sometimes I got 14 shapes, sometimes 17. The # of points per shape is also varying slightly. Is this randomness expected?

prascle commented 2 years ago

Hello, Thank you for your feedback! I observe the same random behavior. Honestly, I'm not familiar with the algorithm used for Ransac_SD and I haven't actually used it, but the paper that presents it indicates random sampling. I don't know how to act on the parameterization to have the most robust/reproducible behavior possible.

Paul

xiangtaoxu commented 2 years ago

That was my guess as well although I was expecting there is a way to specify random number seed. Anyway, thanks so much! I am closing this issue

xiangtaoxu commented 2 years ago

Hi, Paul

I was wondering whether there is a way to turn off std output from the computeRANSAC_SD function? I always get something like below

/home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [51] : computeRANSAC_SD /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [58] : found 30 shapes /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1 /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.262864/h=2.640816) /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0001 /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1 /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.213425/h=2.605666) /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [80] : pc name:Cylinder_0002 /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [65] : nbch 1 /home/paul/projets/CloudComPy/CloudComPy/boostPython/RANSAC_SD/RANSAC_SDPy.cpp [71] : Cylinder (r=0.173502/h=2.608684)

prascle commented 2 years ago

Hi,

Normally you can remove all debugging trace messages if you remove os.environ["_CCTRACE_"]="ON" at the top of your Python script. You can also set os.environ["_CCTRACE_"]="OFF" This must be done before importing cloudComPy. You can also set the environment variable _CCTRACE_ to ON or OFF in bash, before launching the Python script.

Please let me know if this does not work as expected. Paul

xiangtaoxu commented 2 years ago

Great, thanks!