欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Python3實(shí)現(xiàn)兩個(gè)矩形的交并比(IoU)

 更新時(shí)間:2020年01月18日 09:58:21   作者:Jock2018  
今天小編就為大家分享一篇淺談Python3實(shí)現(xiàn)兩個(gè)矩形的交并比(IoU),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

一、前言

因?yàn)樽罱鼊偤帽粏?wèn)到這個(gè)問(wèn)題,但是自己當(dāng)時(shí)特別懵逼,導(dǎo)致沒(méi)有做出來(lái)。所以下來(lái)后自己Google了很多IoU的博客,但是很多博客要么過(guò)于簡(jiǎn)略,要么是互相轉(zhuǎn)載的,有一些博客圖和代碼還有點(diǎn)問(wèn)題,也導(dǎo)致自己這個(gè)萌新走了不少?gòu)澛?。所以自己重新整理了看的博客,力求以更?jiǎn)單的方式展現(xiàn)這個(gè)問(wèn)題的解答辦法,方便日后自己回顧。如果朋友們覺(jué)得寫(xiě)的有問(wèn)題的地方,非常歡迎大家在下面留言交流,避免因?yàn)槲业膯?wèn)題導(dǎo)致讀者走彎路。

二、交并比的概念及應(yīng)用

假設(shè)平面坐標(biāo)中有一個(gè)矩形,并且這個(gè)矩形的長(zhǎng)和寬均分別與x軸和y軸平行。

那么矩形在平面坐標(biāo)中的唯一位置可以通過(guò)對(duì)角線上的兩個(gè)頂點(diǎn)坐標(biāo)來(lái)確定(這里不做證明)。

如下圖所示:這個(gè)矩形的唯一位置可以用左上和右下的頂點(diǎn)坐標(biāo),即:(xmin, ymax, xmax, ymin)來(lái)確定,也可以用左下和右上頂點(diǎn)坐標(biāo),即(xmin, ymin, xmax, ymax)來(lái)確定。

接下來(lái)說(shuō)一下自己踩的坑:網(wǎng)上的大部分博客,圖是標(biāo)的是左上和右下的頂點(diǎn)坐標(biāo),但是代碼清一色是通過(guò)左下和右上頂點(diǎn)坐標(biāo)來(lái)確定矩形位置的。所以一開(kāi)始看著特別暈圈。

理論上兩種確定方式都可以,不過(guò)相對(duì)而言,通過(guò)左下和右上兩個(gè)頂點(diǎn)坐標(biāo),即(xmin, ymin, xmax, ymax)來(lái)確定矩形位置更符合我們的習(xí)慣,我想這也是網(wǎng)上大部分代碼都是這樣的原因吧。

矩形的面積很好求,長(zhǎng)X寬就行:

矩形的面積 = (xmax -xmin) X (ymax - ymin)

好了,理清楚怎么確定矩形的位置后,接下來(lái)我們就來(lái)解決交并比的計(jì)算問(wèn)題。

交并比(Intersection over Union, IoU)是目標(biāo)檢測(cè)任務(wù)中的一個(gè)非常重要的概念。它是產(chǎn)生的預(yù)測(cè)框(Predicted bounding box)與原標(biāo)記框(Ground-truth bounding box)的交疊率,即它們的交集(相交面積)與并集(總面積)的比值。最理想情況是完全重疊,即比值為1。一般來(lái)說(shuō),這個(gè)score > 0.5 就可以被認(rèn)為是一個(gè)不錯(cuò)的結(jié)果。這個(gè)標(biāo)準(zhǔn)用于測(cè)量真實(shí)和預(yù)測(cè)之間的相關(guān)度,相關(guān)度越高,該值越高,它可以評(píng)估算法的準(zhǔn)確度。

假設(shè)平面坐標(biāo)中有兩個(gè)矩形:原標(biāo)記框(Ground-truth bounding box, G)和預(yù)測(cè)框(Predicted bounding box, P),其中G為手動(dòng)標(biāo)記的框,P為算法預(yù)測(cè)的框,并且這兩個(gè)矩形的長(zhǎng)和寬均分別與x軸和y軸平行。如下圖所示:

IoU計(jì)算公式:

所以有:矩形G(gxmin, gymin, gxmax, gymax)和矩形P(pxmin, pymin, pxmax, pymax)

求交并比的關(guān)鍵是求出相交矩形G∩P的面積。

解決這個(gè)問(wèn)題,我們只要確定相交矩形的左下(xmin, ymin)和右上(xmax, ymax)頂點(diǎn)坐標(biāo)即可,即確定(xmin, ymin, xmax, ymax)。

通過(guò)看圖,我們可以清楚的觀察到:

# 相交矩形的左下頂點(diǎn)坐標(biāo), 就是兩個(gè)矩形左下坐標(biāo)的x和y分別取最大值
xmin = max(gxmin, pxmin)
ymin = max(gymin, pymin)
# 相交矩形的右上頂點(diǎn)坐標(biāo), 就是兩個(gè)矩形右上坐標(biāo)的x和y分別取最小值
xmax = min(gxmax, pxmax)
ymax = min(gymax, pyxmax)

