1. 定義
IOU(Intersection over Union)即交并比,是目标檢測中衡量目标檢測算法準确度的一個重要名額,顧名思義,即交集與并集的比值。
資料的标簽通常是目标框的資訊,如:x,y,w,h。
ground truth 所在的框是一個目标真實label,而bounding box 就是目标檢測算法預測的目标的label。如果兩個框能完全重合,那麼就說明目标檢測算法預測結果完全正确,但通常這是不可能,目标框的預測實際是回歸問題,回歸問題的損失函數再怎麼疊代更新,都不可能等于0。
用IOU門檻值來判定預測的bounding box是否有效。一般門檻值會設定在0.5,
- IOU>=0.5時,我們會把這個預測的bounding box 歸為正類,
- IOU<0.5的歸為負類。再将正類的bounding box拿去回歸訓練。
2. 計算
如上圖示,ground truth的坐标為(x0,y0,w0,h0),bounding box的坐标分别為(x1,y1,w1,h1),則交集和并集的大小為
union_all_w = max((x0+w0),(x1+w1))-min(x0,x1) # 兩個重疊矩形的重疊部分的總寬度
W = w0+w1-union_all_w # 重疊部分的寬度
H = h0+h1-(max((y0+h0),(h1+h1))-min(y0,y1))
Intersection = WH
Union = w0h0 + w1*h1 -Intersection
def compute_iou(gt_box,b_box):
'''
計算iou
:param gt_box: ground truth gt_box = [x0,y0,x1,y1](x0,y0)為左上角的坐标(x1,y1)為右下角的坐标
:param b_box: bounding box b_box 表示形式同上
:return:
'''
width0=gt_box[2]-gt_box[0] # 矩形的寬度
height0 = gt_box[3] - gt_box[1] # 矩形的高度
width1 = b_box[2] - b_box[0]
height1 = b_box[3] - b_box[1]
max_x =max(gt_box[2],b_box[2])
min_x = min(gt_box[0],b_box[0])
width = width0 + width1 -(max_x-min_x)
max_y = max(gt_box[3],b_box[3])
min_y = min(gt_box[1],b_box[1])
height = height0 + height1 - (max_y - min_y)
interArea = width * height
boxAArea = width0 * height0
boxBArea = width1 * height1
iou = interArea / (boxAArea + boxBArea - interArea)
return iou
reference:
https://blog.csdn.net/weixin_42631693/article/details/90747516