栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

IoU(交并比)的理解及python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

IoU(交并比)的理解及python实现

1. 概述

交并比(Intersection over Union, IoU)是目标检测、语义分割、追踪等任务最常用的评估指标。交并比,顾名思义是两区域交集与并集的比值,当两区域完全重叠时交并比最大,为1;当两区域完全不重叠时交并比最小,为0。

2. IoU计算公式

要计算候选框(candidate bound) A与真实框(ground truth bound) B的交并比。

B1框与B2框的IoU计算公式为:
I o U = ∣ A ∩ B ∣ ∣ A ∪ B ∣ IoU = frac{mid Acap Bmid}{mid Acup Bmid} IoU=∣A∪B∣∣A∩B∣​

A、B的坐标如下图:

交集的左上角坐标为:
x 1 = m a x ( x a 1 , x b 1 ) x_{1} = maxbig(x_{a1}, x_{b1}) x1​=max(xa1​,xb1​)

y 1 = m a x ( y a 1 , y b 1 ) y_{1} = maxbig(y_{a1}, y_{b1}) y1​=max(ya1​,yb1​)

交集的右下角坐标为:
x 2 = m i n ( x a 2 , x b 2 ) x_{2} = minbig(x_{a2}, x_{b2}) x2​=min(xa2​,xb2​)

y 2 = m i n ( y a 2 , y b 2 ) y_{2} = minbig(y_{a2}, y_{b2}) y2​=min(ya2​,yb2​)

交集部分的宽、高、面积:
w i d t h = m a x ( x 2 − x 1 , 0 ) width = maxbig(x_{2}-x_{1}, 0) width=max(x2​−x1​,0)

h e i g h t = m a x ( y 2 − y 1 , 0 ) height = maxbig(y_{2}-y_{1}, 0) height=max(y2​−y1​,0)

S A ∩ B = w i d t h ∗ h e i g h t S_{A cap B} = width * height SA∩B​=width∗height

A框的面积:
S A = ( x a 2 − x a 1 ) ⋅ ( y a 2 − y a 1 ) S_{A} = big(x_{a2}-x_{a1})cdotbig(y_{a2}-y_{a1}) SA​=(xa2​−xa1​)⋅(ya2​−ya1​)
B框的面积:
S B = ( x b 2 − x b 1 ) ⋅ ( y b 2 − y b 1 ) S_{B} = big(x_{b2}-x_{b1})cdotbig(y_{b2}-y_{b1}) SB​=(xb2​−xb1​)⋅(yb2​−yb1​)
并集部分:
S A ∪ B = S A + S B − S A ∩ B S_{A cup B} = S_{A} + S_{B} - S_{A cap B} SA∪B​=SA​+SB​−SA∩B​
交并比为:

I o U = S A ∩ B S A ∪ B IoU = frac{S_{A cap B}}{S_{A cup B}} IoU=SA∪B​SA∩B​​
3. IoU公式的python实现

def IoU(box1, box2) -> float:
    """
    IOU, Intersection over Union

    :param box1: list, 第一个框的两个坐标点位置 box1[x1, y1, x2, y2]
    :param box2: list, 第二个框的两个坐标点位置 box2[x1, y1, x2, y2]
    :return: float, 交并比
    """
    weight = max(min(box1[2], box2[2]) - max(box1[0], box2[0]), 0)
    height = max(min(box1[3], box2[3]) - max(box1[1], box1[1]), 0)
    s_inter = weight * height
    s_box1 = (box1[2] - box1[0]) * (box1[3] - box1[1])
    s_box2 = (box2[2] - box2[0]) * (box2[3] - box2[1])
    s_union = s_box1 + s_box2 - s_inter
    return s_inter / s_union


if __name__ == '__main__':
    box1 = [0, 0, 50, 50]
    box2 = [0, 0, 100, 100]
    print('IoU is %f' % IoU(box1, box2))
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号