Gaussian Bounding Box 和 ProbIoU

GBB (Gaussian Bounding Box)

GBB,全稱高斯邊界框 (Gaussian Bounding Box),是一種用二維高斯分布來表示邊界框的方法。傳統(tǒng)的邊界框(無論是水平的 HBB 還是旋轉(zhuǎn)的 OBB)通常用幾個離散的參數(shù)來定義(例如中心點、寬高、角度)。而 GBB 則將邊界框看作是一個概率分布,具體來說,是一個二維高斯(正態(tài))分布。

二維高斯分布參數(shù)定義

均值向量 (Mean Vector) \boldsymbol{\mu}
一個二維向量 (\mu_x, \mu_y),表示高斯分布的中心,通常對應(yīng)于目標(biāo)對象的中心點 (c_x, c_y)。數(shù)學(xué)形式為:
\boldsymbol{\mu} = \begin{bmatrix} \mu_x \\ \mu_y \end{bmatrix}

協(xié)方差矩陣 (Covariance Matrix) \boldsymbol{\Sigma}
一個 2 \times 2 的對稱半正定矩陣,描述數(shù)據(jù)點圍繞均值的分布形狀和方向。其形式為:
\boldsymbol{\Sigma} = \begin{bmatrix} \sigma_x^2 & \sigma_{xy} \\ \sigma_{yx} & \sigma_y^2 \end{bmatrix}
其中:

  • 對角線元素 \sigma_x^2, \sigma_y^2:分別表示 xy 方向上的方差。
  • 非對角線元素 \sigma_{xy}(等于 \sigma_{yx}):表示 xy 之間的協(xié)方差,反映分布的傾斜程度或方向。

公式說明

  1. 均值向量
    \boldsymbol{\mu} = \begin{bmatrix} \mu_x \\ \mu_y \end{bmatrix}

  2. 協(xié)方差矩陣
    \boldsymbol{\Sigma} = \begin{bmatrix} \sigma_x^2 & \sigma_{xy} \\ \sigma_{yx} & \sigma_y^2 \end{bmatrix}

OBB轉(zhuǎn)換為GBB

OBB 到 GBB 的轉(zhuǎn)換過程

OBB 參數(shù)定義

有向包圍盒(Oriented Bounding Box, OBB)由以下參數(shù)描述:

  • 中心點(c_x, c_y)
  • 半長軸長度a(沿主方向)
  • 半寬軸長度b(沿次方向)
  • 旋轉(zhuǎn)角度\theta(主方向相對于 x 軸的逆時針角度)

GBB 參數(shù)定義

目標(biāo)高斯分布參數(shù)(Gaussian Bounding Box, GBB)包括:

  • 均值向量 \boldsymbol{\mu} = \begin{bmatrix} c_x \\ c_y \end{bmatrix}
  • 協(xié)方差矩陣 \boldsymbol{\Sigma}(需從 OBB 推導(dǎo))

轉(zhuǎn)換步驟

  1. 均值向量確定
    直接繼承 OBB 的中心點:
    \boldsymbol{\mu} = \begin{bmatrix} c_x \\ c_y \end{bmatrix}

  2. 協(xié)方差矩陣推導(dǎo)
    協(xié)方差矩陣 \boldsymbol{\Sigma} 的幾何意義與橢圓分布的主軸方向一致,推導(dǎo)步驟如下:

    • 步驟 1:構(gòu)造縮放矩陣
      將 OBB 的半長軸 a 和半寬軸 b 轉(zhuǎn)換為橢圓的軸長標(biāo)準差 \sigma_x, \sigma_y
      \sigma_x = \frac{a}{\sqrt{12}}, \quad \sigma_y = \frac{\sqrt{12}}
      (注:假設(shè) OBB 覆蓋 12σ 范圍)

      縮放矩陣為:
      \mathbf{S} = \begin{bmatrix} \sigma_x^2 & 0 \\ 0 & \sigma_y^2 \end{bmatrix}

    • 步驟 2:構(gòu)造旋轉(zhuǎn)矩陣
      根據(jù) OBB 的旋轉(zhuǎn)角度 \theta,定義旋轉(zhuǎn)矩陣 \mathbf{R}(\theta)
      \mathbf{R}(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}

    • 步驟 3:計算協(xié)方差矩陣
      協(xié)方差矩陣 \boldsymbol{\Sigma} 是旋轉(zhuǎn)和縮放的組合:
      \boldsymbol{\Sigma} = \mathbf{R}(\theta) \cdot \mathbf{S} \cdot \mathbf{R}(\theta)^\top

      展開計算:
      \boldsymbol{\Sigma} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} \sigma_x^2 & 0 \\ 0 & \sigma_y^2 \end{bmatrix} \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}

    • 步驟 4:簡化結(jié)果
      最終協(xié)方差矩陣的顯式形式為:
      \boldsymbol{\Sigma} = \begin{bmatrix} \sigma_x^2 \cos^2\theta + \sigma_y^2 \sin^2\theta & (\sigma_x^2 - \sigma_y^2) \sin\theta \cos\theta \\ (\sigma_x^2 - \sigma_y^2) \sin\theta \cos\theta & \sigma_x^2 \sin^2\theta + \sigma_y^2 \cos^2\theta \end{bmatrix}


