目标检测基本概念理解之IoU(交并比)以及Python代码实现
目標檢測基本概念理解之IoU(交并比)
- 交并比理解
- Python代碼實現
- 計算IoU,矩形框的坐標形式為xyxy
- 計算IoU,矩形框的坐標形式為xywh
交并比理解
在檢測任務中,使用交并比(Intersection of Union,IoU)作為衡量指標。這一概念來源于數學中的集合,用來描述兩個集合A和B之間的關系,它等于兩個集合的交集里面所包含的元素個數,除以它們的并集里面所包含的元素個數,具體計算公式如下:IoU=A∩BA∪BIoU={{A\cap B}\over{A\cup B}}IoU=A∪BA∩B?
我們將用這個概念來描述兩個框之間的重合度。兩個框可以看成是兩個像素的集合,它們的交并比等于兩個框重合部分的面積除以它們合并起來的面積。下圖“交集”中青色區域是兩個框的重合面積,圖“并集”中藍色區域是兩個框的相并面積。用這兩個面積相除即可得到它們之間的交并比,如圖所示。
假設兩個矩形框A和B的位置分別為:
A:[xa1,ya1,xa2,ya2]A:[x_{a1},y_{a1},x_{a2},y_{a2}]A:[xa1?,ya1?,xa2?,ya2?]
A:[xb1,yb1,xb2,yb2]A:[x_{b1},y_{b1},x_{b2},y_{b2}]A:[xb1?,yb1?,xb2?,yb2?]
假如位置關系如 圖 所示:
如果二者有相交部分,則相交部分左上角坐標為:
x1=max(xa1,xb1),y1=max(ya1,yb1)x_1=max(x_{a1},x_{b1}),y1=max(y_{a1},y_{b1})x1?=max(xa1?,xb1?),y1=max(ya1?,yb1?)
相交部分右下角坐標為:
x2=min(xa2,xb2),y2=min(ya2,yb2)x_2=min(x_{a2},x_{b2}),y2=min(y_{a2},y_{b2})x2?=min(xa2?,xb2?),y2=min(ya2?,yb2?)
計算先交部分面積:
intersetion=max(x2?x1+1.0)?(y2?y1+1.0)intersetion=max(x_2-x_1+1.0)*(y_2-y_1+1.0)intersetion=max(x2??x1?+1.0)?(y2??y1?+1.0)
矩形框A和B的面積分別是:
SA=(xa2?xa1+1.0)?(ya2?ya1+1.0)S_A=(x_{a2}-x_{a1}+1.0)*(y_{a2}-y_{a1}+1.0)SA?=(xa2??xa1?+1.0)?(ya2??ya1?+1.0)
SB=(xb2?xb1+1.0)?(yb2?yb1+1.0)S_B=(x_{b2}-x_{b1}+1.0)*(y_{b2}-y_{b1}+1.0)SB?=(xb2??xb1?+1.0)?(yb2??yb1?+1.0)
計算相并部分面積:
union=SA+SB?intersetionunion=S_A+S_B-intersetionunion=SA?+SB??intersetion
計算交并比:
IoU=intersetionunionIoU={{intersetion}\over{union}}IoU=unionintersetion?
為了直觀的展示交并比的大小跟重合程度之間的關系,示意了不同交并比下兩個框之間的相對位置關系,從 IoU = 0.95 到 IoU = 0.
Python代碼實現
計算IoU,矩形框的坐標形式為xyxy
# 計算IoU,矩形框的坐標形式為xyxy # (x1,y1)是矩形框左上角的坐標,(x2,y2)是矩形框右下角的坐標 def box_iou_xyxy(box1, box2):# 獲取box1左上角和右下角的坐標x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]# 計算box1的面積s1 = (y1max - y1min + 1.) * (x1max - x1min + 1.)# 獲取box2左上角和右下角的坐標x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2], box2[3]# 計算box2的面積s2 = (y2max - y2min + 1.) * (x2max - x2min + 1.)# 計算相交矩形框的坐標xmin = np.maximum(x1min, x2min) # 左上角的橫坐標ymin = np.maximum(y1min, y2min) # 左上角的縱坐標xmax = np.minimum(x1max, x2max) # 右下角的橫坐標ymax = np.minimum(y1max, y2max) # 右下角的縱坐標# 計算相交矩形的高度、寬度、面積inter_h = np.maximum(ymax - ymin + 1., 0.)inter_w = np.maximum(xmax - xmin + 1., 0.)intersection = inter_h * inter_w# 計算相并面積union = s1 + s2 - intersection# 計算交并比iou = intersection / unionreturn ioubbox1 = [100., 100., 200., 200.] bbox2 = [120., 120., 220., 220.] iou = box_iou_xyxy(bbox1, bbox2) print('IoU is {}'.format(iou))IoU is 0.47402644317607107
計算IoU,矩形框的坐標形式為xywh
# 計算IoU,矩形框的坐標形式為xywh # (x,y)(x, y)(x,y)是矩形框中心點的坐標,www是矩形框的寬度,hhh是矩形框的高度。 def box_iou_xywh(box1, box2):# 獲取box1左上角的坐標x1min, y1min = box1[0] - box1[2] / 2.0, box1[1] - box1[3] / 2.0# 獲取box1右下角的坐標x1max, y1max = box1[0] + box1[2] / 2.0, box1[1] + box1[3] / 2.0# 獲取box1的面積s1 = box1[2] * box1[3]# 獲取box2左上角的坐標x2min, y2min = box2[0] - box2[2] / 2.0, box2[0] - box2[2] / 2.0# 獲取box2右下角的坐標x2max, y2max = box2[0] + box2[2] / 2.0, box2[0] + box2[2] / 2.0# 獲取box2的面積s2 = box2[2] * box2[3]# 計算相交矩形框的坐標xmin = np.maximum(x1min, x2min) # 左上角的橫坐標ymin = np.maximum(y1min, y2min) # 左上角的縱坐標xmax = np.minimum(x1max, x2max) # 右下角的橫坐標ymax = np.minimum(y1max, y2max) # 右下角的縱坐標inter_h = np.maximum(ymax - ymin, 0.)inter_w = np.maximum(xmax - xmin, 0.)intersection = inter_h * inter_wunion = s1 + s2 - intersectioniou = intersection / unionreturn ioubbox1 = [100., 100., 200., 200.] bbox2 = [120., 120., 220., 220.] iou = box_iou_xywh(bbox1, bbox2) print('IoU is {}'.format(iou))IoU is 0.6902485659655831
總結
以上是生活随笔為你收集整理的目标检测基本概念理解之IoU(交并比)以及Python代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像分割综述:FCN、U-Net、PSP
- 下一篇: 图像语义分割:FCN全卷积网络概述