Spaces:
Runtime error
Runtime error
| import torch | |
| import numpy as np | |
| def iou_regress(input, target, beta=1. / 9, size_average=True): | |
| """ | |
| very similar to the smooth_l1_loss from pytorch, but with | |
| the extra beta parameter | |
| """ | |
| if len(input)==0: | |
| return input.sum() * 0 | |
| width_i = input[:, 2] - input[:, 0] | |
| height_i = input[:, 3] - input[:, 1] | |
| width_t = target[:, 2] - target[:, 0] | |
| height_t = target[:, 3] - target[:, 1] | |
| wh_if = torch.zeros_like(width_i) | |
| wh_if[width_i > 0] += 1 | |
| wh_if[height_i > 0] += 1 | |
| uion_i = width_i * height_i | |
| uion_t = width_t * height_t | |
| x_1_max = torch.stack([input[:,0],target[:, 0]], 0) | |
| y_1_max = torch.stack([input[:,1],target[:, 1]], 0) | |
| x_2_min = torch.stack([input[:, 2], target[:, 2]], 0) | |
| y_2_min = torch.stack([input[:, 3], target[:, 3]], 0) | |
| x_1_max = torch.max(x_1_max, 0, keepdim=True) | |
| y_1_max = torch.max(y_1_max, 0, keepdim=True) | |
| x_2_min = torch.min(x_2_min, 0, keepdim=True) | |
| y_2_min = torch.min(y_2_min, 0, keepdim=True) | |
| width_inter = x_2_min[0] - x_1_max[0] | |
| height_inter = y_2_min[0] - y_1_max[0] | |
| N1, N2 = height_inter.shape | |
| width_inter = width_inter.view([N2]) | |
| height_inter = height_inter.view([N2]) | |
| inter_area = width_inter * height_inter | |
| area_union = uion_i + uion_t - inter_area | |
| wh_if[width_inter > 0] += 1 | |
| wh_if[height_inter > 0] += 1 | |
| wh_if [wh_if != 4] = 0 | |
| wh_if [wh_if > 1] = 1 | |
| inter_area *= wh_if | |
| area_union *= wh_if | |
| iou_loss_map = -torch.log((inter_area + 1.0) / (area_union + 1.0)) | |
| iou_loss_map = iou_loss_map * wh_if | |
| del wh_if | |
| return iou_loss_map.sum() |