1. 程式人生 > 其它 >IOU重合率計算

IOU重合率計算

原理

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
不論你在什麼時候開始,重要的是開始之後就不要停止。 不論你在什麼時候結束,重要的是結束之後就不要悔恨。