YOLO Backbone 的演進
YOLO 的 backbone 演進,並不是單純「越做越深」,而是一條讓深度可訓練、梯度可流動、計算可控的設計路線。
Classification → Detection Backbones
早期 YOLO 並沒有為 detection 設計專用 backbone,而是直接沿用分類模型。
- YOLOv1–v2
- 使用類分類 CNN(YOLOv1 自建 CNN、YOLOv2 的 Darknet-19)
- 優點是結構簡單、速度快
- 但特徵表達能力有限,難以同時支撐多尺度與精細定位
- 關鍵問題
- 分類 backbone 追求語意抽象
- Detection 需要同時保留 空間細節 + 語意層級
- 這個衝突在小物體與密集場景中特別明顯
![]() | ![]() |
|---|---|
| YOLOv1 Custom CNN | YOLOv2 Darknet-19 |
Residual Backbone:讓深度可用(YOLOv3)
YOLOv3 是第一個真正解決 backbone 深度問題的版本。
- Darknet-53
- 引入 residual connection
- 讓梯度可以穩定傳遞到深層
- 設計意義
- backbone 不再只是「跑得快」
- 而是開始能承載多尺度特徵學習
- 影響
- 為後續 multi-scale prediction、FPN / PAN 打下基礎
- YOLO 開始進入「可長期演化」的架構狀態

問題
但這一代的問題是:深度增加 ≠ 計算效率好。
CSP:不是加深,而是「切開」梯度流
CSP(Cross Stage Partial Network)的提出,不是為了做一個更深的 backbone,而是為了解決深度 CNN 中一個被忽略的問題:
大量重複的梯度資訊,正在浪費計算與學習能力
Residual / Dense 的效率瓶頸
即使是 ResNet 或 DenseNet 這類「梯度友善」的架構,仍存在結構性問題:
- 在 residual / dense 架構中:
- 每一層都會接收到來自所有前層的梯度
- 梯度路徑雖然變短,但資訊高度相關
- 結果是:
- 不同層學到高度重複的梯度資訊
- 造成:
- 不必要的計算
- 記憶體流量(memory traffic)增加
- 訓練與推論效率下降
問題
Residual 解決了「梯度消失」,但沒有解決「梯度重複」。
CSP 的核心假設
CSPNet 明確提出一個假設:
CNN 的效能瓶頸,不只是深度或寬度, 而是「不同層是否真的學到不同的資訊」。
因此 CSP 的目標不是增加 capacity,而是:
- 最大化梯度組合的多樣性(gradient combination diversity)
- 最小化重複梯度造成的無效學習

CSP 的核心做法
不讓所有 feature 都參與所有層的梯度回傳,而是刻意截斷一部分梯度流。
具體作法是:
- 在一個 stage 開始時:
- 將輸入 feature map 沿 channel 切成兩部分
- 兩條路徑:
- Path A:直接 bypass(不進入深層 block)
- Path B:進入完整的 residual / dense block
- 在 stage 結尾:
- 先對 Path B 做 transition(如 conv / pooling)
- 再與 Path A concat
- 刻意選擇「fusion last」策略以截斷梯度重用
![]() | ![]() |
|---|---|
| DenseNet | Cross Stage Partial DenseNet |
為什麼一定要「fusion last」?
相關論文做了非常關鍵的 ablation:
- Fusion first(先 concat 再 transition)
- 梯度仍然高度重複
- 計算下降,但 accuracy 明顯掉
- Fusion last(先 transition 再 concat)
- 梯度流被有效截斷
- 計算量下降 20%
- Top-1 accuracy 幾乎不變(僅 ~0.1%)
![]() | ![]() |
|---|---|
| Fusion Fisrt 和 Fusion Last 的模型架構 | Fusion Last 明顯比 Fusion First 好 |
證實
這證實 CSP 的關鍵不是結構形式,而是 「避免不同路徑學到相同梯度訊號」。
CSP 解決的三個實際問題
CSPNet 它同時解決三個工程層面的問題:
- 強化 learning capability
- 在計算更少的情況下,模型反而學得更好
- 特別對 lightweight backbone 效果顯著
- 降低 computational bottleneck
- 計算不再集中在少數層
- 提升硬體 utilization(GPU / CPU / ASIC)
- 降低 memory traffic
- 減少 feature map 的重複讀寫
- 對 edge / embedded 裝置特別重要
在 YOLO 中使用它
- YOLOv4:CSPDarknet-53
- 明顯降低 FLOPs
- 改善梯度流動穩定性
- YOLOv5:CSP-based Backbone
- CSP 成為「工程上可維護」的核心骨幹
- 讓模型 scaling(s / m / l / x)變得可控
![]() | ![]() |
|---|---|
| YOLOv4:CSPDarknet-53 | YOLOv5:CSP-based Backbone |
CSP1_X(用在 Backbone)
- 核心設計目的
- 解決 深層網路中梯度重複、學習冗餘 的問題
- 讓 backbone 可以變深,但不讓計算與梯度爆炸
- 結構特徵
- 將輸入 feature 切成兩條路徑
- 主幹路徑:經過多個 Residual / Bottleneck block
- 捷徑路徑:幾乎不做計算,直接保留原始特徵
- 在 stage 結尾進行 Concat + Conv 融合
- 將輸入 feature 切成兩條路徑

CSP2_X(用在 Neck)
- 核心設計目的
- 降低 Neck 階段的計算量與延遲
- 在特徵已經足夠語意化的前提下,避免過度複雜化
- 結構特徵
- 同樣採用雙分支結構,但:
- 不使用 Residual block
- 改為 連續的 CBS / CBL 卷積
- 整體結構更淺,計算成本更可控
- 同樣採用雙分支結構,但:
- 為什麼不用 Residual
- Neck 的特徵已是融合後的高階語意
- 不再需要深層表示學習,Residual 的收益有限

CSP 家族的工程化演進
C3(YOLOv5:經典 CSP Bottleneck)
- YOLOv5 裡的
C3,本質上就是一種 CSP Bottleneck 的實作(常被視為 BottleneckCSP 的變體) - 核心目的
- 把 CSP「分流+拼接」落到工程可用的 backbone/neck block 上:
- 一部分特徵走較深的 bottleneck 堆疊
- 一部分走較淺/捷徑路徑,最後 concat 融合
- 把 CSP「分流+拼接」落到工程可用的 backbone/neck block 上:
- 直觀 特徵
- 結構偏「經典 CSP」:split →(n 個 bottleneck)→ concat → fuse conv
- 設計重點在「省計算 + 保梯度」,但模組組合/巢狀程度在後期會顯得較厚重(尤其你要做多任務或更換 head 時)

C2f(YOLOv8:更順暢梯度的輕量 CSP)
- Ultralytics 官方把
C2f定義成 “Faster Implementation of CSP Bottleneck with 2 convolutions” - 核心目的
- 保留 CSP 的「分流精神」,透過中間特徵累積提升特徵重用,使資訊與梯度傳遞更直接且高效
- 與 C3 的關鍵差異
- C3:bottleneck 為封閉堆疊,只輸出最後結果
- C2f:所有中間層特徵一起 concat,使資訊與梯度流更順暢
- 設計特點
- 使用較小的 hidden channels,透過特徵累積提升表達能力,在不增加深度與計算量下提高效率








