@@ -575,7 +575,7 @@ def is_fragment_merge(self, key, label, kdtree):
575575 voxel = fragment_graph .voxels [leaf ]
576576 gt_voxel = util .kdtree_query (kdtree , voxel )
577577 if self .physical_dist (gt_voxel , voxel ) > 60 :
578- visited = self .find_merge_site (
578+ self .find_merge_site (
579579 key , kdtree , fragment_graph , leaf , visited
580580 )
581581
@@ -607,27 +607,55 @@ def find_merge_site(self, key, kdtree, fragment_graph, source, visited):
607607 voxel = fragment_graph .voxels [node ]
608608
609609 # Log merge mistake
610- segment_id = util .get_segment_id (fragment_graph .filename )
611- xyz = img_util .to_physical (voxel , self .anisotropy )
612- self .merged_labels .add ((key , segment_id , xyz ))
613- self .merge_sites .append (
614- {
615- "Segment_ID" : segment_id ,
616- "GroundTruth_ID" : key ,
617- "Voxel" : tuple ([int (t ) for t in voxel ]),
618- "World" : tuple ([float (t ) for t in xyz ]),
619- }
620- )
610+ if self .is_valid_merge (fragment_graph , kdtree , node ):
611+ filename = fragment_graph .filename
612+ segment_id = util .get_segment_id (filename )
613+ xyz = img_util .to_physical (voxel , self .anisotropy )
614+ self .merged_labels .add ((key , segment_id , xyz ))
615+ self .merge_sites .append (
616+ {
617+ "Segment_ID" : segment_id ,
618+ "GroundTruth_ID" : key ,
619+ "Voxel" : tuple ([int (t ) for t in voxel ]),
620+ "World" : tuple ([float (t ) for t in xyz ]),
621+ }
622+ )
621623
622- # Save merged fragment (if applicable)
623- if self .save_merges :
624- gutil .write_graph (fragment_graph , self .merge_writer )
625- gutil .write_graph (
626- self .gt_graphs [key ], self .merge_writer
627- )
628- return visited
629- return visited
624+ # Save merged fragment (if applicable)
625+ if self .save_merges :
626+ gutil .write_graph (
627+ fragment_graph , self .merge_writer
628+ )
629+ gutil .write_graph (
630+ self .gt_graphs [key ], self .merge_writer
631+ )
632+ return
630633
634+ def is_valid_merge (self , graph , kdtree , root ):
635+ n_hits = 0
636+ queue = list ([(root , 0 )])
637+ visited = set ({root })
638+ while queue :
639+ # Visit node
640+ i , d_i = queue .pop ()
641+ voxel_i = graph .voxels [i ]
642+ gt_voxel = util .kdtree_query (kdtree , voxel_i )
643+ if self .physical_dist (gt_voxel , voxel_i ) < 5 :
644+ n_hits += 1
645+
646+ # Check whether to break
647+ if n_hits > 16 :
648+ break
649+
650+ # Update queue
651+ for j in graph .neighbors (i ):
652+ voxel_j = graph .voxels [j ]
653+ d_j = d_i + self .physical_dist (voxel_i , voxel_j )
654+ if j not in visited and d_j < 30 :
655+ queue .append ((j , d_j ))
656+ visited .add (j )
657+ return True #True if n_hits > 16 else False
658+
631659 def process_merge_sites (self ):
632660 if self .merge_sites :
633661 # Remove duplicates
0 commit comments