Exemplo n.º 1
0
    def test(self):
        print(f"{self.__class__.__name__}: test_dense")
        in_channels, out_channels, D = 2, 3, 2
        coords1 = torch.IntTensor([[0, 0], [0, 1], [1, 1]])
        feats1 = torch.DoubleTensor([[1, 2], [3, 4], [5, 6]])

        coords2 = torch.IntTensor([[1, 1], [1, 2], [2, 1]])
        feats2 = torch.DoubleTensor([[7, 8], [9, 10], [11, 12]])
        coords, feats = ME.utils.sparse_collate([coords1, coords2],
                                                [feats1, feats2])
        input = SparseTensor(feats, coords)
        input.requires_grad_()
        dinput, min_coord, tensor_stride = input.dense()
        self.assertTrue(dinput[0, 0, 0, 1] == 3)
        self.assertTrue(dinput[0, 1, 0, 1] == 4)
        self.assertTrue(dinput[0, 0, 1, 1] == 5)
        self.assertTrue(dinput[0, 1, 1, 1] == 6)

        self.assertTrue(dinput[1, 0, 1, 1] == 7)
        self.assertTrue(dinput[1, 1, 1, 1] == 8)
        self.assertTrue(dinput[1, 0, 2, 1] == 11)
        self.assertTrue(dinput[1, 1, 2, 1] == 12)

        # Initialize context
        conv = MinkowskiConvolution(
            in_channels,
            out_channels,
            kernel_size=3,
            stride=2,
            bias=True,
            dimension=D,
        )
        conv = conv.double()
        output = conv(input)
        print(input.C, output.C)

        # Convert to a dense tensor
        dense_output, min_coord, tensor_stride = output.dense()
        print(dense_output.shape)
        print(dense_output)
        print(min_coord)
        print(tensor_stride)

        dense_output, min_coord, tensor_stride = output.dense(
            min_coordinate=torch.IntTensor([-2, -2]))

        print(dense_output)
        print(min_coord)
        print(tensor_stride)

        print(feats.grad)

        loss = dense_output.sum()
        loss.backward()

        print(feats.grad)
Exemplo n.º 2
0
 def forward(self, x: ME.SparseTensor):
     return x.dense(self.min_coords, self.max_coords)[0]
