zhangxy0517 / 3D-Registration-with-Maximal-Cliques

Source code of CVPR 2023 paper
MIT License
463 stars 55 forks source link

same input get differnt output when repeating my test. it seems not stable. #55

Closed songhc8 closed 1 month ago

songhc8 commented 1 month ago

Thank you for sharing your excellent work.

I have a problem. sometimes it works fine, but sometime the program outputs nan value for the same input. Cloud you please tell me what parameters I should check.

Here is my scenario: I got RGBD image scan A and B for the same object from different view. I get several markers from rgb image and obtain its point cloud from depth for both A and B. e.g. MarkA1-MakrerA500 for img A and MarkerB1-MarkerB400 for image B.

I calculate marker center for each marker, and then I get a feature vector for each marker by using its K nearest neighbor information such as distance between marker A1's center and other K nearest marker's center. etc.

after that, I match marker center in A and markers centers in B. assume that we get 150 pairs correspondence of marker center. I send the pointcloud of marker center and correspondence to MAC, Sometimes, I get correct RT, but sometimes, the result is nan or identity matritx. Why?

Chinese version:

您的工作很出色,但是我遇到一个问题,就是输入同样的数据到算法,有时候算法输出正确的结果,有时候输出R是单位阵,T是nan值。这是为什么呢?

以下是我的场景: 首先,我获得2帧RGBD的扫猫图像A和B,然后我分别从A和B的RGB图像中提取若干个Marker,并提取这些maker对应的点云。比如A中有500个marker,B中提取到了400个makrer。

然后我为两帧扫描的每个marker都计算出它的中心,并分别保存这些中心的信息。(这时候因为每个marker中心的位置不一样,所以可以认为原始的点云被简化到了一个只包含所有marker中心的点云,A帧的点云简化为500个点,B为400个点,这时候点云的分辨率和原始的不一样了,点云变得非常稀疏)。

然后,对A帧中点云的每个marker中心,我计算它的k最近临,然后计算K最近临到这个中心的一些信息,比如K个距离,作为描述当前marker的特征。对B帧中的点云也作同样的操作。这样我可以得到A帧和B帧中每个点的特征描述。

然后为按照上一步得到的特征描述匹配两帧之间的点云,得到这个匹配关系以后 比如为匹配到140个点对,其中可能有100个是正确的。我再把这个匹配关系,还有稀疏化以后只包含marker中心的点云给到mac,然后 cmp_thresh设置为0.95,点云分辨率设置为 0.01(只包含marker中心的点云其实没办法设置分辨率,因为这时候点云是不均匀的)这时候我发现有时候可以正常输出结果,有时候输出的结果就是错的,R是单位阵,T是nan。请问我该调整哪个参数可以让结果更稳定。

谢谢

zhangxy0517 commented 1 month ago

您好,请您先排除每次的输入数据是否相同。您可以将marker和匹配数据先保存下来,再输入给MAC。如果输入完全一样的情况下结果仍不稳定,可以对比观察下结果正确和错误的程序输出。MAC可以调参数除了cmp_thresh, resolution, 还有igraph_maximal_cliques的搜索大小,以及inlier_thresh,这些可能都需要您根据数据形式来调节。

songhc8 commented 1 month ago

您好,请您先排除每次的输入数据是否相同。您可以将marker和匹配数据先保存下来,再输入给MAC。如果输入完全一样的情况下结果仍不稳定,可以对比观察下结果正确和错误的程序输出。MAC可以调参数除了cmp_thresh, resolution, 还有igraph_maximal_cliques的搜索大小,以及inlier_thresh,这些可能都需要您根据数据形式来调节。

像我这个例子中,点云被简化为marker的中心了,那分辨率就变得不统一了,有的地方两个marker离得远,有的地方两个marker离得近,分辨率怎么设置比较合理,请问您有推荐吗?

zhangxy0517 commented 1 month ago

这种情况建议按照https://github.com/zhangxy0517/3D-Registration-with-Maximal-Cliques/blob/2dc01a3554d65440e808648f3e188450e5d46912/Linux/PCR.cpp#L93 构图,只用调inlier_thresh参数

songhc8 commented 1 month ago

这种情况建议按照

https://github.com/zhangxy0517/3D-Registration-with-Maximal-Cliques/blob/2dc01a3554d65440e808648f3e188450e5d46912/Linux/PCR.cpp#L93

构图,只用调inlier_thresh参数

谢谢,问题解决了。输出稳定了。另外我发现如果不改这个参数,igraph_maximal_cliques(&g, &cliques, 3, 0); // 3dlomatch 4 3dmatch; 3 Kitti 4 这句代码的3改为0,在我的数据上结果也稳定。谢谢