天天看點

python 圖像iou_Python極簡實作IoU

如果你不知道自己要駛向哪個港口,那麼無論是東南風還是西北風,對你都無所謂的。--《極簡主義》範式二:弄明白要做什麼,那就成功一半了

0.引子

IOU中文名叫交并比,見名知意就是交集與并集的比值。是在目标檢測中常用的算法

python 圖像iou_Python極簡實作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:坐标軸的定義

python 圖像iou_Python極簡實作IoU

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的表示與計算

python 圖像iou_Python極簡實作IoU

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),一起探讨學習深度學習理論與應用開發技術。

python 圖像iou_Python極簡實作IoU

筆者會經常分享深度學習幹貨内容,大家在學習或者應用深度學習時,遇到什麼問題也可以與我在上面交流知無不答。

出自CSDN部落格專家&知乎深度學習專欄作家@小宋是呢