公式總結(jié)

  1. 均值向量
    \boldsymbol{\mu} = \begin{bmatrix} c_x \\ c_y \end{bmatrix}

  2. 協(xié)方差矩陣
    \boldsymbol{\Sigma} = \begin{bmatrix} \frac{a^2}{12} \cos^2\theta + \frac{b^2}{12} \sin^2\theta & \left(\frac{a^2}{12} - \frac{b^2}{12}\right) \sin\theta \cos\theta \\ \left(\frac{a^2}{12} - \frac{b^2}{12}\right) \sin\theta \cos\theta & \frac{a^2}{12} \sin^2\theta + \frac{b^2}{12} \cos^2\theta \end{bmatrix}


注意事項

  • 方向定義:旋轉(zhuǎn)角度 \theta 是 OBB 主軸相對于 x 軸的逆時針角度。
  • 3σ 假設(shè):假設(shè) OBB 的邊長遠大于高斯分布的 3σ 范圍,實際應(yīng)用中可根據(jù)需求調(diào)整系數(shù)。
  • 對稱性驗證:最終協(xié)方差矩陣 \boldsymbol{\Sigma} 必須是對稱且半正定的。

ProbIoU

ProbIoU 是一種用于衡量兩個概率性邊界框(通常是高斯邊界框 GBB)之間相似度或重疊程度的指標(biāo)或損失函數(shù)。它與傳統(tǒng)的 IoU (Intersection over Union) / GIoU / DIoU / CIoU 以及旋轉(zhuǎn)框的 RIoU (Rotated IoU) 不同,因為它不是直接計算幾何形狀的交集和并集面積比,而是基于概率分布的度量。

為計算不同 GBB 間的相似度,本文首先采用了 Bhattacharyya Coefficient( B_C )。兩個概率密度函數(shù) p(x)q(x) 間的 B_C 按下列公式進行計算:

BC(p, q) = \int_{\mathbb{R}^2} \sqrt{p(x)q(x)} \, dx

其中 B_C(p, q) \in [0, 1],當(dāng)且僅當(dāng)兩個分布相同時,B_C(p, q) = 1。

基于上述 B_C(p, q),可以得到不同分布間的巴氏距離 (Bhattacharyya Distance, B_D)。兩個概率密度函數(shù) p(x)q(x) 間的 B_D 按下列公式進行計算:

B_D(p, q) = -\ln B_C(p, q)

當(dāng) p \sim \mathcal{N}(\mu_1, \Sigma_1),q \sim \mathcal{N}(\mu_2, \Sigma_2) 且目標(biāo)檢測中實際問題為 2 維向量及矩陣時,巴氏距離 B_D 可通過如下公式進行計算:

B_D = B_1 + B_2

B_1 = \frac{1}{4} \cdot \frac{(a_1 + a_2)(y_1 - y_2)^2 + (b_1 + b_2)(x_1 - x_2)^2 + 2(c_1 + c_2)(x_2 - x_1)(y_1 - y_2)}{(a_1 + a_2)(b_1 + b_2) - (c_1 + c_2)^2}

B_2 = \frac{1}{2} \ln \left( \frac{(a_1 + a_2)(b_1 + b_2) - (c_1 + c_2)^2}{4\sqrt{(a_1b_1 - c_1^2)(a_2b_2 - c_2^2)}} \right)

參數(shù)定義:

\mu_1 = \begin{pmatrix} x_1 \\ y_1 \end{pmatrix}, \quad \Sigma_1 = \begin{bmatrix} a_1 & c_1 \\ c_1 & b_1 \end{bmatrix}, \quad \mu_2 = \begin{pmatrix} x_2 \\ y_2 \end{pmatrix}, \quad \Sigma_2 = \begin{bmatrix} a_2 & c_2 \\ c_2 & b_2 \end{bmatrix}

由于 Bhattacharyya Distance 不滿足三角不等式,因此它并不是嚴格定義的距離度量。為表示真實距離,本文采用 Hellinger Distance (HD),其公式如下:

