python 图像iou_Python极简实现IoU

如果你不知道自己要驶向哪个港口,那么无论是东南风还是西北风,对你都无所谓的。--《极简主义》范式二:弄明白要做什么,那就成功一半了

0.引子

IOU中文名叫交并比,见名知意就是交集与并集的比值。是在目标检测中常用的算法

python 图像iou_Python极简实现IoU_第1张图片

IoU原理

如上图所示,就是计算上面阴影部分与下面阴影部分的比值。

我们来拆分一下任务,分子部分就是Box1与Box2交集的面积,先设为A1。分母部分是Box1与Box2并集集的面积,设为A2,其实也是Box1面积S1加上Box2面积S2再减去一个A1(为什么要减去A1呢,因为Box1与Box2重合了A1部分,需要减去一个,没想通的童鞋去面壁0.1秒钟去:)

IoU = A1 / A2

A2 = S1 + S2 -A1

IoU = A1 / (S1 + S2 -A1)

S1是Box1的面积,S2是Box2的面积。其实问题就转化为了对Box与A1求解。

下面我们继续拆解任务

0.0:坐标轴的定义

python 图像iou_Python极简实现IoU_第2张图片

OpenCV坐标器

首先先看下在OpenCV中,坐标轴的定义。原点位于图片左上角,向右为X轴正方向,向下为Y轴正方向(这一点不同于数学中定义)。

0.1:Box表示与计算

Box有常用的两种表达方式:

1:Boxa = (xmin,ymin,xmax,ymax)(coco与voc格式);2:Boxb = (xcenter,ycenter,w,h)(yolo格式)。

其实就是根据一个事物的不同表达方式,本质上是一样的。

下面给出对应转换关系:

xmin

,

ymin

,

xmax

,

ymax

=

round

(

xcenter

-

(

w

/

2.0

)

)

,

round

(

ycenter

-

(

h

/

2.0

)

)

,

round

(

xcenter

+

(

w

/

2.0

)

)

,

round

(

ycenter

+

(

h

/

2.0

)

)

xcenter

,

ycenter

,

w

,

h

=

round

(

(

xmin

+

xmax

)

/

2.0

)

,

round

(

(

ymin

+

ymax

)

/

2.0

)

,

round

(

xmax

-

xmin

)

,

round

(

ymax

-

ymin

)

Boxa

=

(

round

(

Boxb

[

0

]

-

(

Boxb

[

2

]

/

2.0

)

)

,

round

(

Boxb

[

1

]

-

(

Boxb

[

3

]

/

2.0

)

,

round

(

Boxb

[

0

]

+

(

Boxb

[

2

]

/

2.0

)

,

round

(

Boxb

[

1

]

+

(

Boxb

[

3

]

/

2.0

)

)

Box的面积计算为 w*h

S_Boxa = (xmax-xmin)*(ymax-ymin) = (Boxa[2]-Boxa[0])*(Boxa[3]-Boxa[1])

S_Boxb = w*h = Boxb[2]*Boxb[3]

0.2:A1的表示与计算

python 图像iou_Python极简实现IoU_第3张图片

box相交的一些情况

计算相交的面积和上个问题类似,只需计算出相交框的w与h如果没有相交,就是0。由上图可以发现以下规律:如果相交时

xmin

=

max

(

xmin1

,

xmin2

)

#相交框xmin是两个框的左上角x坐标的最大值:

ymin

=

max

(

ymin1

,

ymin2

)

#相交框ymin是两个框的左上角y坐标的最大值:

xmax

=

min

(

xmax1

,

xmax2

)

#相交框xmax是两个框的右下角x坐标的最大值:

ymax

=

min

(

ymax1

,

ymax2

)

#相交框ymax是两个框的右下角y坐标的最大值:

最后处理一下不想交的情况即可,可以发现当不想交时,就会至少出现一下情况的一种:

xmax<=xmin or ymax

所以处理方法很简单:出现任一情况,w or h就会有一个等于0,使得计算出的面积也为0

w =max(0, xmax - xmin)

h =max(0, ymax - ymin)

所以整体代码就挥之欲出了,是不是也挺简单的:)

1.代码

def

cal_iou

(

box1

,

box2

)

:

"""

:param box1: = [xmin1, ymin1, xmax1, ymax1]

:param box2: = [xmin2, ymin2, xmax2, ymax2]

:return:

"""

xmin1

,

ymin1

,

xmax1

,

ymax1

=

box1

xmin2

,

ymin2

,

xmax2

,

ymax2

=

box2

# 计算每个矩形的面积

s1

=

(

xmax1

-

xmin1

)

*

(

ymax1

-

ymin1

)

# b1的面积

s2

=

(

xmax2

-

xmin2

)

*

(

ymax2

-

ymin2

)

# b2的面积

# 计算相交矩形

xmin

=

max

(

xmin1

,

xmin2

)

ymin

=

max

(

ymin1

,

ymin2

)

xmax

=

min

(

xmax1

,

xmax2

)

ymax

=

min

(

ymax1

,

ymax2

)

w

=

max

(

0

,

xmax

-

xmin

)

h

=

max

(

0

,

ymax

-

ymin

)

a1

=

w

*

h

# C∩G的面积

a2

=

s1

+

s2

-

a1

iou

=

a1

/

a2

#iou = a1/ (s1 + s2 - a1)

return

iou

-1.参考

-1.0:https://blog.csdn.net/guyuealian/article/details/86488008#commentBox

-1.1:https://blog.csdn.net/weixin_40922744/article/details/102988751

同时推荐大家关注笔者公众号“极简AI”(ID:

BriefAI),一起探讨学习深度学习理论与应用开发技术。

python 图像iou_Python极简实现IoU_第4张图片

笔者会经常分享深度学习干货内容,大家在学习或者应用深度学习时,遇到什么问题也可以与我在上面交流知无不答。

出自CSDN博客专家&知乎深度学习专栏作家@小宋是呢

你可能感兴趣的:(python,图像iou)