# transform point clouds back to their reference frame using ground truth # (this is important because the network must learn when point clouds are in their original reference frame) pcd1_corr.transform(np.linalg.inv(T1)) pcd2_corr.transform(np.linalg.inv(T2)) # extract patches and compute LRFs patches1_batch = np.empty((batch_size, 3, patch_size)) patches2_batch = np.empty((batch_size, 3, patch_size)) lrfs1_batch = np.empty((batch_size, 4, 4)) lrfs2_batch = np.empty((batch_size, 4, 4)) frag1_lrf = lrf(pcd=pcd1, pcd_tree=o3d.geometry.KDTreeFlann(pcd1), patch_size=patch_size, lrf_kernel=lrf_kernel, viz=False) frag2_lrf = lrf(pcd=pcd2, pcd_tree=o3d.geometry.KDTreeFlann(pcd2), patch_size=patch_size, lrf_kernel=lrf_kernel, viz=False) # GET PATCHES USING THE FPS POINTS for i in range(len(fps_pcd1_idx)): pt1 = np.asarray(pcd1_corr.points)[fps_pcd1_idx.cpu()[i]] pt2 = np.asarray(pcd2_corr.points)[fps_pcd2_idx.cpu()[i]]
np.asarray(pcd1.points).shape[0])) inds2 = np.random.choice(np.asarray(pcd2.points).shape[0], pts_to_sample, replace=False) print('randomly sampled {} out of {} from pcd2 to compute DIPs'.format( pts_to_sample, np.asarray(pcd2.points).shape[0])) pcd1_pts = np.asarray(pcd1.points)[inds1] pcd2_pts = np.asarray(pcd2.points)[inds2] # compute DIPs frag1_lrf = lrf( pcd=pcd1, pcd_tree=o3d.geometry.KDTreeFlann(pcd1), patch_size=patch_size, lrf_kernel=lrf_kernel, viz=False ) # set viz=True to visualise patch kernels and their respective LRF frag2_lrf = lrf( pcd=pcd2, pcd_tree=o3d.geometry.KDTreeFlann(pcd2), patch_size=patch_size, lrf_kernel=lrf_kernel, viz=False ) # set viz=True to visualise patch kernels and their respective LRF patches1 = np.empty((pcd1_pts.shape[0], 3, patch_size)) patches2 = np.empty((pcd2_pts.shape[0], 3, patch_size))