日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

目标检测基本概念理解之IoU(交并比)以及Python代码实现

發布時間:2024/10/8 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 目标检测基本概念理解之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=ABAB?

我們將用這個概念來描述兩個框之間的重合度。兩個框可以看成是兩個像素的集合,它們的交并比等于兩個框重合部分的面積除以它們合并起來的面積。下圖“交集”中青色區域是兩個框的重合面積,圖“并集”中藍色區域是兩個框的相并面積。用這兩個面積相除即可得到它們之間的交并比,如圖所示。

假設兩個矩形框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代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。