🔍 YOLOv1 技術詳解:正負樣本劃分與置信度設計
一、前言
YOLOv1 是目標檢測領域中具有劃時代意義的算法之一,它將檢測任務統一為一個回歸問題,實現了“You Only Look Once”的端到端實時檢測。其中,正負樣本的劃分機制 和 置信度(confidence)的設計 是理解其訓練流程的關鍵。
本文將從以下兩個方面深入解析:
- YOLOv1 中的正負樣本是如何劃分的?
- 置信度(confidence)到底是什么?它的計算方式和作用是什么?
二、YOLOv1 的輸出結構回顧
在進入正題之前,先簡單回顧一下 YOLOv1 的輸出結構:
? 輸出張量維度:
S × S × (B×5 + C)
其中:
S
:網格數量(通常為 7)B
:每個網格預測的邊界框數量(通常為 2)5
:每個 bounding box 包含的信息:x, y, w, h, confidence
C
:類別數量(如 PASCAL VOC 為 20)
三、正樣本與負樣本的劃分機制
在訓練過程中,YOLOv1 并不是對所有預測框都進行監督學習,而是根據真實框的位置來選擇哪些預測框是負責預測該物體的。
🧠 核心思想:
- 每個真實框(ground truth)只會被分配給一個 grid cell;
- 這個 grid cell 內的多個 bounding box 中,IoU 最高的那個預測框作為正樣本;
- 其他不負責預測真實框的預測框可能被視為負樣本或忽略項。
📌 劃分步驟詳解:
-
確定真實框中心所在的 grid cell
- 圖像被劃分為 S × S 的網格;
- 真實框的中心點落在哪個格子,就由該格子負責預測;
-
在該 grid cell 的 B 個預測框中找出 IoU 最高的那個
- 計算每個預測框與真實框的 IoU;
- 只有這個 IoU 最高的預測框會被標記為“正樣本”,參與位置損失和置信度損失的計算;
-
其他預測框如何處理?
- 如果某個預測框與任意真實框的 IoU 超過閾值(如 0.5),也可能會被標記為正樣本;
- 否則,僅用于置信度損失計算(即認為“不含物體”);
-
負樣本定義
- 所有未被選中的預測框,若其預測的邊界框與所有真實框的 IoU 都小于設定閾值,則視為“負樣本”;
- 僅參與置信度損失的計算,不參與位置損失;
四、置信度(Confidence)詳解
置信度是 YOLOv1 中非常重要的一個概念,它不僅表示預測框是否包含物體,還結合了預測框與真實框之間的重疊程度(IoU)。
🧮 置信度的定義:
confidence = P ( object ) × IoU pred,truth \text{confidence} = P(\text{object}) \times \text{IoU}_{\text{pred,truth}} confidence=P(object)×IoUpred,truth?
其中:
- P ( object ) P(\text{object}) P(object):當前預測框是否包含物體(0 或 1);
- IoU pred,truth \text{IoU}_{\text{pred,truth}} IoUpred,truth?:預測框與真實框的交并比;
🎯 置信度的作用:
場景 | 置信度含義 |
---|---|
正樣本 | 表示預測框準確地定位到了物體,并且 IoU 較高 |
負樣本 | 應該趨近于 0,表示“這里沒有物體” |
誤檢區域 | 置信度應低,避免誤報 |
?? 損失函數中置信度的作用:
在損失函數中,置信度部分的損失分為兩部分:
- 正樣本:希望置信度接近 IoU 值;
- 負樣本:希望置信度趨近于 0;
公式如下:
L confidence = ∑ i = 0 S 2 ∑ j = 0 B [ 1 i j obj ? ( conf i j ? conf ^ i j ) 2 + λ noobj ? ( 1 ? 1 i j obj ) ? ( conf i j ) 2 ] \mathcal{L}_{\text{confidence}} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} \left[ \mathbb{1}_{ij}^{\text{obj}} \cdot \left(\text{conf}_i^j - \hat{\text{conf}}_i^j \right)^2 + \lambda_{\text{noobj}} \cdot \left(1 - \mathbb{1}_{ij}^{\text{obj}} \right) \cdot \left(\text{conf}_i^j \right)^2 \right] Lconfidence?=i=0∑S2?j=0∑B?[1ijobj??(confij??conf^ij?)2+λnoobj??(1?1ijobj?)?(confij?)2]
其中 λ noobj \lambda_{\text{noobj}} λnoobj? 是一個較小的權重系數(一般設為 0.5),用于降低負樣本的影響。
五、正負樣本劃分的可視化說明(偽代碼示意)
for each ground_truth_box in ground_truth_boxes:# Step 1: 找到對應 grid cellgrid_x, grid_y = get_grid_cell(image_size, S, ground_truth_box.center)# Step 2: 在該 grid cell 的 B 個預測框中計算 IoUious = [iou(pred_box, ground_truth_box) for pred_box in predicted_boxes[grid_x][grid_y]]# Step 3: 選取 IoU 最大的預測框作為正樣本best_idx = np.argmax(ious)positive_boxes.append(predicted_boxes[grid_x][grid_y][best_idx])# Step 4: 其余預測框判斷是否也為正樣本(IoU > threshold)for j in range(B):if j != best_idx and ious[j] > iou_threshold:positive_boxes.append(predicted_boxes[grid_x][grid_y][j])else:negative_boxes.append(predicted_boxes[grid_x][grid_y][j])
六、總結
模塊 | 內容 |
---|---|
正樣本劃分 | 每個真實框只分配給一個 grid cell,該 cell 中 IoU 最高的預測框作為正樣本 |
負樣本劃分 | 不包含物體的預測框作為負樣本,僅參與置信度損失 |
置信度設計 | P ( object ) × IoU P(\text{object}) \times \text{IoU} P(object)×IoU,衡量預測框的準確性和置信程度 |
置信度作用 | 控制模型是否相信某個預測框含有物體,影響最終檢測結果 |
七、結語
YOLOv1 通過統一建模的方式,首次實現了端到端的目標檢測流程。其中,正負樣本的劃分機制 和 置信度的設計 是其訓練穩定性和檢測精度的重要保障。
雖然后續版本(如 YOLOv2、YOLOv3、YOLOX)對此進行了優化,但理解 YOLOv1 的這些核心機制,有助于我們更好地掌握現代目標檢測框架的發展脈絡。
📌 歡迎點贊 + 收藏 + 關注我,我會持續更新更多關于計算機視覺、目標檢測、深度學習、YOLO系列等內容!
🎯 下期預告:
《YOLOv2 技術詳解:引入 Anchor Boxes 與多尺度預測》
敬請期待!🚀