def render_pth_file(pth_fn, show_by_class=0): pcl, bboxes0 = torch.load(pth_fn) #points = pcl[:,0:3] #colors = pcl[:,3:6] #normals = pcl[:,6:9] bboxes = {} for c in CLASSES: bboxes[c] = bboxes0[c] scene_size = pcl_size(pcl) print(f'scene pcl size:{scene_size}') print(f'point num: {pcl.shape[0]}') #pcl = cut_points_roof(pcl) classes = [k for k in bboxes.keys()] num_classes = {k: bboxes[k].shape[0] for k in bboxes.keys()} print(f'\nclasses: {num_classes}\n\n') all_bboxes = np.concatenate([boxes for boxes in bboxes.values()], 0) nums = [boxes.shape[0] for boxes in bboxes.values()] labels = [] for i, n in enumerate(nums): labels += [i] * n labels = np.array(labels) Bbox3D.draw_points(pcl, points_keep_rate=POINTS_KEEP_RATE) #show_walls_offsetz(all_bboxes) #Bbox3D.draw_bboxes_mesh(all_bboxes, up_axis='Z', is_yx_zb=False, labels=labels) #Bbox3D.draw_bboxes_mesh(all_bboxes, up_axis='Z', is_yx_zb=False) #Bbox3D.draw_points_bboxes_mesh(pcl, all_bboxes, up_axis='Z', is_yx_zb=False, labels=labels, points_keep_rate=POINTS_KEEP_RATE) #Bbox3D.draw_points_bboxes_mesh(pcl, all_bboxes, up_axis='Z', is_yx_zb=False, points_keep_rate=POINTS_KEEP_RATE) #Bbox3D.draw_points_bboxes(pcl, all_bboxes, up_axis='Z', is_yx_zb=False,points_keep_rate=POINTS_KEEP_RATE) #Bbox3D.draw_points_bboxes(pcl, all_bboxes, up_axis='Z', is_yx_zb=False, labels=labels, points_keep_rate=POINTS_KEEP_RATE) #Bbox3D.draw_points_bboxes(pcl, all_bboxes, up_axis='Z', is_yx_zb=False, labels=labels, points_keep_rate=POINTS_KEEP_RATE, animation_fn='anima.mp4', ani_size=[280,700,550,1350]) if show_by_class: for clas in bboxes.keys(): if clas not in ['ceiling', 'floor']: #if clas not in ['wall', 'window', 'door','ceiling', 'floor']: continue print(clas) #if clas not in CLASSES: # continue boxes = bboxes[clas] #Bbox3D.draw_points_bboxes(points, boxes, up_axis='Z', is_yx_zb=False) Bbox3D.draw_points_bboxes_mesh(pcl, boxes, up_axis='Z', is_yx_zb=False, points_keep_rate=POINTS_KEEP_RATE) show_walls_offsetz(boxes) import pdb pdb.set_trace() # XXX BREAKPOINT pass
def show__together(self, boxlist_1, max_num=-1, max_num_1=-1, points=None, offset_x=None, twolabels=False, mesh=False, points_keep_rate=POINTS_KEEP_RATE, points_sample_rate=POINTS_SAMPLE_RATE, random_color=False, colors=None): import numpy as np from utils3d.bbox3d_ops import Bbox3D boxes = self.bbox3d.cpu().data.numpy().copy() if max_num > 0 and max_num < boxes.shape[0]: ids = np.random.choice(boxes.shape[0], max_num, replace=False) boxes = boxes[ids] boxes_1 = boxlist_1.bbox3d.cpu().data.numpy().copy() if max_num_1 > 0 and max_num_1 < boxes_1.shape[0]: ids = np.random.choice(boxes_1.shape[0], max_num_1, replace=False) boxes_1 = boxes_1[ids] if offset_x is not None: boxes_1[:,0] += offset_x if not twolabels and 'labels' in self.fields(): labels = self.get_field('labels').cpu().data.numpy().astype(np.int32) labels_1 = boxlist_1.get_field('labels').cpu().data.numpy().astype(np.int32) labels = np.concatenate([labels, labels_1], 0) else: labels = np.array([0]*boxes.shape[0] + [1]*boxes_1.shape[0]) boxes = np.concatenate([boxes, boxes_1], 0) if colors is not None: colors = np.concatenate(colors, 0) assert colors.shape[0] == boxes.shape[0] if points is None: if mesh: Bbox3D.draw_bboxes_mesh(boxes, 'Z', is_yx_zb=self.mode=='yx_zb', labels=labels) else: Bbox3D.draw_bboxes(boxes, 'Z', is_yx_zb=self.mode=='yx_zb', labels=labels, random_color=False) else: if isinstance(points, torch.Tensor): points = points.cpu().data.numpy() if offset_x is not None: tp = points.copy() tp[:,0] += offset_x points = np.concatenate([points, tp], 0) # tp = tp.copy() tp[:,0] += offset_x points = np.concatenate([points, tp], 0) if mesh: Bbox3D.draw_points_bboxes_mesh(points, boxes, 'Z', is_yx_zb=self.mode=='yx_zb', labels=labels, points_keep_rate=points_keep_rate, points_sample_rate=points_sample_rate, random_color=random_color, box_colors=colors) else: Bbox3D.draw_points_bboxes(points, boxes, 'Z', is_yx_zb=self.mode=='yx_zb', labels=labels, random_color=random_color, points_keep_rate=points_keep_rate, points_sample_rate=points_sample_rate, box_colors=colors)
def split_bbox(bbox_fn, points_splited): ''' bbox in file bbox_fn: up_axis='Y' with always x_size > z_size transform with cam2world_box: up_axis == 'Z' always: x_size > y_size ''' obj = os.path.basename(bbox_fn).split('.')[0] min_point_num_per1sm = 10 # thickness_aug for cropping x thickness_aug = 0.3 assert IndoorData._block_size0[-1] == -1 # do not crop box along z bboxes = np.loadtxt(bbox_fn).reshape([-1,7]) #if DEBUG: # #show_walls_1by1(bboxes) # bboxes = bboxes[3:4] areas = bboxes[:,3] * bboxes[:,5] min_point_num = np.minimum( min_point_num_per1sm * areas, 200 ) bboxes_aug = bboxes.copy() #bboxes_aug[:,4] += thickness_aug bboxes_aug[:,3:6] = np.clip(bboxes_aug[:,3:6],a_min= thickness_aug, a_max=None ) bn = bboxes.shape[0] sn = len(points_splited) bboxes_splited = [] for i in range(0, sn): # Use to constrain size_x size_z point_masks_aug_i = Bbox3D.points_in_bbox(points_splited[i][:,0:3].copy(), bboxes_aug.copy()) # Use to constrain size_y (the thickness) bboxes_tc = IndoorData.adjust_box_for_thickness_crop(bboxes) point_masks_i = Bbox3D.points_in_bbox(points_splited[i][:,0:3].copy(), bboxes_tc) pn_in_box_aug_i = np.sum(point_masks_aug_i, 0) pn_in_box_i = np.sum(point_masks_i, 0) #print(f'no aug:{pn_in_box_i}\n auged:{pn_in_box_aug_i}') # (1) The bboxes with no points with thickness_aug will be removed firstly keep_box_aug_i = pn_in_box_aug_i > min_point_num bboxes_i = bboxes[keep_box_aug_i] if DEBUG and obj=='ceiling' and 0: rm_box_aug_i = pn_in_box_aug_i <= min_point_num print(rm_box_aug_i) bboxes_no_points_i = bboxes[rm_box_aug_i].copy() bboxes_no_points_i[:,0] += 30 bboxes_show = np.concatenate([bboxes_i, bboxes_no_points_i],0) Bbox3D.draw_points_bboxes(points_splited[i], bboxes_show, up_axis='Z', is_yx_zb=False) points_aug_i = [points_splited[i][point_masks_aug_i[:,j]] for j in range(bn)] points_aug_i = [points_aug_i[j] for j in range(bn) if keep_box_aug_i[j]] points_i = [points_splited[i][point_masks_i[:,j]] for j in range(bn)] points_i = [points_i[j] for j in range(bn) if keep_box_aug_i[j]] # (2) Crop all the boxes by points and intersec_corners seperately bn_i = bboxes_i.shape[0] croped_bboxes_i = [] keep_unseen_intersection = False if keep_unseen_intersection: intersec_corners_idx_i, intersec_corners_i = Bbox3D.detect_all_intersection_corners(bboxes_i, 'Z') else: intersec_corners_idx_i = [None]*bn_i invalid_bn = 0 for k in range(bn_i): croped_box_k = Bbox3D.crop_bbox_by_points( bboxes_i[k], points_i[k], points_aug_i[k], 'Z', intersec_corners_idx_i[k]) if croped_box_k is not None: croped_bboxes_i.append( croped_box_k ) else: invalid_bn += 1 #Bbox3D.draw_points_bboxes(points_splited[i], bboxes_i[k:k+1], up_axis='Z', is_yx_zb=False, points_keep_rate=1.0) pass if len(croped_bboxes_i) > 0: croped_bboxes_i = np.concatenate(croped_bboxes_i, 0) else: croped_bboxes_i = np.array([]).reshape([-1,7]) # (3) Refine x size of each bbox by thickness croped of intersected bbox #croped_size = bboxes_i[:,3:6] - croped_bboxes_i[:,3:6] refine_x_by_intersection = False # not correct yet if refine_x_by_intersection: for k in range(bn_i): itsc0, itsc1 = intersec_corners_idx_i[k] crop_value = [0,0] if itsc0 >= 0: crop_value[0] = Bbox3D.refine_intersection_x(croped_bboxes_i[k], 'neg', croped_bboxes_i[itsc0], 'Z') if itsc1 >= 0: crop_value[1] = Bbox3D.refine_intersection_x(croped_bboxes_i[k], 'pos', croped_bboxes_i[itsc1], 'Z') if itsc0 >= 0 or itsc1 > 0: croped_bboxes_i[k] = Bbox3D.crop_bbox_size(croped_bboxes_i[k], 'X', crop_value) #crop_ysize_neg = croped_size[itsc0,1] if itsc0 >= 0 else 0 #crop_ysize_pos = croped_size[itsc1,1] if itsc1 >= 0 else 0 #croped_bboxes_i[k] = Bbox3D.crop_bbox_size(croped_bboxes_i[k], 'X', [crop_ysize_neg, crop_ysize_pos]) # (4) remove too small wall min_wall_size_x = 0.2 sizex_mask = croped_bboxes_i[:,3] > min_wall_size_x croped_bboxes_i = croped_bboxes_i[sizex_mask] bboxes_splited.append(croped_bboxes_i) show = False if show and DEBUG and len(points_i) > 0 and obj=='ceiling': print(croped_bboxes_i[:,3]) points = np.concatenate(points_i,0) points = points_splited[i] points1 = points.copy() points1[:,0] += 30 points = np.concatenate([points, points1], 0) bboxes_i[:,0] += 30 bboxes_i = np.concatenate([bboxes_i, croped_bboxes_i], 0) #Bbox3D.draw_points_bboxes(points, bboxes_i, up_axis='Z', is_yx_zb=False) Bbox3D.draw_points_bboxes_mesh(points, bboxes_i, up_axis='Z', is_yx_zb=False) import pdb; pdb.set_trace() # XXX BREAKPOINT pass return bboxes_splited
def render_parsed_house_walls(parsed_dir, show_pcl=SHOW_PCL, show_by_class=0): print(f'parsed_dir:{parsed_dir}') house_name = os.path.basename(parsed_dir) bboxes = [] labels = [] for obj in CLASSES: bbox_fn_ = f'{parsed_dir}/object_bbox/{obj}.txt' bboxes_ = np.loadtxt(bbox_fn_).reshape([-1, 7]) bboxes.append(bboxes_) label = DSET_METAS0.class_2_label[obj] labels += [label] * bboxes_.shape[0] bboxes = np.concatenate(bboxes, 0) labels = np.array(labels).astype(np.int8) if bboxes.shape[0] > 0: scene_size = Bbox3D.boxes_size(bboxes) print(f'scene wall size:{scene_size}') #Bbox3D.draw_bboxes(bboxes, up_axis='Z', is_yx_zb=False, labels=labels) #if not show_pcl: Bbox3D.draw_bboxes_mesh(bboxes, up_axis='Z', is_yx_zb=False) #Bbox3D.draw_bboxes_mesh(bboxes, up_axis='Z', is_yx_zb=False, labels=labels) #show_walls_offsetz(bboxes) if show_by_class: for c in range(1, max(labels) + 1): cs = DSET_METAS0.label_2_class[c] print(cs) if cs not in ['wall', 'window', 'door']: #if cs not in ['wall']: continue mask = labels == c bboxes_c = bboxes[mask] show_walls_offsetz(bboxes_c) if show_pcl: pcl_fn = f'{parsed_dir}/pcl_camref.ply' if not os.path.exists(pcl_fn): return pcd = open3d.read_point_cloud(pcl_fn) points = np.asarray(pcd.points) points = cam2world_pcl(points) colors = np.asarray(pcd.colors) pcl = np.concatenate([points, colors], 1) scene_size = pcl_size(pcl) print(f'scene pcl size:{scene_size}') print(f'point num: {pcl.shape[0]}') #pcl = cut_points_roof(pcl) #Bbox3D.draw_points(pcl, points_keep_rate=POINTS_KEEP_RATE) #Bbox3D.draw_points(pcl, points_keep_rate=POINTS_KEEP_RATE, animation_fn='points.mp4', ani_size=AniSizes[house_name]) bboxes[:, 2] += 0.1 Bbox3D.draw_points_bboxes(pcl, bboxes, up_axis='Z', is_yx_zb=False, points_keep_rate=POINTS_KEEP_RATE) Bbox3D.draw_points_bboxes_mesh(pcl, bboxes, up_axis='Z', is_yx_zb=False, points_keep_rate=POINTS_KEEP_RATE)