python计算IOU代码

最近在复现论文过程中需要计算IoU,对这个问题苦恼已久,同时由于YOLO输出的坐标在图上是左上角顶点和右下角顶点,但是图是倒着的,即Y轴向下,因此实际上输出的坐标是左下角顶点和右上角顶点,由于强迫症我将它们转化成了常用直角坐标系下的左上右下顶点,因此在判断是否相交以及计算IoU的代码与原始代码有差别,遂进行记录分享:

 

判断两个预测框是否重叠的函数定义如下:

def check_intersection(a, b):
    x1, y1, x2, y2 = a[0:4]
    x3, y3, x4, y4 = b[0:4]

    if x2 < x3 or x4 < x1 or y3 < y2 or y4 > y1:
        return False
    else:

        return True

计算IoU的代码如下:

def calculate_iou(a, b):
    x1, y1, x2, y2 = a[0:4]
    x3, y3, x4, y4 = b[0:4]

    x_overlap = min(x2, x4) - max(x1, x3)
    y_overlap = min(y1, y3) - max(y2, y4)


    if x_overlap > 0 and y_overlap > 0:
        intersection_area = x_overlap * y_overlap

    # 计算并集面积
    area_a = (x2 - x1 ) * (y1 - y2 )
    area_b = (x4 - x3 ) * (y3 - y4)
    union_area = area_a + area_b - intersection_area

    # 计算IoU值
    iou = intersection_area / union_area

注意:我的边界框坐标与YOLO输出的不同,YOLO输出的坐标是x轴向右为正方向和y轴向下为正方向的矩形的左上角和右下角顶点坐标,但在Y轴向上为正方向的矩形中为左下和右上坐标,我由于强迫症将它转换成了标准直角坐标系下左上右下的坐标,因此计算方式与原本的有差别。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值