跳至主要内容

[22.07] YOLOv7

Z. Yuan
Dosaid maintainer, Full-Stack AI Engineer

配角的逆襲

YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors


YOLOv7 這篇論文的作者團隊來自臺灣中研院。

等等,為什麼 v7 會比 v6 還要早兩個月發布?這是因為全世界有很多團隊都想要成為原初 YOLO 的正統繼承者,歡迎來到群星薈萃的 YOLO 宇宙!

定義問題

即時物件偵測這個領域,一直都在平衡四件事:速度、準確率、參數量、可部署性

這些平衡在不同場景裡會被重新排序:在自駕車裡,我們會在意延遲;在嵌入式裝置裡,我們則在意功耗;而在醫療影像裡,精度高於一切。

過去幾年,即時偵測器的設計大致走向兩條主路線:

第一條是追求「極限輕量化」:針對微處理器和邊緣 CPU 設計,像是 MCUNet、NanoDet;另一條則在「高效架構上壓榨效能」:例如 YOLOX、YOLOR,藉由 backbone 改造、Neck 優化、特徵融合設計等方式,提高推論速度與準確率。

這些方法的共同點是:

  • 它們幾乎都從推論架構下手,試圖用更快的路徑跑出更準的答案。

但 YOLOv7 選擇了一條逆向的路。

作者在這篇論文提出了一個相對少被關注的切入點:

如果我們不改模型架構,而是重新設計訓練流程,可好?

這個出發點促成了 YOLOv7 的核心理念:trainable bag-of-freebies

所謂 bag-of-freebies,指的是那些只會增加訓練成本、但不會增加推論成本的技術。

YOLOv7 的創新之處在於,將這些技巧升級為「可訓練」的組件,進一步提升模型性能,而不動到任何推論結構。

這樣的設計雖然聽起來簡潔,卻馬上引出兩個結構層級的棘手問題:

  1. 模組的重參數化該如何設計,才能同時利於訓練與推論?
  2. 當使用動態標籤分配技術時,如何處理多層輸出之間的分配對齊問題?

這兩個問題過去常被當成「訓練細節」略過,但在 YOLOv7 的路線裡,這些訓練過程中的非顯性瓶頸反而成為設計的主戰場

這一次,YOLOv7 把焦點從「推論表現」移到「訓練效能」。

思維順序在此刻已經悄然反轉。

解決問題

Extended-ELAN

Extended-ELAN

YOLOv7 引入的第一個設計關鍵,是名為 E-ELAN(Extended Efficient Layer Aggregation Networks) 的 backbone 架構。

它的前身是 YOLOX 使用的 ELAN 架構,而 E-ELAN 的核心設計理念是:

在不改變 gradient path 長度的前提下,提升參數利用率與特徵表達多樣性。

從上圖中可以清楚看出,E-ELAN 完全保留了原始 ELAN 的 gradient 傳遞路徑。

我們都知道,神經網路中有效的梯度路徑會直接影響訓練效率與收斂能力。

E-ELAN 在維持這條主幹不變的同時,做了幾個關鍵改造:

  • 擴張(expand):透過 group convolution 擴展 channel 與 cardinality。
  • 重組(shuffle):對 feature map 進行分組重排。
  • 合併(merge):將分組後的特徵進行融合,以促進跨群學習。

這些操作讓每個 block 學到的特徵更加多樣,同時也讓網路的記憶體與計算密度達到更高的效率,而不破壞原本 ELAN 架構的穩定性。

整體來說,E-ELAN 是一種針對 backbone 進行「計算密度與學習多樣性」雙優化的技術。

串接式架構的縮放

model scaling

第二個設計重點,是 針對串接式架構提出的複合縮放策略(Compound Model Scaling)

過去我們在 EfficientNet 中看到過 model scaling 的概念,也就是對網路的 寬度(width)、深度(depth)、解析度(resolution) 同時進行縮放。

但這種 scaling 方法大多針對的是像 ResNet、PlainNet 等「單一路徑」架構。

然而,YOLO 系列是典型的「多分支、層間串接」架構,當你單獨放大某個 block 的深度,會改變 transition layer 的輸入 channel;一旦前後 channel 不對稱,就會出現運算資源浪費、記憶體碎片化的問題。

提示

GPU/TPU 在做卷積時,是根據固定的輸入通道數與張量形狀排程。一旦我們讓某些 layer 通道數爆炸,但接下來的運算又沒有好好使用這些通道,會造成「冗餘計算」,與此同時還會讓某些核心模組運行效率下降。

