ef tangent_plane_sampling(self, reference_points, offset, img_metas):
grid = self.grid.type_as(reference_points) * self.grid_range_scale # trans to pc_range
local_pts = grid[None, None, :, None, ...] + offset
if self.point_dim == 2:
local_pts = torch.cat([torch.zeros_like(local_pts[..., :1]), local_pts], dim=-1)
reference_points = position_decode(reference_points, self.pc_range)
# the query-specific view angle mentioned in paper
azimuth_angle = torch.atan2(reference_points[..., 1], reference_points[..., 0])
rot_sin, rot_cos = torch.sin(azimuth_angle), torch.cos(azimuth_angle)
zeros, ones = torch.zeros_like(azimuth_angle), torch.ones_like(azimuth_angle)
rot_matrix = torch.stack([rot_cos, -rot_sin, zeros,
rot_sin, rot_cos, zeros,
zeros, zeros, ones], dim=-1).reshape(*reference_points.shape[:-1], 3, 3)
local_pts = torch.matmul(rot_matrix[:, :, None, None, None, ...], local_pts.unsqueeze(-1)).squeeze(-1)
reference_points = reference_points[:, :, None, None, None, :] + local_pts
reference_points_cam, proj_mask = self.point_sampling(reference_points, img_metas)
if self.offset_single_level:
reference_points_cam = reference_points_cam.repeat(1, 1, 1, 1, self.num_levels, 1, 1)
proj_mask = proj_mask.repeat(1, 1, 1, 1, self.num_levels, 1)
return reference_points_cam, proj_mask