IOU重合率計算
阿新 • • 發佈:2021-10-26
原理
python實現程式碼
不論你在什麼時候開始,重要的是開始之後就不要停止。 不論你在什麼時候結束,重要的是結束之後就不要悔恨。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 IoU