現代深度學習系統(如 PyTorch、TensorRT)會試圖預先配置記憶體。若張量的尺寸變化頻繁(例如某些 block channel 變 128、某些變 256),會導致 memory allocator 產生不規則區塊,最終可能導致 GPU 記憶體無法有效打包利用,出現浪費或失敗。

因此,作者在此提出了解法:

縮放深度的同時,應連帶調整寬度,讓通道比例保持穩定。

這種策略避免了不對稱的 layer scaling 導致的資源浪費,也維持了模型在原始設計下的硬體友善特性。

具體做法是:

  1. 先進行 depth scaling,增加 block 中的堆疊層數;
  2. 根據擴張後的輸出通道變化,對應地對 transition layer 做寬度縮放;
  3. 維持整體通道配比不變,避免模型在硬體上出現非對齊記憶體分配或計算瓶頸。

這是一種「耦合式的縮放方法」,將不同層級的參數變化一起考慮,才能在保有高效計算的前提下擴大模型規模。

Trainable BoF

YOLOv7 所提出的 trainable bag-of-freebies,並不僅僅是使用現有技巧的堆疊,而是進一步讓訓練流程成為模型優化的主場。

我們仔細看一下三項關鍵創新。

  1. Planned Re-parameterized Convolution

    re-parameterized

    重參數化卷積(RepConv) 是一種訓練/推論分離的結構設計:

    • 在訓練階段,它包含三個分支:一個 3×3 卷積、一個 1×1 卷積、再加上一條 identity shortcut(直接傳遞輸入);
    • 在推論階段,這三個路徑會合併為單一路徑,達到零額外成本的效果。

    這個設計在一些平鋪結構(例如 VGG)上表現很好,能夠加速收斂、提升準確率。

    但作者發現:

    當你把原始 RepConv 用在 ResNet 或 DenseNet 這類已經有 shortcut 或 feature concatenation 的網路中,準確率會明顯下降。

    這是因為 ResNet 的設計已經內建一條 residual shortcut,再加上 RepConv 的 identity 分支,會導致梯度在多條 identity path 中重疊、產生干擾。

    如果是 DenseNet 的情況下,該架構的特性是將多層輸出透過 concatenation 串接起來,如果每層都額外插入 identity 分支,會破壞特徵多樣性的學習路徑,導致各分支間學不到不同的特徵。

    於是作者提出了解法:

    根據網路內部的結構特性(是否已有 residual/concat),決定是否使用不含 identity 分支的 RepConvN。

    這個做法被稱為 Planned Re-parameterized Convolution,目的是「依據模型結構,做有計畫的替換與配置」。舉例來說:

    • 如果在一個 PlainNet(沒有殘差的基礎網路)上使用 RepConv,那完整的 3×3、1×1、identity 三路結構是有幫助的;
    • 但如果是 ResNet 或 DenseNet,則應使用 RepConvN(只保留 3×3 + 1×1,移除 identity 分支),才能避免梯度傳遞混亂。

  1. Coarse-to-Fine 標籤設計

    Coarse-to-Fine

    在訓練多層偵測頭時,作者導入了一種創新的監督機制:

    • Coarse-to-Fine Label Assignment

    這個機制包含兩個重要角色:

    • Lead Head:主輸出頭,負責最終偵測任務;
    • Auxiliary Head:輔助輸出頭,協助淺層學習收斂。

    傳統的深度監督會對每一個 head 單獨進行標籤分配,但在這裡作者不這麼做,而是提出了一個嶄新觀點:

    讓 Lead Head 的預測結果反過來作為整體訓練的領導者。

    操作上分為兩種設計策略:

    • Lead Head Guided Label Assigner:以 Lead Head 預測結果 + ground truth 為基礎產生 soft label,套用於所有 head;
    • Coarse-to-Fine Label Assigner:產生兩種 soft label,分別為粗略(coarse)與精細(fine),用於 Auxiliary Head 與 Lead Head,提升前者的 recall、後者的 precision。

    這種策略背後的邏輯是:

    • Lead Head 學習力強,適合做為指標;
    • Auxiliary Head 學習力弱,需放寬正樣本條件以提升召回率;
    • 以 residual learning 的精神,讓 Lead Head 聚焦於尚未被學到的部分。

    為避免 coarse label 產生不良的先驗知識,作者在 decoder 中進一步加以限制,使其在訓練中逐步收斂,形成動態調節的監督機制。


  1. 其他可訓練 Freebies

    最後,作者也整合了數項過去被視為「訓練技巧」的作法,並提升為 可訓練的設計單元

    • BN 與卷積層融合:將 BatchNorm 的均值與方差併入卷積權重與 bias,以利推論階段的運算精簡。
    • YOLOR 式隱式知識注入:將隱式向量結合於卷積層,可於推論階段預先計算並簡化為固定向量權重。
    • EMA(Exponential Moving Average)模型:使用移動平均方式對訓練參數進行平滑,並以 EMA 模型作為最終推論模型,提升穩定性與泛化能力。

    這些技巧雖然不新,但在 YOLOv7 裡,它們的角色被重新定義為 模型訓練性能的加速器,而不再是僅供調參的黑盒工具。

