交聯比 是什麼?

IoU (Intersection over Union):交聯比 的完整解釋

衡量兩個邊界框或區域重疊程度的指標,值域 0 到 1,常用於物件偵測與影像分割的評估。

IoU(Intersection over Union,交聯比,又稱 Jaccard Index 或 Jaccard Similarity)是電腦視覺領域中最基礎、最重要的評估指標之一,幾乎所有物件偵測(Object Detection)和影像分割(Image Segmentation)的評估體系都建立在 IoU 之上。

定義與計算

給定兩個區域 A 和 B(通常是預測邊界框與真實標注框):

IoU = |A ∩ B| / |A ∪ B| = 交集面積 / 聯集面積

由於交集是聯集的子集,IoU 的值域為 [0, 1]:

  • IoU = 0:兩個區域完全不重疊。
  • IoU = 1:兩個區域完全重合。
  • 一般而言,IoU ≥ 0.5 常被作為「預測正確」的基本門檻。

在物件偵測中的應用

  1. 判斷預測框是否正確(TP vs. FP)

在物件偵測中,模型輸出的每個預測框(Predicted Bounding Box)需要與真實標注框(Ground Truth Box)比對,以決定它是否算一個正確的偵測(True Positive)。比對的標準就是 IoU 閾值:

  • IoU ≥ 閾值(如 0.5):判定為 True Positive(成功偵測到目標)。
  • IoU < 閾值:判定為 False Positive(誤報)。
  • 漏偵測的真實框:判定為 False Negative(漏報)。
  1. 非最大值抑制(Non-Maximum Suppression, NMS)

物件偵測模型通常對同一個目標生成多個重疊的預測框,NMS 的作用是去除重複框、只保留最佳框。流程如下:

  1. 按信心分數(Confidence Score)排序所有預測框。

  2. 選取信心分數最高的框保留。

  3. 計算它與其他框的 IoU,移除 IoU 超過 NMS 閾值(通常 0.45–0.5)的框。

  4. 對剩餘框重複步驟 2-3。

  5. mAP(mean Average Precision)

mAP 是物件偵測任務的標準評估指標,COCO 資料集採用在 IoU 從 0.5 到 0.95(步長 0.05)的 10 個閾值下計算 AP 後取平均(AP@[0.5:0.95]),而 Pascal VOC 傳統上使用單一 IoU 閾值 0.5(mAP@0.5)。

  1. 影像分割

在語意分割(Semantic Segmentation)中,IoU 針對每個類別計算預測分割遮罩與真實遮罩的交聯比,所有類別的平均 IoU 稱為 mIoU(mean IoU),是語意分割最主要的評估指標。

IoU 的改良版本

標準 IoU 存在一些限制(如兩框完全不重疊時 IoU=0,但梯度也為 0,無法指導訓練),研究者提出了多種改良版用於損失函數:

  • GIoU(Generalized IoU):加入最小閉包框(最小包圍兩框的矩形)作為懲罰項,即使兩框不重疊也能提供梯度信號。
  • DIoU(Distance IoU):額外懲罰預測框與真實框中心點的距離,加速收斂。
  • CIoU(Complete IoU):在 DIoU 基礎上進一步加入寬高比的一致性懲罰,全面優化位置、大小和形狀。
  • EIoU(Efficient IoU):分別懲罰寬度差和高度差(而非寬高比),梯度訊號更穩定。

現代物件偵測模型(如 YOLOv8、YOLOv9)普遍使用 CIoU 或 EIoU 作為邊界框回歸的損失函數,取代傳統的 MSE 或 Smooth L1 損失。

程式碼示例(Python)

計算兩個邊界框([x1, y1, x2, y2] 格式)的 IoU:

def compute_iou(box1, box2):
    inter_x1 = max(box1[0], box2[0])
    inter_y1 = max(box1[1], box2[1])
    inter_x2 = min(box1[2], box2[2])
    inter_y2 = min(box1[3], box2[3])
    
    inter_area = max(0, inter_x2 - inter_x1) * max(0, inter_y2 - inter_y1)
    area1 = (box1[2] - box1[0]) * (box1[3] - box1[1])
    area2 = (box2[2] - box2[0]) * (box2[3] - box2[1])
    union_area = area1 + area2 - inter_area
    
    return inter_area / union_area if union_area > 0 else 0

常見問題