numpy 向量化計算IOU

def IoU(bbox, gt):
    """
    :param bbox: (n, 4)
    :param gt: (m, 4)
    :return: (n, m)
    numpy 廣播機制 從後向前對齊。 維度爲1 的可以重複等價爲任意維度
    eg: (4,3,2)   (3,2)  (3,2)會擴充爲(4,3,2)
        (4,1,2)   (3,2) (4,1,2) 擴充爲(4, 3, 2)  (3, 2)擴充爲(4, 3,2) 擴充的方法爲重複
    廣播會在numpy的函數 如sum, maximun等函數中進行
    pytorch同理。
    擴充維度的方法:
    eg: a  a.shape: (3,2)  a[:, None, :] a.shape: (3, 1, 2) None 對應的維度相當於newaxis
    """
    lt = np.maximum(bbox[:, None, :2], gt[:, :2])  # left_top (x, y)
    rb = np.minimum(bbox[:, None, 2:], gt[:, 2:])  # right_bottom (x, y)
    wh = np.maximum(rb - lt + 1, 0)                # inter_area (w, h)
    inter_areas = wh[:, :, 0] * wh[:, :, 1]        # shape: (n, m)
    box_areas = (bbox[:, 2] - bbox[:, 0] + 1) * (bbox[:, 3] - bbox[:, 1] + 1)
    gt_areas = (gt[:, 2] - gt[:, 0] + 1) * (gt[:, 3] - gt[:, 1] + 1)
    IoU = inter_areas / (box_areas[:, None] + gt_areas - inter_areas)
    return IoU

 

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