實驗配置

YOLOv7 全部的實驗皆在 Microsoft COCO 2017 資料集上進行,並強調以下幾點:

  • 從頭訓練(train from scratch),不使用任何 ImageNet 預訓練權重;
  • 使用 train2017 做為訓練集,val2017 做為驗證與超參數調整,test2017 做為最終評估。

此外,為了對應不同應用場景,YOLOv7 系列模型分為以下幾類:

模型名稱設計目標縮放技術備註
v7-tiny邊緣裝置輕量化設計使用 LeakyReLU
v7一般 GPUNeck 擴張 + compound scaling使用 SiLU
v7-W6高效能 GPUcompound scaling + W6 設計
v7-E6/E6EE-ELAN 結構深化與通道擴張 + group shuffleE6E 為強化版本
v7-D6/X雲端模型--

所有縮放策略皆使用前面介紹的複合式模型縮放法,避免因通道不匹配導致運算資源浪費。

討論

與舊版 YOLO 的對比

compare

首先來看與過去 YOLO 系列與 YOLOR 相比的結果,如上表。

這裡可以看出,YOLOv7 在幾乎所有對比項目中都實現了「更小、更快、精度更高」的目標,尤其在小模型(tiny)與中階模型(W6)上表現亮眼。

與最新 SOTA 模型對比

compare

在速度與準確率權衡方面:

  • YOLOv7-tiny-SiLU vs YOLOv5-N (r6.1):多出 127 fps,準確率提升 10.7% AP
  • YOLOv7:在 161 fps 下達成 51.4% AP,而 PPYOLOE-L 達到同樣精度時,僅有 78 fps

如果和高階模型對比,結果如下:

  • YOLOv7-X vs YOLOv5-L (r6.1):推論速度快了 15 fps,準確率高出 3.9%
  • YOLOv7-X vs YOLOv5-X (r6.1):推論速度快 31 fps,參數減少 22%,計算量減少 8%,但 AP 還提升 2.2%

最後是巨量模型對比:

  • YOLOv7-E6 vs YOLOv5-X6 (r6.1):提升 0.9% AP參數 -45%、計算量 -63%、速度快 47%
  • YOLOv7-D6 vs YOLOR-E6:速度相當,AP 提升 0.8%
  • YOLOv7-E6E vs YOLOR-D6:速度相當,AP 提升 0.3%

從這些比較可歸納出幾項關鍵觀察:

  1. 從輕量到大型模型,YOLOv7 都能維持高效率表現
  2. 即便在不使用預訓練模型的前提下,YOLOv7 仍能擊敗大多數 SOTA 模型;
  3. 模型縮放策略與模組訓練設計(如 RepConvN、Coarse-to-Fine Label Assigner)直接轉化為實際效能提升。

YOLOv7 不只是訓練技巧的展示,而是一次全面考量實務部署需求的架構設計範本。

消融實驗:模型縮放

傳統的模型縮放常見三種做法:

  • 只放大寬度(width):增加每層的通道數;
  • 只放大深度(depth):增加層數或 block 數量;
  • 複合縮放(如 EfficientNet):同時調整 depth、width、resolution。

作者採用的是一種針對 concatenation-based 架構特化 的做法:

將 computational block 的深度擴張 1.5 倍,並同步將 transition block 的寬度擴張 1.25 倍。

這種設計背後的邏輯,是要保持幾個重要參數:

  • block 的輸出 feature map 結構穩定;
  • 各層之間的 channel 對齊;
  • 降低 memory fragmentation,提升硬體計算效率。

