pytorch nms 放大缩小

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jacke121/article/details/83214367

发现不同的尺寸,iou值是不一样的

w与y是同比例的,iou也不一样,框越大,iou越小

import torch


def bbox_iou_test(box1, box2, x1y1x2y2=True):
    """
    Returns the IoU of two bounding boxes
    """
    if not x1y1x2y2:
        # Transform from center and width to exact coordinates
        b1_x1, b1_x2 = box1[:, 0] - box1[:, 2] / 2, box1[:, 0] + box1[:, 2] / 2
        b1_y1, b1_y2 = box1[:, 1] - box1[:, 3] / 2, box1[:, 1] + box1[:, 3] / 2
        b2_x1, b2_x2 = box2[:, 0] - box2[:, 2] / 2, box2[:, 0] + box2[:, 2] / 2
        b2_y1, b2_y2 = box2[:, 1] - box2[:, 3] / 2, box2[:, 1] + box2[:, 3] / 2
    else:
        # Get the coordinates of bounding boxes
        b1_x1, b1_y1, b1_x2, b1_y2 = box1[:,0], box1[:,1], box1[:,2], box1[:,3]
        b2_x1, b2_y1, b2_x2, b2_y2 = box2[:,0], box2[:,1], box2[:,2], box2[:,3]

    # get the corrdinates of the intersection rectangle
    inter_rect_x1 =  torch.max(b1_x1, b2_x1)
    inter_rect_y1 =  torch.max(b1_y1, b2_y1)
    inter_rect_x2 =  torch.min(b1_x2, b2_x2)
    inter_rect_y2 =  torch.min(b1_y2, b2_y2)
    # Intersection area
    inter_area =    torch.clamp(inter_rect_x2 - inter_rect_x1 + 1, min=0) * \
                    torch.clamp(inter_rect_y2 - inter_rect_y1 + 1, min=0)
    # Union Area
    b1_area = (b1_x2 - b1_x1 + 1) * (b1_y2 - b1_y1 + 1)
    b2_area = (b2_x2 - b2_x1 + 1) * (b2_y2 - b2_y1 + 1)

    iou = inter_area / (b1_area + b2_area - inter_area + 1e-16)

    return iou

if __name__ == '__main__':

    wh_gt = torch.Tensor([[0.1, 0.1, 5, 6]])
    wh_pred = torch.Tensor([[0.15, 0.18, 7, 8]])
    wh_iou = bbox_iou_test(wh_pred, wh_gt, x1y1x2y2=False)
    print(wh_iou)
    wh_iou = bbox_iou_test(wh_pred * 10, wh_gt * 10, x1y1x2y2=False)
    print(wh_iou)
    wh_iou = bbox_iou_test(wh_pred*100, wh_gt*100, x1y1x2y2=False)
    print(wh_iou)

结果:

tensor([0.5833])
tensor([0.5409])
tensor([0.5362])

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/83214367
NMS