| 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, pre_maxsize=None, post_max_size=None): | |
| """Nms function with gpu implementation. | |
| Args: | |
| boxes (torch.Tensor): Input boxes with the shape of [N, 5] | |
| ([x1, y1, x2, y2, ry]). | |
| scores (torch.Tensor): Scores of boxes with the shape of [N]. | |
| thresh (int): Threshold. | |
| pre_maxsize (int): Max size of boxes before nms. Default: None. | |
| post_maxsize (int): Max size of boxes after nms. Default: None. | |
| Returns: | |
| torch.Tensor: Indexes after nms. | |
| """ | |
| order = scores.sort(0, descending=True)[1] | |
| if pre_maxsize is not None: | |
| order = order[:pre_maxsize] | |
| boxes = boxes[order].contiguous() | |
| keep = torch.zeros(boxes.size(0), dtype=torch.long) | |
| num_out = iou3d_cuda.nms_gpu(boxes, keep, thresh, boxes.device.index) | |
| keep = order[keep[:num_out].cuda(boxes.device)].contiguous() | |
| if post_max_size is not None: | |
| keep = keep[:post_max_size] | |
| return keep | |
| 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 = torch.zeros(boxes.size(0), dtype=torch.long) | |
| num_out = iou3d_cuda.nms_normal_gpu(boxes, keep, thresh, boxes.device.index) | |
| return order[keep[:num_out].cuda(boxes.device)].contiguous() | |