Example #1
0
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
Example #2
0
    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
Example #4
0
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)