import torch from . import iou3d_cuda def boxes_iou_bev(boxes_a, boxes_b): """Calculate boxes IoU in the bird view. Args: boxes_a (torch.Tensor): Input boxes a with shape (M, 5). boxes_b (torch.Tensor): Input boxes b with shape (N, 5). Returns: ans_iou (torch.Tensor): IoU result with shape (M, N). """ ans_iou = boxes_a.new_zeros( torch.Size((boxes_a.shape[0], boxes_b.shape[0]))) iou3d_cuda.boxes_iou_bev_gpu(boxes_a.contiguous(), boxes_b.contiguous(), ans_iou) return ans_iou def nms_gpu(boxes, scores, thresh): """Non maximum suppression on GPU. Args: boxes (torch.Tensor): Input boxes with shape (N, 5). scores (torch.Tensor): Scores of predicted boxes with shape (N). thresh (torch.Tensor): Threshold of non maximum suppression. Returns: torch.Tensor: Remaining indices with scores in descending order. """ order = scores.sort(0, descending=True)[1] boxes = boxes[order].contiguous() keep = boxes.new_zeros(boxes.size(0)) num_out = iou3d_cuda.nms_gpu(boxes, keep, thresh, boxes.device.index) return order[keep[:num_out].cuda(boxes.device)].contiguous() def nms_normal_gpu(boxes, scores, thresh): """Normal non maximum suppression on GPU. Args: boxes (torch.Tensor): Input boxes with shape (N, 5). scores (torch.Tensor): Scores of predicted boxes with shape (N). thresh (torch.Tensor): Threshold of non maximum suppression. Returns: torch.Tensor: Remaining indices with scores in descending order. """ order = scores.sort(0, descending=True)[1] boxes = boxes[order].contiguous() keep = boxes.new_zeros(boxes.size(0)) num_out = iou3d_cuda.nms_normal_gpu(boxes, keep, thresh, boxes.device.index) return order[keep[:num_out].cuda(boxes.device)].contiguous()