如果一下沒(méi)有看明白,可以自己在紙上多畫(huà)畫(huà),理解下。

得到了相交矩形的坐標(biāo)(xmin, ymin, xmax, ymax)那么相交矩形的面積就非常簡(jiǎn)單了。

area(G∩P) = 長(zhǎng) X 寬

w = xmax - xmin # 計(jì)算相交矩形的長(zhǎng)

h = ymax - ymin # 計(jì)算相交矩形的寬

area(G∩P) = w X h # 計(jì)算相交矩形的面積

這里還有最后一個(gè)問(wèn)題,當(dāng)計(jì)算得到的寬或者長(zhǎng)為0或者負(fù)數(shù)時(shí),說(shuō)明兩個(gè)矩形不相交,相交面積為0,那么最后的IoU就為0。這里我們有兩種處理方式:

1. 用if語(yǔ)句來(lái)分類討論:

if w <=0 or h <= 0:
 return 0

2. 用max()方法來(lái)處理:

w = max(0, (x2 - x1))
h = max(0, (y1 - y2))

三、Python3 實(shí)現(xiàn)代碼

經(jīng)過(guò)以上分析,思路應(yīng)該已經(jīng)非常清晰了,這里我就直接放出完整Python3代碼。

def calculate_IoU(predicted_bound, ground_truth_bound):
 """
 computing the IoU of two boxes.
 Args:
  box: (xmin, ymin, xmax, ymax),通過(guò)左下和右上兩個(gè)頂點(diǎn)坐標(biāo)來(lái)確定矩形位置
 Return:
  IoU: IoU of box1 and box2.
 """
 pxmin, pymin, pxmax, pymax = predicted_bound
 print("預(yù)測(cè)框P的坐標(biāo)是:({}, {}, {}, {})".format(pxmin, pymin, pxmax, pymax))
 gxmin, gymin, gxmax, gymax = ground_truth_bound
 print("原標(biāo)記框G的坐標(biāo)是:({}, {}, {}, {})".format(gxmin, gymin, gxmax, gymax))

 parea = (pxmax - pxmin) * (pymax - pymin) # 計(jì)算P的面積
 garea = (gxmax - gxmin) * (gymax - gymin) # 計(jì)算G的面積
 print("預(yù)測(cè)框P的面積是:{};原標(biāo)記框G的面積是:{}".format(parea, garea))

 # 求相交矩形的左下和右上頂點(diǎn)坐標(biāo)(xmin, ymin, xmax, ymax)
 xmin = max(pxmin, gxmin) # 得到左下頂點(diǎn)的橫坐標(biāo)
 ymin = max(pymin, gymin) # 得到左下頂點(diǎn)的縱坐標(biāo)
 xmax = min(pxmax, gxmax) # 得到右上頂點(diǎn)的橫坐標(biāo)
 ymax = min(pymax, gymax) # 得到右上頂點(diǎn)的縱坐標(biāo)

 # 計(jì)算相交矩形的面積
 w = xmax - xmin
 h = ymax - ymin
 if w <=0 or h <= 0:
  return 0

 area = w * h # G∩P的面積
 # area = max(0, xmax - xmin) * max(0, ymax - ymin) # 可以用一行代碼算出來(lái)相交矩形的面積
 print("G∩P的面積是:{}".format(area))

 # 并集的面積 = 兩個(gè)矩形面積 - 交集面積
 IoU = area / (parea + garea - area)

 return IoU

if __name__ == '__main__':
 IoU = calculate_IoU( (1, -1, 3, 1), (0, 0, 2, 2))
 print("IoU是:{}".format(IoU))

這里也放一下通過(guò)左上和右下頂點(diǎn)坐標(biāo)來(lái)確定矩形的位置的Python3代碼。原理是一樣的,不要弄混就好。

def calculate_IoU(predicted_bound, ground_truth_bound):
 """
 computing the IoU of two boxes.
 Args:
  box: (x1, y1, x2, y2),通過(guò)左上和右下兩個(gè)頂點(diǎn)坐標(biāo)來(lái)確定矩形
 Return:
  IoU: IoU of box1 and box2.
 """
 px1, py1, px2, py2 = predicted_bound
 print("預(yù)測(cè)框P的坐標(biāo)是:({}, {}, {}, {})".format(px1, py1, px2, py2))

 gx1, gy1, gx2, gy2 = ground_truth_bound
 print("原標(biāo)記框G的坐標(biāo)是:({}, {}, {}, {})".format(gx1, gy1, gx2, gy2))

 parea = (px2 - px1) * (py1 - py2) # 計(jì)算P的面積
 garea = (gx2 - gx1) * (gy1 - gy2) # 計(jì)算G的面積
 print("預(yù)測(cè)框P的面積是:{};原標(biāo)記框G的面積是:{}".format(parea, garea))

 # 求相交矩形的左上和右下頂點(diǎn)坐標(biāo)(x1, y1, x2, y2)
 x1 = max(px1, gx1) # 得到左上頂點(diǎn)的橫坐標(biāo)
 y1 = min(py1, gy1) # 得到左上頂點(diǎn)的縱坐標(biāo)
 x2 = min(px2, gx2) # 得到右下頂點(diǎn)的橫坐標(biāo)
 y2 = max(py2, gy2) # 得到右下頂點(diǎn)的縱坐標(biāo)

 # 利用max()方法處理兩個(gè)矩形沒(méi)有交集的情況,當(dāng)沒(méi)有交集時(shí),w或者h(yuǎn)取0,比較巧妙的處理方法
 # w = max(0, (x2 - x1)) # 相交矩形的長(zhǎng),這里用w來(lái)表示
 # h = max(0, (y1 - y2)) # 相交矩形的寬,這里用h來(lái)表示
 # print("相交矩形的長(zhǎng)是:{},寬是:{}".format(w, h))
 # 這里也可以考慮引入if判斷
 w = x2 - x1
 h = y1 - y2
 if w <=0 or h <= 0:
  return 0

 area = w * h # G∩P的面積
 print("G∩P的面積是:{}".format(area))

 # 并集的面積 = 兩個(gè)矩形面積 - 交集面積
 IoU = area / (parea + garea - area)

 return IoU

