chrischoy / DeepGlobalRegistration

[CVPR 2020 Oral] A differentiable framework for 3D registration
Other
468 stars 85 forks source link

About FGR results #8

Closed lombardm closed 4 years ago

lombardm commented 4 years ago

Hi, I would like to ask you about the tests you presented within the paper. In particular, I was trying to reproduce the results you obtained on 3DMatch using FGR. I am currently using the open3d library and I have inserted into deep_global_registration.py the following code:

if self.safeguard_method == 'feat_fast': distance_threshold = voxel_size * 2.0 T = registration_fast_based_on_fcgf_feature_matching(pcd0, pcd1, feats0.cpu().numpy(), feats1.cpu().numpy(), distance_threshold)

where

def registration_fast_based_on_fcgf_feature_matching(pcd0, pcd1, feats0, feats1, distance_threshold): assert feats0.shape[1] == feats1.shape[1]

source_feat = o3d.registration.Feature() source_feat.resize(feats0.shape[1], len(feats0)) source_feat.data = feats0.astype('d').transpose()

target_feat = o3d.registration.Feature() target_feat.resize(feats1.shape[1], len(feats1)) target_feat.data = feats1.astype('d').transpose()

result = o3d.registration.registration_fast_based_on_feature_matching( pcd0, pcd1, source_feat, target_feat, o3d.registration.FastGlobalRegistrationOption(maximum_correspondence_distance=distance_threshold))

return result.transformation

Which, as you can see, is very similar to the code you already provided (except for Fast instead of RANSAC).

Then, inside the register function of deep_global_registration I call: pcd0 = make_open3d_point_cloud(xyz0) pcd1 = make_open3d_point_cloud(xyz1) T = self.safeguard_registration(pcd0, pcd1, corres_idx0, corres_idx1, feats0, feats1, self.voxel_size, num_iterations=self.config.safeguard_num_iterations)

Everything else is untouched with respect with your code. Unfortunately I am having very poor results: the overall accuracy for instance is around 5%. The version of 3DMatch should be ok, in fact I see the same results as yours with DGR and even greater results when runnin RANSAC based on correspondences instead of features matching. Do you have any idea about what could be the issue? Can you tell me which implementation of FAST did you use or which parameters?

Thank you very much for your time, Marco

lombardm commented 4 years ago

Nevermind, I think I discovered the error. In core/deep_global_registration when is called the method self.safeguard_registration, they are currently passed feats0 and feats1 as features, instead of fcgf_feats0 and fcgf_feats1. I close this issue ;)