IOU計算代碼

import numpy as np

def compute_iou(box1, box2, standard_coordinates=True):
    '''
    :param box1: [Xmin, Ymin, Xmax, Ymax] or [Xcenter, Ycenter, W, H]
    :param box2:
    :param standard_coordinates: True [Xmin, Ymin, Xmax, Ymax] Fasle [Xcenter, Ycenter, W, H]
    :return:
    '''

    # 傳進來的是標準座標
    if standard_coordinates is True:
        Xmin1, Ymin1, Xmax1, Ymax1 = box1
        Xmin2, Ymin2, Xmax2, Ymax2 = box2
    # 傳進來的是中心座標
    else:
        Xcenter1, Ycenter1, W1, H1 = box1
        Xcenter2, Ycenter2, W2, H2 = box2
        Xmin1, Ymin1 = int(Xcenter1 - W1 / 2), int(Ycenter1 - H1 / 2)
        Xmax1, Ymax1 = int(Xcenter1 + W1 / 2), int(Ycenter1 + H1 / 2)
        Xmin2, Ymin2 = int(Xcenter2 - W2 / 2), int(Ycenter2 - H2 / 2)
        Xmax2, Ymax2 = int(Xcenter2 + W2 / 2), int(Ycenter2 + H2 / 2)

    # 獲得相交區域的左上角座標和右下角座標 min = max(min) max = min(max)
    inter_Xmin = max(Xmin1, Xmin2)
    inter_Ymin = max(Ymin1, Ymin2)
    inter_Xmax = min(Xmax1, Xmax2)
    inter_Ymax = min(Ymax1, Ymax2)

    # 以免不相交
    W = max(0, inter_Xmax - inter_Xmin)
    H = max(0, inter_Ymax - inter_Ymin)

    # 計算相交區域面積
    inter_area = W * H

    # 計算並集面積
    merge_area = (Xmax1 - Xmin1) * (Ymax1 - Ymin1) + (Xmax2 - Xmin2) * (Ymax2 - Ymin2)

    # 計算IOU
    IOU = inter_area / (merge_area - inter_area + 1e-6)

    return IOU


iou = compute_iou([0, 0, 2, 2], [1, 1, 3, 3])
print(iou)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章