如果你不知道自己要驶向哪个港口,那么无论是东南风还是西北风,对你都无所谓的。--《极简主义》范式二:弄明白要做什么,那就成功一半了
0.引子
IOU中文名叫交并比,见名知意就是交集与并集的比值。是在目标检测中常用的算法
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:坐标轴的定义
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的表示与计算
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),一起探讨学习深度学习理论与应用开发技术。
笔者会经常分享深度学习干货内容,大家在学习或者应用深度学习时,遇到什么问题也可以与我在上面交流知无不答。
出自CSDN博客专家&知乎深度学习专栏作家@小宋是呢