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)
def forward(self, x: ME.SparseTensor): return x.dense(self.min_coords, self.max_coords)[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