|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import torch
|
|
|
|
|
|
|
|
|
def batch_iou(proposals, gt_boxes):
|
|
|
len_proposals = proposals[:, 1] - proposals[:, 0]
|
|
|
int_xmin = torch.max(proposals[:, 0], gt_boxes[:, 0])
|
|
|
int_xmax = torch.min(proposals[:, 1], gt_boxes[:, 1])
|
|
|
inter_len = torch.clamp(int_xmax - int_xmin, min=0.)
|
|
|
union_len = len_proposals - inter_len + gt_boxes[:, 1] - gt_boxes[:, 0]
|
|
|
jaccard = inter_len / (union_len + 0.00001)
|
|
|
return jaccard
|
|
|
|
|
|
|
|
|
def bbox_xw_transform_inv(boxes, deltas, dx_w, dw_w):
|
|
|
widths = boxes[:, 1] - boxes[:, 0]
|
|
|
ctr_x = boxes[:, 0] + 0.5 * widths
|
|
|
|
|
|
dx = deltas[:, 0] * dx_w
|
|
|
dw = deltas[:, 1] * dw_w
|
|
|
|
|
|
pred_ctr_x = dx * widths + ctr_x
|
|
|
pred_w = torch.exp(dw) * widths
|
|
|
|
|
|
pred_boxes = deltas.clone()
|
|
|
|
|
|
pred_boxes[:, 0] = pred_ctr_x - 0.5 * pred_w
|
|
|
|
|
|
pred_boxes[:, 1] = pred_ctr_x + 0.5 * pred_w
|
|
|
|
|
|
return pred_boxes
|
|
|
|
|
|
|
|
|
def bbox_xw_transform_batch(ex_rois, gt_rois):
|
|
|
ex_widths = torch.clamp(ex_rois[:, 1] - ex_rois[:, 0], min=0.00001)
|
|
|
ex_ctr_x = ex_rois[:, 0] + 0.5 * ex_widths
|
|
|
|
|
|
gt_widths = torch.clamp(gt_rois[:, 1] - gt_rois[:, 0], min=0.00001)
|
|
|
gt_ctr_x = gt_rois[:, 0] + 0.5 * gt_widths
|
|
|
|
|
|
targets_dx = (gt_ctr_x - ex_ctr_x) / ex_widths
|
|
|
targets_dw = torch.log(gt_widths / ex_widths)
|
|
|
targets = torch.stack((targets_dx, targets_dw), dim=1)
|
|
|
return targets
|
|
|
|
|
|
|
|
|
def bbox_se_transform_batch(ex_rois, gt_rois):
|
|
|
ex_widths = torch.clamp(ex_rois[:, 1] - ex_rois[:, 0], min=0.00001)
|
|
|
|
|
|
s_offset = gt_rois[:, 0] - ex_rois[:, 0]
|
|
|
e_offset = gt_rois[:, 1] - ex_rois[:, 1]
|
|
|
|
|
|
targets_s = s_offset / ex_widths
|
|
|
targets_e = e_offset / ex_widths
|
|
|
targets = torch.stack((targets_s, targets_e), dim=1)
|
|
|
return targets
|
|
|
|
|
|
|
|
|
def bbox_se_transform_inv(boxes, deltas, dse_w):
|
|
|
widths = boxes[:, 1] - boxes[:, 0]
|
|
|
s_offset = deltas[:, 0] * widths * dse_w
|
|
|
e_offset = deltas[:, 1] * widths * dse_w
|
|
|
pred_boxes = deltas.clone()
|
|
|
pred_boxes[:, 0] = boxes[:, 0] + s_offset
|
|
|
pred_boxes[:, 1] = boxes[:, 1] + e_offset
|
|
|
return pred_boxes
|
|
|
|