or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
[Object Detection_YOLO] YOLOv7 論文筆記
tags:
Object Detection
YOLO
paper
AI / ML領域相關學習筆記入口頁面
模型部署與加速
將PyTorch模型轉換為TensorRT,實現3-8倍加速
使用DeepStream加速多串流攝影機並部署YOLO系列模型
使用Deepstream python API提取模型輸出張量並定製模型后處理(如:YOLO-Pose)
YOLOv7官方連結
YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
yolov7 offical github
yolo 原作者 github
效能進步
YOLO家族圖譜與模型架構
yolov7 架構說明
yolov7 架構簡圖
彩色的方塊可以看作是各自的輸出特徵圖,而箭頭則是轉換這些數據的多個卷積模塊。
modified from : YOLOv7を完全に理解した
yolov7的三層次架構
物件偵測模型的常見架構 Backbone, Neck, Head
source : Comparison of YOLOv3, YOLOv5s and MobileNet-SSD V2 for Real-Time Mask Detection
VGG
,ResNet
,Darknet
, 應用於邊緣裝置的輕量級網路(MobileNet
,ShuffleNet
, EfficientNet, etc.錯綜複雜的YOLO家族圖譜
source: DeepHub IMBA。
其中,v7為繼承自v4,為官方認證。(另外v7還有個非官方版,不列入討論)
歷代版本架構與數據增強演變
source: DeepHub IMBA。
FPN
特徵金字塔網路FPN
透過1.由上而下以及2.橫向連接,讓原本深層特徵圖(低解析度、高階表徵如羽毛、鳥喙)與淺層特徵圖(高解析度、但學習到的表徵多為低層次,如線條、紋理)融合,得到具有更高解析度與豐富表徵的多尺度特徵圖。這個架構後來被廣泛應用於物件檢測模型特徵圖由藍色的輪廓表示,較粗的 輪廓表示語義上更強的特徵
FPN帶來的主要優點包括:
Feature Pyramid Networks for Object Detection
主要特點
YOLOv7通過引入幾項架構重塑提高了速度和準確性。與Scaled YOLOv4類似,YOLOv7的骨架不使用ImageNet預訓練的骨架。相反,這些模型完全使用COCO數據集來訓練。因為YOLOv7與Scaled YOLOv4是由同一作者編寫的,因此架構相近。在YOLOv7的論文中引入了以下主要變化:
重點摘要如下
設計新的模型重參數化(re-parameterized model)的方法。發現RepConv中的identity連接破壞了ResNet中的殘差和Denset中的串聯,提出使用無indentity連接的RepConv(RepConvN)來設計網絡架構
提出新的動態標籤分配策略(dynamic label assignment strategy )透過階層式的深層監督與動態標籤分配,提升特徵學習能力(coarse-to-fine lead guided label assignment)
提出了可以有效利用參數和記憶體使用量的 "擴展"(extend)和 "複合縮放 "方法(compound scaling)。以ELAN改進,提出Extend-ELAN(E-ELAN),在不破壞原始梯度路徑的情況下持續增強網絡學習的能力
有效地讓最先進的即時物件偵測模型減少40%的參數和50%的計算量,並且具有更快的推理速度和更高的檢測精度。
上述1與2在論文中稱為"可訓練的贈品"(bag-of-freebies),雖然會增加訓練成本,但可以提高檢測的準確性,且不增加推理時的計算成本
整體來說,在API上,yolov7參考yolov5的設計用Pytorch實現,更為簡潔亦用。
在模型架構設計與各種減少參數量、提升計算效能的改進上,則集近年CNN神經網路各種在效能上的改進,特別是近期在邊緣裝置運算上參數量與計算效率的進展,包括re-parameterized convolution來自
RepVGG
、RepVGG
則簡化GoogleNet
多分支概念,在推理階段重現簡單的單路徑無分支VGG架構。E-ELAN
的多分支與group convolution
則源自AlexNet
為了分散運算所設計、ELAN源自VovNet,而VovNet
源自DenseNet
在計算量上的改進提供在邊緣裝置使用的可行性、DenseNet
則繼承ResNet
概念,以特徵殘差取代輸入殘差、…。因此在理解volov7各種原理時,需要補充相關背景知識、彷彿跟著跑了一遍CNN演進的近代史。以下逐一檢視各項設計
Architectural Reforms
擴展的高效層聚合網路 E-ELAN (Extended Efficient Layer Aggregation Network)
在大多數關於設計高效架構的文獻中,主要考慮的因素不外乎是參數的數量、計算量和計算密度。 包括從記憶體訪問成本(Memory Access Cost, MAC)的特點出發,分析了輸入/輸出通道比率、架構的分支數量和逐元素操作對網路推理速度的影響等
圖2(b)中的CSPVoVNet[79]的設計是VoVNet[39]的一個變種。除了考慮上述基本的設計問題外,CSPVoVNet[79]的結構還分析了梯度路徑( gradient path),使不同層的權重可以學習更多不同的特徵。
VoVNet設計式意圖

source : An Energy and GPU-Computation Efficient Backbone Network for Real-Time Object Detection(VoVNet)
上述的梯度分析方法使推論階段可以更快、更準確。圖2(c )中的ELAN 。考慮了以下設計策略–"如何設計一個 高效的網絡?"。得出了一個結論:通過控制最短的最長梯度路徑,一個更深的神經網路可以有效地學習和收斂(詳見Designing Network Design Strategies Through Gradient Path Analysis),而提出了基於ELAN的擴展ELAN(E-ELAN)。其主要結構如圖2(d)所示
sorce: 圖解 YOLOv7 - part1
Extended-ELAN
由於在
ELAN
架構的堆疊數量已達到穩定飽和的狀態,使用原架構在再往上堆疊無異於增進效能,因此,在ELAN的基礎上,設計了擴增、隨機洗牌與合併分支等操作,在不破壞原本梯度路徑的前提下增強模型學習表徵的能力。E-ELAN
僅改變 computational block 架構,並沒有更動後面的 transition layer。expand cardinality
shuffle cardinality
merge cardinality
補充: 分組卷積 group convolution
source : CondenseNet: An Efficient DenseNet using Learned Group Convolutions
group convolution
AlexNet
中出現,由於當時的計算資源有限,訓練AlexNet
時卷積操作不能全部放在同一個GPU處理,因此作者把feature maps分給多個GPU分別進行處理,最後把多個GPU的結果進行融合(分散式運算中的"模型設計"分散)。cardinality
ResNeXt
承襲AlexNet
分組與Inception
的結構把分支的單園簡化為多個相同的卷積層。1.有助於多gpu模型分散運算、2.減少參數量、3.約束相鄰filter間的相關性避免模型過擬合補充: 隨機分組卷積(Shuffled Grouped Convolution)
ShuffleNet
中提出,隨機分組卷積包括分組卷積和通道洗牌(channel shuffle)channel shuffle.
基於串聯的模型縮放 Model Scaling for Concatenation-based Models
模型縮放的主要目的是調整模型的一些屬性並生成不同尺度的模型 以滿足不同推理速度的需要. 例如,
EfficientNet
的縮放模型考慮了 的寬度、深度和分辨率。至於
scaled-YOLOv4
,其縮放模型是調整階段的數量。在《Fast and accurate model scaling》中,分析了在進行寬度和深度縮放時,卷積和分組卷積(group convolution)對參數和計算量的影響,並以此設計了相應的模型縮放方法。基於串聯的模型的縮放 Model scaling for concatenation-based models

Trainable BoF (Bag of Freebies)
模型重參數化(model re-parameterized)與動態標籤技術( dynamic label assignment)是近年神經網路訓練與物件偵測的重要議題,論文中著重在這兩個主題的改進
模型重參數化 model re-parameterization
Planned re-parameterized convolution
模型重參數化技術
RepConv Module 重參數化示意

source : Target Detection Network for Underwater Image Based on Adaptive Anchor Frame and Re-parameterization
模型重參數化技術可以被視為一種集成技術(ensemble),分為兩類,即模塊等級的集成和模型等級的集成
重參數化模型 Planned re-parameterized model
圖4為將

RepConv
/RepConvN
融合至單純的卷基網路(PlainNet
)與殘差網路(Resnet
)的示意圖(詳細量化數據見消融試驗的結果一節)簡單來說就是示意
identity connection
的結構會破壞模型表現RepConv
取代單純卷積進行重參數化,不影響模型表現identity connection
的殘差網路中使用RepConv
則會降低模型表現RepConv
置於殘差網路不同位置的試驗,發現如果RepConv
置於前,由於沒有identity的連接,不影響模型表現RepConvN
取代RepConv
,則可任意置於殘差網路中不影響表現RepVGG
中採用RepConv
的設計進行模型結構重參數化取得很好的成果,可以在精度(AP)與計算效能間達到很好的平衡。但RepConv
應用在ResNet
(residual)與DenseNet
(concatenation)時卻出現了模型預測表現下降的問題,經分析後,yolov7團隊認為是RepConv
中的恒等連接(identity connection
)破壞了上述網路,降低特徵圖的梯度多樣性,導致模型表現下降因此yolov7團隊將
RepConv
內的恒等連接移除以RepConvN
取代進行試驗RepConv
與RepConvN
結構示意RepConvN
=RepConv
(identity)- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →RepVGG
與Re-parameterizationyolov7內的模型結構重參數化(Re-parameterization)為借鏡
RepVGG
的作法。將訓練階段模型的參數映射到推理用模型,透過把多個運算模塊合併為一,簡化分支與縮小參數以提升運算時的效能訓練完捨棄原模型,只保存和部署轉換完(重參數化)的模型,而不是每次推理(inference)完都要轉換。
Re-parameterization可以視為模型壓縮的一種方法。其他常見的模型壓縮方法還包含模型剪裁(Pruning)、參數量化(Parameter Quantization)、知識蒸餾(Knowledge Distillation)等
圖(B)為
RepVGG
訓練時的多分支架構,圖C為推理時的無分支架構。透過參數重構(Re-parameterization)的設計,將訓練階段的多分支模型等架轉換為無分支模型
將1x1 conv與identity單位矩陣拓展為等效的3x3矩陣後,與3x3 conv直接相加達成多分枝合併為單支的實作
動態標籤分配策略 dynamic label assignment : Coarse for auxiliary and Fine for lead loss
標籤分配 Label Assignment
標籤分配是物件偵測演算法的核心課題,指的是如何提供適當的正負樣本供神經網路學習,使其輸出正確期望的目標,在物件偵測任務中的樣本主要指的是物件位置(BBox)。
具體來說我們希望模型產出的預測框可以精準的框在目標物上,這時分配的正樣本標籤為1,如果完全沒有框住物體則給予負標籤0,但如果預測框有偏移僅包含部分目標區域則如何判定為正負樣本呢? 除此之外,目標物件通常只占畫面一小部分,容易造成正負樣本比例失衡,以上幾點是近年標籤分配演算法改善重點
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →深度/中繼監督 Deep/Intermediate Supervision
深層監督示意圖
圖5(a)為一般的網路、(b)為在中間層加入輔助頭(分類器)進行深層深度的網路
Deep supervision 深層/中間監督技術常見於訓練深層神經網路。主要概念是在神經網路的中間層抽取的特徵後面接上分類器(也就是輔助頭 auxiliary head),並計算Loss來評估中間層提取出的特徵品質,優化中間層的特徵學習能力。為了讓最後的輸出頭(淺層網路)主導最後訓練表現與方向,通常會設計不同的權重讓其維持主導地位
volov7的動態標籤分配與深層監督策略
釐清論文中使用的幾個名詞定義
圖5 Coarse for auxiliary and fine for lead head label assigner

如何分配標籤給主導頭與輔助頭? 圖5(c )是目前多數演算法採用的方式,兩者間的標籤分配是獨立進行沒有關聯。
yolov7提出一種新的標籤分配方法,讓主導頭的預測結果同時指引輔導頭和主導頭的標籤分配。使用主導頭的預測結產生從粗到細的分層標籤,這些標籤被用於分別用於輔助頭和主導頭的學習。依序是Lead head guided label assigner與Coarse-to-fine lead head guided label assigner,圖5(d)與圖5(e)
Lead head guided label assigner 圖5(d)
由於主導頭有相對較強的學習能力,所以由它生成的軟標籤 應該更能代表源數據和目標數據之間的分佈和相關性。此外,可以把這種學習看作是一種廣義的殘差學習。
通過讓輔助頭直接學習主導頭已經學到的信息,主導頭將能更專注於學習尚未學到的殘餘信息
code具體實現
Coarse-to-fine lead head guided label assigner 圖5(e)
同上,只是產生的軟標籤按網路深淺分為兩組,即粗標籤(網路中間層)和細標籤(最後輸出層)
fine label for lead head
Coarse label for auxiliary head

demo code
實際code在
yolov7/utils /loss.py/def build_targets()
Hard negative mining
這裡是在解決深度學習經典的困難負樣本挖掘(hard negative mining)問題
物件檢測任中,模型在隨機產出候選框(anchor-based)或預測的關鍵點(anchor-free)時,特別是對於很小的物體會因背景佔多數而得到大量負樣本,導致正負樣本比例失衡問題,因此,需要特別選擇難以分辨的負樣本(hard negative)加入負樣本集,才能讓模型得到得到比較好的判別效果。
在YOLOv7採用的困難負樣本挖掘方法是,訓練模型利用中間網路層(深層監督)產出的特徵圖學習初步分類,放寬對正樣本的限制來增加模型的判斷困難度,對應前文所說不同階層的粗、細(Coarse-to-fine)概念。其中,輔助頭(分類器)得到的軟標籤(正負樣本判定數值),是根據導引頭(最後輸出的分類器)的預測結果優化得來(前文所說的guided label)
ps: 在正負樣本分配上,yolov7使用了yoloX的
SimOTA
分配方法,與yolov5的分配方法進行融合。也就是simOTA中的第一步“使用中心先驗”替換成“yolov5中的策略”,提供了更加精確的先驗知識SimOTA 是由 YOLOX 提出的,其主要想法不僅在分配正樣本時考慮到 IoU,還會參考分類的結果。即根據 Classification Loss、Regression Loss 和 IoU Loss 進行 topK來進行前 K 名( topK)的標籤分配。
圖8顯示了由不同的方法預測的 objectness map

左邊的(b)與(c )是主導頭與輔助頭獨立運作、右邊的(d)與(e)是Lead head guided的結果。如果輔助頭學習了主導頭的軟標籤,它確實會幫助主導頭更能提取出未學習到的殘差訊息(residual information)
Other Bag-of-Freebies tricks
其他附加功能
影像分割 yolo-mask(instance segmentation)
人體姿態/骨架辨識 YOLO POSE(2D skeleton/pose estimation)
Label
人體關鍵點17個,每個點位包含{\(x,y,conf\)},其中conf為0、1或2,分別代表"不存在"、"存在但被遮擋"或"存在且不被遮擋",故和人體有關的label一個人包含17x3(3代表x、y、conf)=51個元素,bbox預測的label含有6個元素(x,y,w,h,box_conf,cls_conf),共51+6=57個元素,表達如下:
\[ P_{v} = \{C_{x}, C_{y}, W, H, box_{conf}, class_{conf}, K_{x}^{1}, K_{y}^{1}, K_{conf}^{1}, \cdots, K_{x}^{n}, K_{y}^{n}, K_{conf}^{n}\} \]
參考資料
YOLOv7
2023.03。【YOLOv7成功關鍵:技術篇】關鍵人物親自揭露三大突破,下一步攻多任務與解釋性
針對技術改進部分有提供直白解釋
圖解yolov7 architecture (1/2)
YOLO系列目标检测算法-YOLOv7
YOLOv7 Object Detection Paper Explanation & Inference
YOLOv7を完全に理解した(YOLOv7の論文を読んでみた)
雖然是日文 但介紹的滿簡潔,另外有很清楚的模型架構圖
YOLO家族系列模型的演变:从v1到v8
Object Detection
有整理不錯的重要課題與技術演進
Re-parameterizing
Hard Negative Mining
Label Assignment
others
Deep Learning相關筆記
Self-supervised Learning
Object Detection
ViT與Transformer相關
Autoencoder相關