Exemplo n.º 3
0
def prepare_sparse_input(img, img_meta=None, gt_bboxes=None, gt_labels=None, rescale=None):
  coords_batch, feats_batch = img
  ## For some networks, making the network invariant to even, odd coords is important
  #coord_base = (torch.rand(3) * 100).type_as(coords_batch)
  #coords_batch[:, 1:4] += coord_base

  sinput = SparseTensor(feats_batch, coords_batch)
  if DEBUG_CFG.SPARSE_BEV:
    sinput = get_pcl_topview(sinput, gt_bboxes)

  assert gt_labels[0].min() > 0
  debug = 0

  if DEBUG_CFG.VISUAL_SPARSE_3D_INPUT:
    obj_rep = img_meta[0]['obj_rep']
    n = coords_batch.shape[0]
    print(f'batch voxe num: {n/1000}k')

    batch_size = coords_batch[:,0].max()+1
    for i in range(batch_size):
      print(f'example {i}/{batch_size}')
      batch_mask = coords_batch[:,0] == i
      points = coords_batch[batch_mask][:, 1:].cpu().data.numpy()
      colors = feats_batch[batch_mask][:, :3].cpu().data.numpy()
      colors = colors+0.5
      normals = feats_batch[batch_mask][:, 3:6].cpu().data.numpy()
      num_p = points.shape[0]

      img_meta_i = img_meta[i]
      voxel_size = img_meta_i['voxel_size']
      raw_dynamic_vox_size = img_meta_i['raw_dynamic_vox_size']

      mask_i = sinput.C[:,0] == i
      ci = sinput.C[mask_i]

      bboxes3d = gt_bboxes[i].cpu().data.numpy()

      min_points = points.min(axis=0)
      max_points = points.max(axis=0)
      gt_labels_i = gt_labels[i].cpu().data.numpy()

      data_aug = img_meta_i['data_aug']
      dynamic_vox_size_aug = img_meta_i['dynamic_vox_size_aug']
      print('\n\nfinal sparse input')
      footprint = dynamic_vox_size_aug[0] * dynamic_vox_size_aug[1] * (voxel_size*voxel_size)
      print(f'dynamic_vox_size_aug: {dynamic_vox_size_aug}, footprint: {footprint}')

      print(f'num voxel: {num_p/1000}K')
      print(img_meta[i]['filename'])
      print(f'points scope: {min_points} - {max_points}')
      print(f'data aug:\n {data_aug}\n')
      print(f'labels: {gt_labels}')

      scale = 1
      #_show_lines_ls_points_ls((512,512), [lines2d*scale], [points*scale])
      #_show_lines_ls_points_ls((512,512), [lines2d*scale])
      #_show_objs_ls_points_ls((512,512), [lines2d*scale], 'RoLine2D_UpRight_xyxy_sin2a')
      #_show_objs_ls_points_ls((512,512), [lines2d*scale], 'RoLine2D_UpRight_xyxy_sin2a', [points*scale])
      #_show_3d_points_objs_ls([points], None, [bboxes3d], obj_rep='RoBox3D_UpRight_xyxy_sin2a_thick_Z0Z1' , obj_colors=[gt_labels_i] )
      _show_3d_points_objs_ls([points], [colors], [bboxes3d], obj_rep=obj_rep, obj_colors=[gt_labels_i])
      import pdb; pdb.set_trace()  # XXX BREAKPOINT
      pass

  if 0 and DEBUG_CFG.SPARSE_BEV:

    coords_batch = sinput.C
    feats_batch = sinput.F

    dense, _, _ = sinput.dense()
    dense = dense.permute(0,1,3,2,4)
    batch_size = coords_batch[:,0].max()+1
    for i in range(batch_size):
      batch_mask = coords_batch[:,0] == i
      points = coords_batch[batch_mask][:, 1:].cpu().data.numpy()
      normals = feats_batch[batch_mask][:, 1:].cpu().data.numpy()
      num_p = points.shape[0]


      lines2d = gt_bboxes[i].cpu().data.numpy()
      density = dense[i,-1,:,:,0].cpu().data.numpy()


      min_points = points.min(axis=0)
      max_points = points.max(axis=0)
      min_lines = lines2d[:,:4].reshape(-1,2).min(axis=0)
      max_lines = lines2d[:,:4].reshape(-1,2).max(axis=0)


      img_meta_i = img_meta[i]
      data_aug = img_meta_i['data_aug']
      dynamic_vox_size_aug = img_meta_i['dynamic_vox_size_aug']
      print('\n\nfinal sparse input')
      footprint = dynamic_vox_size_aug[0] * dynamic_vox_size_aug[1] * (voxel_size*voxel_size)
      print(f'dynamic_vox_size_aug: {dynamic_vox_size_aug}, footprint: {footprint}')

      print(f'num voxel: {num_p/1000}K')
      print(img_meta[i]['filename'])
      print(f'points scope: {min_points} - {max_points}')
      print(f'lines scope: {min_lines} - {max_lines}')
      print(f'data aug:\n {data_aug}\n')

      #_show_lines_ls_points_ls(density, [lines2d])

      from beike_data_utils.line_utils import lines2d_to_bboxes3d
      bboxes3d_pixel = lines2d_to_bboxes3d(lines2d, OBJ_REP, height=30, thickness=1)
      _show_3d_points_bboxes_ls([points], None, [ bboxes3d_pixel ],
                  b_colors = 'red', box_oriented=True, point_normals=[normals])
      import pdb; pdb.set_trace()  # XXX BREAKPOINT
      pass

  if 0 and not DEBUG_CFG.SPARSE_BEV:
    n = coords_batch.shape[0]
    print(f'batch voxe num: {n/1000}k')

    batch_size = coords_batch[:,0].max()+1
    for i in range(batch_size):
      print(f'example {i}/{batch_size}')
      batch_mask = coords_batch[:,0] == i
      points = coords_batch[batch_mask][:, 1:].cpu().data.numpy()
      colors = feats_batch[batch_mask][:, :3].cpu().data.numpy()
      colors = colors+0.5
      normals = feats_batch[batch_mask][:, 3:6].cpu().data.numpy()
      num_p = points.shape[0]

      img_meta_i = img_meta[i]
      voxel_size = img_meta_i['voxel_size']
      raw_dynamic_vox_size = img_meta_i['raw_dynamic_vox_size']

      mask_i = sinput.c[:,0] == i
      ci = sinput.c[mask_i]

      lines2d = gt_bboxes[i].cpu().data.numpy()


      from beike_data_utils.line_utils import lines2d_to_bboxes3d
      bboxes3d_pixel = lines2d_to_bboxes3d(lines2d, OBJ_REP, height=50, thickness=1)

      min_points = points.min(axis=0)
      max_points = points.max(axis=0)
      min_lines = lines2d[:,:4].reshape(-1,2).min(axis=0)
      max_lines = lines2d[:,:4].reshape(-1,2).max(axis=0)

      data_aug = img_meta_i['data_aug']
      dynamic_vox_size_aug = img_meta_i['dynamic_vox_size_aug']
      print('\n\nfinal sparse input')
      footprint = dynamic_vox_size_aug[0] * dynamic_vox_size_aug[1] * (voxel_size*voxel_size)
      print(f'dynamic_vox_size_aug: {dynamic_vox_size_aug}, footprint: {footprint}')

      print(f'num voxel: {num_p/1000}K')
      print(img_meta[i]['filename'])
      print(f'points scope: {min_points} - {max_points}')
      print(f'lines scope: {min_lines} - {max_lines}')
      print(f'data aug:\n {data_aug}\n')

      scale = 1
      #_show_lines_ls_points_ls((512,512), [lines2d*scale], [points*scale])

      _show_3d_points_bboxes_ls([points], [colors], [ bboxes3d_pixel ],
                  b_colors = 'red', box_oriented=True, point_normals=[normals])

      import pdb; pdb.set_trace()  # XXX BREAKPOINT
      pass
  return sinput