如果你不知道自己要駛向哪個港口,那麼無論是東南風還是西北風,對你都無所謂的。--《極簡主義》範式二:弄明白要做什麼,那就成功一半了
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
[
]
-
(
Boxb
[
2
]
/
2.0
)
)
,
round
(
Boxb
[
1
]
-
(
Boxb
[
3
]
/
2.0
)
,
round
(
Boxb
[
]
+
(
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
(
,
xmax
-
xmin
)
h
=
max
(
,
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部落格專家&知乎深度學習專欄作家@小宋是呢