in gss/utils.py [0:0]
def hierarchical_segmentation(pcd, pcd_color, scene_id, FLAGS,
feature_mask=features3d.SimilarityMask(1, 1, 1, 1), seg=None):
# load pre_computed
with open(os.path.join(FLAGS.cgal_path, scene_id+'.pkl'), 'rb') as f:
info = pickle.load(f)
adj_mat = info['adj_mat']; A0 = info['A0']
F0 = np.load(os.path.join(FLAGS.cgal_path, scene_id+'_shape.npy'))
n_region = len(np.unique(F0))
shapes = []
for i in range(n_region):
pcd_i = o3d.geometry.PointCloud()
idx_i = np.where(F0 == i)
pcd_i.points = o3d.utility.Vector3dVector(np.array(pcd.points)[idx_i])
shapes += [pcd_i]
feature_extractor = features3d.Features3D(pcd, pcd_color, shapes, F0, n_region, feature_mask, tau=FLAGS.tau, seg=seg)
# stores list of regions sorted by their similarity
S = _build_initial_similarity_set(A0, feature_extractor)
# stores region label and its parent (empty if initial).
R = {i : () for i in range(n_region)}
A = [A0] # stores adjacency relation for each step
F = [F0] # stores label pcd for each step
# greedy hierarchical grouping loop
while len(S):
(s, (i, j)) = S.pop()
t = feature_extractor.merge(i, j)
# record merged region (larger region should come first)
R[t] = (i, j) if feature_extractor.size[j] < feature_extractor.size[i] else (j, i)
Ak = _new_adjacency_dict(A[-1], i, j, t)
A.append(Ak)
S = _merge_similarity_set(feature_extractor, Ak, S, i, j, t)
F.append(_new_label_image(F[-1], i, j, t))
# bounding boxes for each hierarchy
L = feature_extractor.bbox
return (R, F, L)