目标检测——交并比(Intersection of Union,IoU)计算

文章目录[隐藏]

在检测任务中,使用交并比(Intersection of Union,IoU)作为衡量指标,来描述两个框之间的重合度。这一概念来源于数学中的集合,用来描述两个集合

A

A

A

B

B

B之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下:

I

o

U

=

A

B

A

B

IoU = \frac{A\cap B}{A \cup B}

IoU=ABAB

两个框可以看成是两个像素的集合,它们的交并比等于两个框重合部分的面积除以它们合并起来的面积。
图“交集”中青色区域是两个框的重合面积,
图“并集”中蓝色区域是两个框的相并面积。
用这两个面积相除即可得到它们之间的交并比,如 图1 所示。

图1:交并比

图2:交并比公式

假设两个矩形框A和B的位置分别为:

A

:

[

x

a

1

,

y

a

1

,

x

a

2

,

y

a

2

]

A: [x_{a1}, y_{a1}, x_{a2}, y_{a2}]

A:[xa1,ya1,xa2,ya2]

B

:

[

x

b

1

,

y

b

1

,

x

b

2

,

y

b

2

]

B: [x_{b1}, y_{b1}, x_{b2}, y_{b2}]

B:[xb1,yb1,xb2,yb2]

假如位置关系如 图3 所示:

图3:计算交并比

如果二者有相交部分,则相交部分左上角坐标为:

x

1

=

m

a

x

(

x

a

1

,

x

b

1

)

,

     

y

1

=

m

a

x

(

y

a

1

,

y

b

1

)

x_1 = max(x_{a1}, x_{b1}), \ \ \ \ \ y_1 = max(y_{a1}, y_{b1})

x1=max(xa1,xb1),     y1=max(ya1,yb1)

相交部分右下角坐标为:

x

2

=

m

i

n

(

x

a

2

,

x

b

2

)

,

     

y

2

=

m

i

n

(

y

a

2

,

y

b

2

)

x_2 = min(x_{a2}, x_{b2}), \ \ \ \ \ y_2 = min(y_{a2}, y_{b2})

x2=min(xa2,xb2),     y2=min(ya2,yb2)

计算先交部分面积:

i

n

t

e

r

s

e

c

t

i

o

n

=

m

a

x

(

x

2

x

1

+

1.0

,

0

)

m

a

x

(

y

2

y

1

+

1.0

,

0

)

intersection = max(x_2 - x_1 + 1.0, 0) \cdot max(y_2 - y_1 + 1.0, 0)

intersection=max(x2x1+1.0,0)max(y2y1+1.0,0)

矩形框A和B的面积分别是:

S

A

=

(

x

a

2

x

a

1

+

1.0

)

(

y

a

2

y

a

1

+

1.0

)

S_A = (x_{a2} - x_{a1} + 1.0) \cdot (y_{a2} - y_{a1} + 1.0)

SA=(xa2xa1+1.0)(ya2ya1+1.0)

S

B

=

(

x

b

2

x

b

1

+

1.0

)

(

y

b

2

y

b

1

+

1.0

)

S_B = (x_{b2} - x_{b1} + 1.0) \cdot (y_{b2} - y_{b1} + 1.0)

SB=(xb2xb1+1.0)(yb2yb1+1.0)

计算相并部分面积:

u

n

i

o

n

=

S

A

+

S

B

i

n

t

e

r

s

e

c

t

i

o

n

union = S_A + S_B - intersection

union=SA+SBintersection

计算交并比:

I

o

U

=

i

n

t

e

r

s

e

c

t

i

o

n

u

n

i

o

n

IoU = \frac{intersection}{union}

IoU=unionintersection


交并比计算程序如下:

# 计算IoU,矩形框的坐标形式为xyxy,这个函数会被保存在box_utils.py文件中
def box_iou_xyxy(box1, box2):
    # 获取box1左上角和右下角的坐标
    x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
    # 计算box1的面积
    s1 = (y1max - y1min + 1.) * (x1max - x1min + 1.)
    # 获取box2左上角和右下角的坐标
    x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]
    # 计算box2的面积
    s2 = (y2max - y2min + 1.) * (x2max - x2min + 1.)
    
    # 计算相交矩形框的坐标
    xmin = np.maximum(x1min, x2min)
    ymin = np.maximum(y1min, y2min)
    xmax = np.minimum(x1max, x2max)
    ymax = np.minimum(y1max, y2max)
    # 计算相交矩形行的高度、宽度、面积
    inter_h = np.maximum(ymax - ymin + 1., 0.)
    inter_w = np.maximum(xmax - xmin + 1., 0.)
    intersection = inter_h * inter_w
    # 计算相并面积
    union = s1 + s2 - intersection
    # 计算交并比
    iou = intersection / union
    return iou


bbox1 = [100., 100., 200., 200.]
bbox2 = [120., 120., 220., 220.]
iou = box_iou_xyxy(bbox1, bbox2)
print('IoU is {}'.format(iou))  
# 计算IoU,矩形框的坐标形式为xywh
def box_iou_xywh(box1, box2):
    x1min, y1min = box1[0] - box1[2]/2.0, box1[1] - box1[3]/2.0
    x1max, y1max = box1[0] + box1[2]/2.0, box1[1] + box1[3]/2.0
    s1 = box1[2] * box1[3]

    x2min, y2min = box2[0] - box2[2]/2.0, box2[1] - box2[3]/2.0
    x2max, y2max = box2[0] + box2[2]/2.0, box2[1] + box2[3]/2.0
    s2 = box2[2] * box2[3]

    xmin = np.maximum(x1min, x2min)
    ymin = np.maximum(y1min, y2min)
    xmax = np.minimum(x1max, x2max)
    ymax = np.minimum(y1max, y2max)
    inter_h = np.maximum(ymax - ymin, 0.)
    inter_w = np.maximum(xmax - xmin, 0.)
    intersection = inter_h * inter_w

    union = s1 + s2 - intersection
    iou = intersection / union
    return iou

bbox1 = [100., 100., 200., 200.]
bbox2 = [120., 120., 220., 220.]
iou = box_iou_xywh(bbox1, bbox2)
print('IoU is {}'.format(iou))  

为了直观的展示交并比的大小跟重合程度之间的关系,图4 示意了不同交并比下两个框之间的相对位置关系,从 IoU = 0.95 到 IoU = 0.

图4:不同交并比下两个框之间相对位置示意图


参考文章

目标检测基础介绍
理解IOU、precision、recall、AP、mAP的含义
IOU计算

版权声明:本文为CSDN博主「Starzkg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43272781/article/details/113757298

Starzkg

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

深度学习_目标检测_“YOLOv5”详解(持续更新)

我最近对很火的元宇宙及其衍生概念进行了思考,虽然现在谈元宇宙落地还为时尚早,但是根据这个愿景反推回来很多的技术趋势和未来的发展方向还是值得关注的。下面是我的公众号原文:【AI行业进展研究与商业价值分析】