计算IOU(取自MDNet代码)

def overlap_ratio(rect1, rect2):  # 计算bounding box和ground truth的IOU
    '''
    target bbox (min_x,min_y,w,h)
    '''
    if rect1.ndim == 1:  # 判断维度是否为一维
        rect1 = rect1[None, :]  # 给np.array增加新的维度
    if rect2.ndim == 1:
        rect2 = rect2[None, :]

    left = np.maximum(rect1[:, 0], rect2[:, 0])  # 交集左侧对应的x坐标
    right = np.minimum(rect1[:, 0]+rect1[:, 2], rect2[:, 0]+rect2[:, 2])  # 交集右侧对应的x坐标
    top = np.maximum(rect1[:, 1], rect2[:, 1])  # 交集上侧对应的y坐标
    bottom = np.minimum(rect1[:, 1]+rect1[:, 3], rect2[:, 1]+rect2[:, 3])  # 交集下侧对应的x坐标

    intersect = np.maximum(0, right - left) * np.maximum(0, bottom - top)  # 交集的面积
    union = rect1[:, 2]*rect1[:, 3] + rect2[:, 2]*rect2[:, 3] - intersect  # 并集的面积
    iou = np.clip(intersect / union, 0, 1)
    return iou

example:

代码执行过程:

>>> import numpy as np
>>> rect1 = np.array([2,1,2,4])
>>> rect2 = np.array([3,3,2,4])
>>> rect1 = rect1[None,:]
>>> rect2 = rect2[None,:]
>>> left = np.maximum(rect1[:, 0], rect2[:, 0])
>>> right = np.minimum(rect1[:, 0]+rect1[:, 2], rect2[:, 0]+rect2[:, 2])
>>> top = np.maximum(rect1[:, 1], rect2[:, 1])
>>> bottom = np.minimum(rect1[:, 1]+rect1[:, 3], rect2[:, 1]+rect2[:, 3])
>>> left
array([3])
>>> right
array([4])
>>> top
array([3])
>>> bottom
array([5])
>>> intersect = np.maximum(0, right - left) * np.maximum(0, bottom - top)
>>> intersect
array([2])
>>> union = rect1[:, 2]*rect1[:, 3] + rect2[:, 2]*rect2[:, 3] - intersect
>>> union
array([14])
>>> iou = np.clip(intersect / union, 0, 1)
>>> iou
array([0.14285714])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值