91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3怎樣實現兩個矩形的交并比

發布時間:2021-09-28 10:53:47 來源:億速云 閱讀:96 作者:小新 欄目:編程語言

這篇文章主要介紹了Python3怎樣實現兩個矩形的交并比,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

交并比的概念及應用

假設平面坐標中有一個矩形,并且這個矩形的長和寬均分別與x軸和y軸平行。

那么矩形在平面坐標中的唯一位置可以通過對角線上的兩個頂點坐標來確定(這里不做證明)。

如下圖所示:這個矩形的唯一位置可以用左上和右下的頂點坐標,即:(xmin, ymax, xmax, ymin)來確定,也可以用左下和右上頂點坐標,即(xmin, ymin, xmax, ymax)來確定。

接下來說一下自己踩的坑:網上的大部分博客,圖是標的是左上和右下的頂點坐標,但是代碼清一色是通過左下和右上頂點坐標來確定矩形位置的。所以一開始看著特別暈圈。

理論上兩種確定方式都可以,不過相對而言,通過左下和右上兩個頂點坐標,即(xmin, ymin, xmax, ymax)來確定矩形位置更符合我們的習慣,我想這也是網上大部分代碼都是這樣的原因吧。

矩形的面積很好求,長X寬就行:

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

好了,理清楚怎么確定矩形的位置后,接下來我們就來解決交并比的計算問題。

交并比(Intersection over Union, IoU)是目標檢測任務中的一個非常重要的概念。它是產生的預測框(Predicted bounding box)與原標記框(Ground-truth bounding box)的交疊率,即它們的交集(相交面積)與并集(總面積)的比值。最理想情況是完全重疊,即比值為1。一般來說,這個score > 0.5 就可以被認為是一個不錯的結果。這個標準用于測量真實和預測之間的相關度,相關度越高,該值越高,它可以評估算法的準確度。

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

IoU計算公式:

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

求交并比的關鍵是求出相交矩形G∩P的面積。

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

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

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

如果一下沒有看明白,可以自己在紙上多畫畫,理解下。

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

area(G∩P) = 長 X 寬

w = xmax - xmin # 計算相交矩形的長

h = ymax - ymin # 計算相交矩形的寬

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

這里還有最后一個問題,當計算得到的寬或者長為0或者負數時,說明兩個矩形不相交,相交面積為0,那么最后的IoU就為0。這里我們有兩種處理方式:

1. 用if語句來分類討論:

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

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

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

三、Python3 實現代碼

經過以上分析,思路應該已經非常清晰了,這里我就直接放出完整Python3代碼。

def calculate_IoU(predicted_bound, ground_truth_bound): """ computing the IoU of two boxes. Args:  box: (xmin, ymin, xmax, ymax),通過左下和右上兩個頂點坐標來確定矩形位置 Return:  IoU: IoU of box1 and box2. """ pxmin, pymin, pxmax, pymax = predicted_bound print("預測框P的坐標是:({}, {}, {}, {})".format(pxmin, pymin, pxmax, pymax)) gxmin, gymin, gxmax, gymax = ground_truth_bound print("原標記框G的坐標是:({}, {}, {}, {})".format(gxmin, gymin, gxmax, gymax)) parea = (pxmax - pxmin) * (pymax - pymin) # 計算P的面積 garea = (gxmax - gxmin) * (gymax - gymin) # 計算G的面積 print("預測框P的面積是:{};原標記框G的面積是:{}".format(parea, garea)) # 求相交矩形的左下和右上頂點坐標(xmin, ymin, xmax, ymax) xmin = max(pxmin, gxmin) # 得到左下頂點的橫坐標 ymin = max(pymin, gymin) # 得到左下頂點的縱坐標 xmax = min(pxmax, gxmax) # 得到右上頂點的橫坐標 ymax = min(pymax, gymax) # 得到右上頂點的縱坐標 # 計算相交矩形的面積 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) # 可以用一行代碼算出來相交矩形的面積 print("G∩P的面積是:{}".format(area)) # 并集的面積 = 兩個矩形面積 - 交集面積 IoU = area / (parea + garea - area) return IoUif __name__ == '__main__': IoU = calculate_IoU( (1, -1, 3, 1), (0, 0, 2, 2)) print("IoU是:{}".format(IoU))

這里也放一下通過左上和右下頂點坐標來確定矩形的位置的Python3代碼。原理是一樣的,不要弄混就好。

def calculate_IoU(predicted_bound, ground_truth_bound): """ computing the IoU of two boxes. Args:  box: (x1, y1, x2, y2),通過左上和右下兩個頂點坐標來確定矩形 Return:  IoU: IoU of box1 and box2. """ px1, py1, px2, py2 = predicted_bound print("預測框P的坐標是:({}, {}, {}, {})".format(px1, py1, px2, py2)) gx1, gy1, gx2, gy2 = ground_truth_bound print("原標記框G的坐標是:({}, {}, {}, {})".format(gx1, gy1, gx2, gy2)) parea = (px2 - px1) * (py1 - py2) # 計算P的面積 garea = (gx2 - gx1) * (gy1 - gy2) # 計算G的面積 print("預測框P的面積是:{};原標記框G的面積是:{}".format(parea, garea)) # 求相交矩形的左上和右下頂點坐標(x1, y1, x2, y2) x1 = max(px1, gx1) # 得到左上頂點的橫坐標 y1 = min(py1, gy1) # 得到左上頂點的縱坐標 x2 = min(px2, gx2) # 得到右下頂點的橫坐標 y2 = max(py2, gy2) # 得到右下頂點的縱坐標 # 利用max()方法處理兩個矩形沒有交集的情況,當沒有交集時,w或者h取0,比較巧妙的處理方法 # w = max(0, (x2 - x1)) # 相交矩形的長,這里用w來表示 # h = max(0, (y1 - y2)) # 相交矩形的寬,這里用h來表示 # print("相交矩形的長是:{},寬是:{}".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)) # 并集的面積 = 兩個矩形面積 - 交集面積 IoU = area / (parea + garea - area) return IoUif __name__ == '__main__': IoU = calculate_IoU( (1, 1, 3, -1), (0, 2, 2, 0)) print("IoU是:{}".format(IoU))

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python3怎樣實現兩個矩形的交并比”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德庆县| 南汇区| 平泉县| 黄冈市| 郯城县| 南昌县| 中卫市| 英山县| 玛纳斯县| 驻马店市| 西丰县| 宜昌市| 龙川县| 宁强县| 富蕴县| 望都县| 尚志市| 巴林左旗| 灌阳县| 吉木乃县| 城口县| 安仁县| 禹州市| 黄冈市| 开原市| 高碑店市| 赤峰市| 福泉市| 广丰县| 锡林浩特市| 西林县| 涞水县| 平潭县| 康马县| 北安市| 简阳市| 平泉县| 和顺县| 阳谷县| 永顺县| 泸州市|