Object Detection
YOLO
paper
彩色的方塊可以看作是各自的輸出特徵圖,而箭頭則是轉換這些數據的多個卷積模塊。
modified from : YOLOv7を完全に理解した
source : Comparison of YOLOv3, YOLOv5s and MobileNet-SSD V2 for Real-Time Mask Detection
VGG
, ResNet
,Darknet
, 應用於邊緣裝置的輕量級網路(MobileNet
, ShuffleNet
, EfficientNet, etc.
source: DeepHub IMBA。
其中,v7為繼承自v4,為官方認證。(另外v7還有個非官方版,不列入討論)
source: DeepHub IMBA。
雖然上表並未提及所有提高性能的改進和發現。但是YOLO的發展我們可以看到一些模式。
Backbone:最初由一個分支(GoogLeNet、VGG、Darknet)組成,然後過渡到包含跳躍連接的架構(Cross-Stage Partial connections — CSPDarknet、CSPRepResNet、Extended-ELAN)。
Neck:最初也由一個分支組成,然後以特徵金字塔網絡的各種修改形式逐步發展,這樣可以在不同尺度下保持物體檢測的準確性。
Head:在早期版本中只有一個 head,它包含所有輸出參數——分類、bbox 的坐標等。後面的研究發現將它們分成不同的頭會更有效率。從基於錨點到無錨點也發生了轉變(v7 除外——出於某種原因,它仍然有錨點)。
數據增強:仿射變換、HSV 抖動和曝光變化等早期增強非常簡單,不會改變對象的背景或環境。而最近的一些——MixUp、Mosaic、CutOut 等改變了圖像的內容。平衡這兩個方向增強的比例對於神經網絡的有效訓練都很重要。
FPN
特徵金字塔網路
FPN
透過1.由上而下以及2.橫向連接,讓原本深層特徵圖(低解析度、高階表徵如羽毛、鳥喙)與淺層特徵圖(高解析度、但學習到的表徵多為低層次,如線條、紋理)融合,得到具有更高解析度與豐富表徵的多尺度特徵圖。這個架構後來被廣泛應用於物件檢測模型
特徵圖由藍色的輪廓表示,較粗的 輪廓表示語義上更強的特徵
FPN帶來的主要優點包括:
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演進的近代史。
以下逐一檢視各項設計
在大多數關於設計高效架構的文獻中,主要考慮的因素不外乎是參數的數量、計算量和計算密度。 包括從記憶體訪問成本(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)所示
由於在ELAN
架構的堆疊數量已達到穩定飽和的狀態,使用原架構在再往上堆疊無異於增進效能,因此,在ELAN的基礎上,設計了擴增、隨機洗牌與合併分支等操作,在不破壞原本梯度路徑的前提下增強模型學習表徵的能力。E-ELAN
僅改變 computational block 架構,並沒有更動後面的 transition layer。
expand cardinality
shuffle cardinality
merge cardinality
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間的相關性避免模型過擬合ShuffleNet
中提出,隨機分組卷積包括分組卷積和通道洗牌(channel shuffle)模型縮放的主要目的是調整模型的一些屬性並生成不同尺度的模型 以滿足不同推理速度的需要. 例如,EfficientNet
的縮放模型考慮了 的寬度、深度和分辨率。
至於scaled-YOLOv4
,其縮放模型是調整階段的數量。在《Fast and accurate model scaling》中,分析了在進行寬度和深度縮放時,卷積和分組卷積(group convolution)對參數和計算量的影響,並以此設計了相應的模型縮放方法。
基於串聯的模型的縮放 Model scaling for concatenation-based models
模型重參數化(model re-parameterized)與動態標籤技術( dynamic label assignment)是近年神經網路訓練與物件偵測的重要議題,論文中著重在這兩個主題的改進
Planned re-parameterized convolution
RepConv Module 重參數化示意
source : Target Detection Network for Underwater Image Based on Adaptive Anchor Frame and Re-parameterization
模型重參數化技術可以被視為一種集成技術(ensemble),分為兩類,即模塊等級的集成和模型等級的集成
圖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
(RepVGG
與Re-parameterizationyolov7內的模型結構重參數化(Re-parameterization)為借鏡RepVGG
的作法。
將訓練階段模型的參數映射到推理用模型,透過把多個運算模塊合併為一,簡化分支與縮小參數以提升運算時的效能訓練完捨棄原模型,只保存和部署轉換完(重參數化)的模型,而不是每次推理(inference)完都要轉換。
首先構造一系列結構(一般用於訓練),並將其參數等價轉換為另一組參數(一般用於推理),從而將這一系列結構等價轉換為另一系列結構。在現實場景中,訓練資源一般是相對豐富的,我們更在意推理時的開銷和性能,因此我們想要訓練時的結構較大,具備好的某種性質(更高的精度或其他有用的性質,如稀疏性),轉換得到的推理時結構較小且保留這種性質(相同的精度或其他有用的性質)。換句話說,“結構重參數化”這個詞的本意就是:用一個結構的一組參數轉換為另一組參數,並用轉換得到的參數來參數化(parameterize)另一個結構。只要參數的轉換是等價的,這兩個結構的替換就是等價的。
Re-parameterization可以視為模型壓縮的一種方法。其他常見的模型壓縮方法還包含模型剪裁(Pruning)、參數量化(Parameter Quantization)、知識蒸餾(Knowledge Distillation)等
圖(B)為RepVGG
訓練時的多分支架構,圖C為推理時的無分支架構。
透過參數重構(Re-parameterization)的設計,將訓練階段的多分支模型等架轉換為無分支模型
ResNet的shortcut雖然不占計算量,卻增加了一倍的顯存占用
將1x1 conv與identity單位矩陣拓展為等效的3x3矩陣後,與3x3 conv直接相加達成多分枝合併為單支的實作
標籤分配是物件偵測演算法的核心課題,指的是如何提供適當的正負樣本供神經網路學習,使其輸出正確期望的目標,在物件偵測任務中的樣本主要指的是物件位置(BBox)。
具體來說我們希望模型產出的預測框可以精準的框在目標物上,這時分配的正樣本標籤為1,如果完全沒有框住物體則給予負標籤0,但如果預測框有偏移僅包含部分目標區域則如何判定為正負樣本呢? 除此之外,目標物件通常只占畫面一小部分,容易造成正負樣本比例失衡,以上幾點是近年標籤分配演算法改善重點
深層監督示意圖
圖5(a)為一般的網路、(b)為在中間層加入輔助頭(分類器)進行深層深度的網路
Deep supervision 深層/中間監督技術常見於訓練深層神經網路。主要概念是在神經網路的中間層抽取的特徵後面接上分類器(也就是輔助頭 auxiliary head),並計算Loss來評估中間層提取出的特徵品質,優化中間層的特徵學習能力。為了讓最後的輸出頭(淺層網路)主導最後訓練表現與方向,通常會設計不同的權重讓其維持主導地位
釐清論文中使用的幾個名詞定義
圖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
## loss of bounding box
lbox += (1.0 - iou).mean()
## loss of classification
lcls += self.BCEcls(ps[:, 5:], t)
# Aux head: weight=0.25
lbox += 0.25 * (1.0 - iou_aux).mean()
lcls += 0.25 * self.BCEcls(ps_aux[:, 5:], t_aux)
同上,只是產生的軟標籤按網路深淺分為兩組,即粗標籤(網路中間層)和細標籤(最後輸出層)
fine label for lead head
Coarse label for auxiliary head
demo code
實際code在yolov7/utils /loss.py/def build_targets()
def find_n_positive(n, anchors, targets):
"""
This function finds the top `n` anchors that are closest to each target
and considers them as positive samples.
"""
positive_indices = []
for target in targets:
# Calculate some distance metric between target and all anchors
distances = calculate_distances(target, anchors)
# Find indices of anchors with the top `n` smallest distances
top_n_indices = distances.argsort()[:n]
# Append these indices to the list of positive samples
positive_indices.append(top_n_indices)
return positive_indices
# Example usage
anchors = [...] # Define your anchors here
targets = [...] # Define your targets here
positive_samples_3nn = find_n_positive(3, anchors, targets)
positive_samples_5nn = find_n_positive(5, anchors, 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)
\[ 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}\} \]
針對技術改進部分有提供直白解釋
雖然是日文 但介紹的滿簡潔,另外有很清楚的模型架構圖