效果如下表:

ablation

從數據中可以看到:

  • 單獨放大寬度:雖然簡單,但效率最低,參數增多卻沒帶來明顯的精度提升;
  • 單獨放大深度:能帶來些微精度提升,但會導致 block 輸出不對齊,計算使用率下降;
  • 複合式縮放策略:能在「更少的參數與計算成本」下達成 最多的 AP 提升(+0.5%)

複合式模型縮放不只是 scale 的問題,而是一種針對特定網路架構(如 ELAN、YOLO-style)所設計的幾何穩定縮放法。

標籤指派策略

在以往的多頭偵測器中,Auxiliary Head 常常只是單純加上一個中層監督點,讓梯度更快穿透模型、加速收斂。

但 YOLOv7 的設計進一步提出:

為何不讓輔助頭的學習內容也由主輸出(Lead Head)來主導?

這正是 Assistant Loss for Auxiliary Head 的設計核心,透過 Lead Head 的預測,來建立更有語意層次感的監督結構。

  1. 實驗一:三種標籤指派策略策略比較

    label assign

    從實驗的結果可以看到:

    • 只要加上輔助損失(assistant loss)就能提升效能
    • 由 Lead Head 引導的 soft label(Lead-guided Assigner) 更勝傳統的監督方式;
    • 最好的結果來自 Coarse-to-Fine 引導策略,對 lead 給精細標籤,對 auxiliary 給較寬鬆、recall-oriented 的標籤,達成 supervision 的層次分工。

    作者進一步在下圖中展示不同策略下的 Objectness Map

    vis

    在傳統方法下,Auxiliary Head 常會學到不一致的特徵,但使用 Lead-guided soft label 後,輔助頭學到的特徵與主頭更一致,甚至有助於主頭學習剩餘資訊(residual information)。

    這種從中層往高層的引導式資訊傳遞,構成一種特殊的「殘差式學習架構」,提升整體網路的學習分工與效率。


  1. 實驗二:Decoder 的上界限制效果

    decoder limit

    為了避免 Coarse Label 對最終輸出產生負面影響,作者在 decoder 中加了一項限制條件:限制 coarse label 的 objectness 分數上限,根據目標中心距離做衰減。

    上表的結果顯示,這項設計不僅讓 Coarse Label 更具容錯空間,也讓模型更聚焦於「應該讓 auxiliary head 學到什麼」,而非讓它誤學到不必要的雜訊。


  1. 實驗三:Partial Auxiliary Head 的設計

    Partial Auxiliary Head

    在 YOLOv7 中,作者還提出了一種新的設計:

    將輔助頭連接在 E-ELAN 中間層的 pyramid(特徵金字塔)上,而非最終輸出處。

    這麼做有兩個目的:

    1. 避免 Assistant Loss 直接干擾最終 feature 的更新權重
    2. 讓不同尺寸的物件在不同層中被學習,保持 pyramid 對小中大目標的學習分布。

    結果如上表所示:Partial Coarse-to-Fine 策略表現最好,能維持各層學習目標的清晰邊界。

由 Lead Head 主導 supervision,不只是資訊再利用,更是讓整個網路形成一種語意一致、梯度互補的訓練路徑。

結論

YOLOv7 是一套以 訓練流程為主體、推論結構為背景 的物件偵測設計理念。

從模型縮放、模組替換到標籤分配,作者將那些被視為「訓練細節」的部分,重新拉到設計舞台的正中央,展現出訓練本身就是優化模型的關鍵因素。

對實務開發者來說,YOLOv7 最大的啟發在於,我們應該要認識到 memory alignment、channel matching、gradient flow 等硬體導向設計對實際部署有多重要,此外模組替換(如 RepConv)時不能只看參數,而要考慮資訊路徑與架構邏輯。

這是工程與研究交會的路口,有太多觀念值得我們學習。

☕ 一杯咖啡,就是我創作的燃料!

贊助我持續分享 AI 實作、全端架構與開源經驗,讓好文章不斷更新。

cta-button
AI / 全端 / 客製 一次搞定 icon
ALL

AI / 全端 / 客製 一次搞定

從構想到上線,涵蓋顧問、開發與部署,全方位支援你的技術實作。

包含內容
  • 顧問服務 + 系統建置 + 客製開發
  • 長期維運與擴充規劃

🚀 你的專案準備好了嗎?

如果你需要客製服務或長期顧問,歡迎與我聯繫!