if __name__ == '__main__':
 IoU = calculate_IoU( (1, 1, 3, -1), (0, 2, 2, 0))
 print("IoU是:{}".format(IoU))

以上這篇淺談Python3實(shí)現(xiàn)兩個(gè)矩形的交并比(IoU)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python的高階函數(shù)用法實(shí)例分析

    Python的高階函數(shù)用法實(shí)例分析

    這篇文章主要介紹了Python的高階函數(shù)用法,結(jié)合實(shí)例形式分析了Python針對(duì)字符串、列表轉(zhuǎn)換、運(yùn)算、過(guò)濾等操作函數(shù)相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • 探索Python進(jìn)度條魔法解密任務(wù)進(jìn)展新玩法

    探索Python進(jìn)度條魔法解密任務(wù)進(jìn)展新玩法

    在日常編程和應(yīng)用開(kāi)發(fā)中,展示進(jìn)度條是一種常見(jiàn)的技巧,不僅能夠提供用戶友好的體驗(yàn),還可以顯示任務(wù)執(zhí)行的進(jìn)度,Python作為一種多才多藝的編程語(yǔ)言,提供了多種方法來(lái)創(chuàng)建進(jìn)度條,本篇文章將深入探討這些方法,為您呈現(xiàn)各種實(shí)現(xiàn)進(jìn)度條的技術(shù)和技巧
    2024-01-01
  • Mac下python包管理工具pip的安裝

    Mac下python包管理工具pip的安裝

    這篇文章介紹了Mac下python包管理工具pip的安裝方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python3壓縮和解壓縮實(shí)現(xiàn)代碼

    Python3壓縮和解壓縮實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python3壓縮和解壓縮實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • pandas中df.groupby()方法深入講解

    pandas中df.groupby()方法深入講解

    在使用pandas進(jìn)行數(shù)據(jù)統(tǒng)計(jì)分析時(shí)遇到了問(wèn)題,找了很久才找到解決辦法,所以下面這篇文章主要給大家介紹了關(guān)于pandas中df.groupby()方法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • pytorch實(shí)現(xiàn)梯度下降和反向傳播圖文詳細(xì)講解

    pytorch實(shí)現(xiàn)梯度下降和反向傳播圖文詳細(xì)講解

    這篇文章主要介紹了pytorch實(shí)現(xiàn)梯度下降和反向傳播,反向傳播的目的是計(jì)算成本函數(shù)C對(duì)網(wǎng)絡(luò)中任意w或b的偏導(dǎo)數(shù)。一旦我們有了這些偏導(dǎo)數(shù),我們將通過(guò)一些常數(shù)α的乘積和該數(shù)量相對(duì)于成本函數(shù)的偏導(dǎo)數(shù)來(lái)更新網(wǎng)絡(luò)中的權(quán)重和偏差
    2023-04-04
  • Python垃圾回收機(jī)制三種實(shí)現(xiàn)方法

    Python垃圾回收機(jī)制三種實(shí)現(xiàn)方法

    這篇文章主要介紹了Python垃圾回收機(jī)制三種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python黑魔法遠(yuǎn)程控制開(kāi)機(jī)的實(shí)例

    Python黑魔法遠(yuǎn)程控制開(kāi)機(jī)的實(shí)例

    這篇文章主要介紹了Python黑魔法遠(yuǎn)程控制開(kāi)機(jī)的實(shí)例,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04
  • Python subprocess模塊學(xué)習(xí)總結(jié)

    Python subprocess模塊學(xué)習(xí)總結(jié)

    從Python 2.4開(kāi)始,Python引入subprocess模塊來(lái)管理子進(jìn)程,以取代一些舊模塊的方法:如 os.system、os.spawn*、os.popen*、popen2.*、commands.*不但可以調(diào)用外部的命令作為子進(jìn)程,而且可以連接到子進(jìn)程的input/output/error管道,獲取相關(guān)的返回信息
    2014-03-03
  • python捕獲警告的三種方法

    python捕獲警告的三種方法

    這篇文章主要介紹了python捕獲警告的三種方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論