H_D(p, q) = \sqrt{1 - B_C(p, q)}

其中 H_D(p, q) \in [0, 1],當(dāng)且僅當(dāng)兩個分布相同時,H_D(p, q) = 0。


Probabilistic IoU (ProbIoU)

基于上述 Hellinger Distance,本文提出高斯分布相似性計算方法 ProbIoU,其具體計算公式如下:

\text{ProbIoU} = 1 - H_D(p, q)

特性說明:

  1. \text{ProbIoU} \in [0, 1],值越大表示分布相似性越高
  2. 當(dāng)兩分布完全相同時,\text{ProbIoU} = 1
  3. 公式通過非線性映射將巴氏系數(shù)轉(zhuǎn)換為更直觀的相似性度量

計算OBB的ProbIoU

  • python計算OBB的ProbIoU
def probiou(obb1, obb2, eps=1e-7):
    # Calculate the prob iou between oriented bounding boxes, https://arxiv.org/pdf/2106.06072v1.pdf.
    def covariance_matrix(obb):
        # Extract elements
        w, h, r = obb[2:5]
        a = (w ** 2) / 12
        b = (h ** 2) / 12

        cos_r = torch.cos(torch.tensor(r))
        sin_r = torch.sin(torch.tensor(r))
        
        # Calculate covariance matrix elements
        a_val = a * cos_r ** 2 + b * sin_r ** 2
        b_val = a * sin_r ** 2 + b * cos_r ** 2
        c_val = (a - b) * sin_r * cos_r

        return a_val, b_val, c_val

    a1, b1, c1 = covariance_matrix(obb1)
    a2, b2, c2 = covariance_matrix(obb2)

    x1, y1 = obb1[:2]
    x2, y2 = obb2[:2]

    t1 = ((a1 + a2) * ((y1 - y2) ** 2) + (b1 + b2) * ((x1 - x2) ** 2)) / ((a1 + a2) * (b1 + b2) - (c1 + c2) ** 2 + eps)
    t2 = ((c1 + c2) * (x2 - x1) * (y1 - y2)) / ((a1 + a2) * (b1 + b2) - (c1 + c2) ** 2 + eps)
    t3 = torch.log(((a1 + a2) * (b1 + b2) - (c1 + c2) ** 2) / (4 * torch.sqrt(a1 * b1 - c1 ** 2) * torch.sqrt(a2 * b2 - c2 ** 2) + eps) + eps)

    bd = 0.25 * t1 + 0.5 * t2 + 0.5 * t3
    hd = torch.sqrt(1.0 - torch.exp(-torch.clamp(bd, eps, 100.0)) + eps)
    return 1 - hd
  • cuda計算OBB的ProbIoU
static __device__ void convariance_matrix(float w, float h, float r, float& a, float& b, float& c){
    float a_val = w * w / 12.0f;
    float b_val = h * h / 12.0f;
    float cos_r = cosf(r); 
    float sin_r = sinf(r);

    a = a_val * cos_r * cos_r + b_val * sin_r * sin_r;
    b = a_val * sin_r * sin_r + b_val * cos_r * cos_r;
    c = (a_val - b_val) * sin_r * cos_r;
}

static __device__ float box_probiou(
    float cx1, float cy1, float w1, float h1, float r1,
    float cx2, float cy2, float w2, float h2, float r2,
    float eps = 1e-7
){

    // Calculate the prob iou between oriented bounding boxes, https://arxiv.org/pdf/2106.06072v1.pdf.
    float a1, b1, c1, a2, b2, c2;
    convariance_matrix(w1, h1, r1, a1, b1, c1);
    convariance_matrix(w2, h2, r2, a2, b2, c2);

    float t1 = ((a1 + a2) * powf(cy1 - cy2, 2) + (b1 + b2) * powf(cx1 - cx2, 2)) / ((a1 + a2) * (b1 + b2) - powf(c1 + c2, 2) + eps);
    float t2 = ((c1 + c2) * (cx2 - cx1) * (cy1 - cy2)) / ((a1 + a2) * (b1 + b2) - powf(c1 + c2, 2) + eps);
    float t3 = logf(((a1 + a2) * (b1 + b2) - powf(c1 + c2, 2)) / (4 * sqrtf(fmaxf(a1 * b1 - c1 * c1, 0.0f)) * sqrtf(fmaxf(a2 * b2 - c2 * c2, 0.0f)) + eps) + eps); 
    float bc = 0.25f * t1 + 0.5f * t2 + 0.5f * t3;
    bc = fmaxf(fminf(bd, 100.0f), eps);
    float hd = sqrtf(1.0f - expf(-bc) + eps);
    return 1 - hd;    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容