|
|
|
import torch
|
|
|
|
from ..utils import ext_loader
|
|
|
|
ext_module = ext_loader.load_ext('_ext', [
|
|
'iou3d_boxes_iou_bev_forward', 'iou3d_nms_forward',
|
|
'iou3d_nms_normal_forward'
|
|
])
|
|
|
|
|
|
def boxes_iou_bev(boxes_a, boxes_b):
|
|
"""Calculate boxes IoU in the Bird's Eye 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])))
|
|
|
|
ext_module.iou3d_boxes_iou_bev_forward(boxes_a.contiguous(),
|
|
boxes_b.contiguous(), ans_iou)
|
|
|
|
return ans_iou
|
|
|
|
|
|
def nms_bev(boxes, scores, thresh, pre_max_size=None, post_max_size=None):
|
|
"""NMS function GPU implementation (for BEV boxes). The overlap of two
|
|
boxes for IoU calculation is defined as the exact overlapping area of the
|
|
two boxes. In this function, one can also set ``pre_max_size`` and
|
|
``post_max_size``.
|
|
|
|
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 (float): Overlap threshold of NMS.
|
|
pre_max_size (int, optional): Max size of boxes before NMS.
|
|
Default: None.
|
|
post_max_size (int, optional): Max size of boxes after NMS.
|
|
Default: None.
|
|
|
|
Returns:
|
|
torch.Tensor: Indexes after NMS.
|
|
"""
|
|
assert boxes.size(1) == 5, 'Input boxes shape should be [N, 5]'
|
|
order = scores.sort(0, descending=True)[1]
|
|
|
|
if pre_max_size is not None:
|
|
order = order[:pre_max_size]
|
|
boxes = boxes[order].contiguous()
|
|
|
|
keep = torch.zeros(boxes.size(0), dtype=torch.long)
|
|
num_out = ext_module.iou3d_nms_forward(boxes, keep, thresh)
|
|
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_bev(boxes, scores, thresh):
|
|
"""Normal NMS function GPU implementation (for BEV boxes). The overlap of
|
|
two boxes for IoU calculation is defined as the exact overlapping area of
|
|
the two boxes WITH their yaw angle set to 0.
|
|
|
|
Args:
|
|
boxes (torch.Tensor): Input boxes with shape (N, 5).
|
|
scores (torch.Tensor): Scores of predicted boxes with shape (N).
|
|
thresh (float): Overlap threshold of NMS.
|
|
|
|
Returns:
|
|
torch.Tensor: Remaining indices with scores in descending order.
|
|
"""
|
|
assert boxes.shape[1] == 5, 'Input boxes shape should be [N, 5]'
|
|
order = scores.sort(0, descending=True)[1]
|
|
|
|
boxes = boxes[order].contiguous()
|
|
|
|
keep = torch.zeros(boxes.size(0), dtype=torch.long)
|
|
num_out = ext_module.iou3d_nms_normal_forward(boxes, keep, thresh)
|
|
return order[keep[:num_out].cuda(boxes.device)].contiguous()
|
|
|