OLO之父Joseph Redmon在今年年初宣布退出計算機視覺的研究的時候,很多人都以為目标檢測神器YOLO系列就此終結。然而在4月23日,繼任者YOLO V4卻悄無聲息地來了。Alexey Bochkovskiy發表了一篇名為YOLOV4: Optimal Speed and Accuracy of Object Detection的文章。YOLO V4是YOLO系列一個重大的更新,其在COCO資料集上的平均精度(AP)和幀率精度(FPS)分别提高了10% 和12%,并得到了Joseph Redmon的官方認可,被認為是目前最強的實時對象檢測模型之一。
正當計算機視覺的從業者們正在努力研究YOLO V4的時候,萬萬沒想到,有牛人不服。6月25日,Ultralytics釋出了YOLOV5 的第一個正式版本,其性能與YOLO V4不相伯仲,同樣也是現今最先進的對象檢測技術,并在推理速度上是目前最強。

從上圖的結果可以看出,YOLO V5确實在對象檢測方面的表現非常出色,尤其是YOLO V5s 模型140FPS的推理速度非常驚豔。
YOLO V5和V4集中出現讓很多人都感到疑惑,一是YOLO V5真的有資格能被稱作新一代YOLO嗎?二是YOLO V5的性能與V4相比究竟如何,兩者有啥差別及相似之處?
在本文中我會詳細介紹YOLO V5和YOLO V4的原理,技術差別及相似之處,最後會從多方面對比兩者的性能。
YOLO是一種快速緊湊的開源對象檢測模型,與其它網絡相比,同等尺寸下性能更強,并且具有很不錯的穩定性,是第一個可以預測對象的類别和邊界框的端對端神經網絡。
YOLO V3原始模型是基于Darknet網絡。Ultralytics将YOLO V3架構遷移到了Pytorch平台上,并對其自行研究和改進。Ultralytics-yolov3 代碼庫是目前已開源YOLO V3 Pytorch的最佳實作。
YOLO網絡主要由三個主要元件組成。
1)Backbone -在不同圖像細粒度上聚合并形成圖像特征的卷積神經網絡。
2)Neck:一系列混合群組合圖像特征的網絡層,并将圖像特征傳遞到預測層。
3)Head: 對圖像特征進行預測,生成邊界框和并預測類别。
下圖是對象檢測網絡的通用架構:
圖檔引用
我們可以在上述每個主要元件上使用不同的技術或者組合不同的方案來實作屬于自己的最佳對象檢測架構。
實際上YOLO V5的模型架構是與V4非常相近的。在下文中,我會從下面幾個方面對比YOLO V5和V4,并簡要闡述它們各自新技術的特點,對比兩者的差別和相似之處,評判兩者的性能,并做最後總結。
- Data Augmentation
- Auto Learning Bounding Box Anchors
- Backbone
- Network Architecture
- Neck
- Head
- Activation Function
- Optimization Function
- Benchmarks
Data Augmentation
圖像增強是從現有的訓練資料中建立新的訓練樣本。我們不可能為每一個現實世界場景捕捉一個圖像,是以我們需要調整現有的訓練資料以推廣到其他情況,進而允許模型适應更廣泛的情況。無論是YOLO V5還是V4,多樣化的先進資料增強技術是最大限度地利用資料集,使對象檢測架構取得性能突破的關鍵。通過一系列圖像增強技術步驟,可以在不增加推理時延的情況下提高模型的性能。
YOLO V4資料增強
圖檔引用
YOLO V4使用了上圖中多種資料增強技術的組合,對于單一圖檔,除了經典的幾何畸變與光照畸變外,還創新地使用了圖像遮擋(Random Erase,Cutout,Hide and Seek,Grid Mask ,MixUp)技術,對于多圖組合,作者混合使用了CutMix與Mosaic 技術。除此之外,作者還使用了Self-Adversarial Training (SAT)來進行資料增強。
在下文中我将簡單介紹以上資料增強技術。
圖像遮擋
- Random Erase:用随機值或訓練集的平均像素值替換圖像的區域。
圖檔引用
- Cutout: 僅對 CNN 第一層的輸入使用剪切方塊Mask。
一文讀懂YOLO V5 與 YOLO V4
圖檔引用
- Hide and Seek:将圖像分割成一個由 SxS 圖像更新檔組成的網格,根據機率設定随機隐藏一些更新檔,進而讓模型學習整個對象的樣子,而不是單獨一塊,比如不單獨依賴動物的臉做識别。
一文讀懂YOLO V5 與 YOLO V4
圖檔引用
- Grid Mask:将圖像的區域隐藏在網格中,作用也是為了讓模型學習對象的整個組成部分。
- MixUp:圖像對及其标簽的凸面疊加。
Mosaic data augmentation:
- 在Cutmix中我們組合了兩張圖像,而在 Mosaic 中我們使用四張訓練圖像按一定比例組合成一張圖像,使模型學會在更小的範圍内識别對象。其次還有助于顯著減少對batch-size的需求,畢竟大多數人的GPU顯存有限。
自對抗訓練(SAT)
- Self-Adversarial Training是在一定程度上抵抗對抗攻擊的資料增強技術。CNN計算出Loss, 然後通過反向傳播改變圖檔資訊,形成圖檔上沒有目标的假象,然後對修改後的圖像進行正常的目标檢測。需要注意的是在SAT的反向傳播的過程中,是不需要改變網絡權值的。
使用對抗生成可以改善學習的決策邊界中的薄弱環節,提高模型的魯棒性。是以這種資料增強方式被越來越多的對象檢測架構運用。
類标簽平滑
Class label smoothing是一種正則化方法。如果神經網絡過度拟合和/或過度自信,我們都可以嘗試平滑标簽。也就是說在訓練時标簽可能存在錯誤,而我們可能“過分”相信訓練樣本的标簽,并且在某種程度上沒有審視了其他預測的複雜性。是以為了避免過度相信,更合理的做法是對類标簽表示進行編碼,以便在一定程度上對不确定性進行評估。YOLO V4使用了類平滑,選擇模型的正确預測機率為0.9,例如[0,0,0,0.9,0...,0 ]。
從上圖看出,标簽平滑為最終的激活産生了更緊密的聚類和更大的類别間的分離,實作更好的泛化。
圖檔引用
YOLO V5 似乎沒有使用類标簽平滑。
YOLO V5 資料增強
YOLO V5的作者現在并沒有發表論文,是以隻能從代碼的角度了解它的資料增強管道。
YOLOV5都會通過資料加載器傳遞每一批訓練資料,并同時增強訓練資料。資料加載器進行三種資料增強:縮放,色彩空間調整和馬賽克增強。
有意思的是,有媒體報道,YOLO V5的作者Glen Jocher正是Mosaic Augmentation的創造者,他認為YOLO V4性能巨大提升很大程度是馬賽克資料增強的功勞,也許是不服,他在YOLO V4出來後的僅僅兩個月便推出YOLO V5,當然未來是否繼續使用YOLO V5的名字或者采用其他名字,首先得看YOLO V5的最終研究成果是否能夠真正意義上領先YOLO V4。
但是不可否認的是馬賽克資料增強确實能有效解決模型訓練中最頭疼的“小對象問題”,即小對象不如大對象那樣準确地被檢測到。
Auto Learning Bounding Box Anchors-自适應錨定框
在YOLO V5 中錨定框是基于訓練資料自動學習的。
對于COCO資料集來說,YOLO V5 的配置檔案*.yaml 中已經預設了640×640圖像大小下錨定框的尺寸:
# anchors
anchors:
- [116,90, 156,198, 373,326] # P5/32
- [30,61, 62,45, 59,119] # P4/16
- [10,13, 16,30, 33,23] # P3/8
但是對于你的自定義資料集來說,由于目辨別别架構往往需要縮放原始圖檔尺寸,并且資料集中目标對象的大小可能也與COCO資料集不同,是以YOLO V5會重新自動學習錨定框的尺寸。
如在上圖中, YOLO V5在進行學習自動錨定框的尺寸。對于BDD100K資料集,模型中的圖檔縮放到512後,最佳錨定框為:
YOLO V4并沒有自适應錨定框。
Backbone-跨階段局部網絡(CSP)
YOLO V5和V4都使用CSPDarknet作為Backbone,從輸入圖像中提取豐富的資訊特征。CSPNet全稱是Cross Stage Partial Networks,也就是跨階段局部網絡。CSPNet解決了其他大型卷積神經網絡架構Backbone中網絡優化的梯度資訊重複問題,将梯度的變化從頭到尾地內建到特征圖中,是以減少了模型的參數量和FLOPS數值,既保證了推理速度和準确率,又減小了模型尺寸。
CSPNet實際上是基于Densnet的思想,複制基礎層的特征映射圖,通過dense block 發送副本到下一個階段,進而将基礎層的特征映射圖分離出來。這樣可以有效緩解梯度消失問題(通過非常深的網絡很難去反推丢失信号) ,支援特征傳播,鼓勵網絡重用特征,進而減少網絡參數數量。
CSPNet思想可以和ResNet、ResNeXt和DenseNet結合,目前主要有CSPResNext50 and CSPDarknet53兩種改造Backbone網絡。
Neck-路徑聚合網絡(PANET)
Neck主要用于生成特征金字塔。特征金字塔會增強模型對于不同縮放尺度對象的檢測,進而能夠識别不同大小和尺度的同一個物體。在PANET出來之前,FPN一直是對象檢測架構特征聚合層的State of the art,直到PANET的出現。在YOLO V4的研究中,PANET被認為是最适合YOLO的特征融合網絡,是以YOLO V5和V4都使用PANET作為Neck來聚合特征。
PANET基于 Mask R-CNN 和 FPN 架構,同時加強了資訊傳播。該網絡的特征提取器采用了一種新的增強自下向上路徑的 FPN 結構,改善了低層特征的傳播。第三條通路的每個階段都将前一階段的特征映射作為輸入,并用3x3卷積層處理它們。輸出通過橫向連接配接被添加到自上而下通路的同一階段特征圖中,這些特征圖為下一階段提供資訊。同時使用自适應特征池化(Adaptive feature pooling)恢複每個候選區域和所有特征層次之間被破壞的資訊路徑,聚合每個特征層次上的每個候選區域,避免被任意配置設定。
下圖中pi 代表 CSP 主幹網絡中的一個特征層
Head-YOLO 通用檢測層
模型Head主要用于最終檢測部分。它在特征圖上應用錨定框,并生成帶有類機率、對象得分和包圍框的最終輸出向量。
在 YOLO V5模型中,模型Head與之前的 YOLO V3和 V4版本相同。
這些不同縮放尺度的Head被用來檢測不同大小的物體,每個Head一共(80個類 + 1個機率 + 4坐标) * 3錨定框,一共255個channels。
Network Architecture
由于YOLO V5的作者并未放出論文,而網絡上已經存在大量YOLO V4網絡結構分析,是以本文不着重分析YOLO V5與V4的網絡結構具體細節,但它們有着相似的網絡結構,都使用了CSPDarknet53(跨階段局部網絡)作為Backbone,并且使用了PANET(路徑聚合網絡)和SPP(空間金字塔池化)作為Neck,而且都使用YOLO V3的Head。
我們可以通過Netron可視化YOLO V5及V4的網絡結構,但是你會發現YOLO V5的網絡結構非常簡潔,而且YOLO V5 s,m,l,x四種模型的網絡結構是一樣的。原因在于Ultralytics通過
depth_multiple,width_multiple
兩個參數分别控制模型的深度以及卷積核的個數。
# YOLO V5s
# parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
例如*.yaml檔案中,V5s的深度是0.33,而V5x的深度是1.33,也就是說V5x的Bottleneck個數是V5s的四倍。
而V5s的寬度是0.5,而V5x的寬度是1.25,表示V5s的卷積核數量是設定的一半,而V5x是設定的1.25倍,當然你也可以設定到1.5倍,搭建超巨型神經網絡。下圖中YOLO V5的yaml檔案中的backbone的第一層是
[[-1, 1, Focus, [64, 3]]
,而V5s的寬度是0.5,是以這一層實際上是
[[-1, 1, Focus, [32, 3]]
。
# YOLOv5 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, BottleneckCSP, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, BottleneckCSP, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, BottleneckCSP, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
]
下圖中左側為YOLO V5s的模型右側為YOLO V5x的模型,可以明顯看出卷積核數量不一樣,是以參數數量也不一樣。
Activation Function
激活函數的選擇對于深度學習網絡是至關重要的。YOLO V5的作者使用了 Leaky ReLU 和 Sigmoid 激活函數。
在 YOLO V5中,中間/隐藏層使用了 Leaky ReLU 激活函數,最後的檢測層使用了 Sigmoid 形激活函數。而YOLO V4使用Mish激活函數。
Mish在39個基準測試中擊敗了Swish,在40個基準測試中擊敗了ReLU,一些結果顯示基準精度提高了3–5%。但是要注意的是,與ReLU和Swish相比,Mish激活在計算上更加昂貴。
Optimization Function
YOLO V5的作者為我們提供了兩個優化函數Adam和SGD,并都預設了與之比對的訓練超參數。預設為SGD。
YOLO V4使用SGD。
YOLO V5的作者建議是,如果需要訓練較小的自定義資料集,Adam是更合适的選擇,盡管Adam的學習率通常比SGD低。但是如果訓練大型資料集,對于YOLOV5來說SGD效果比Adam好。
實際上學術界上對于SGD和Adam哪個更好,一直沒有統一的定論,取決于實際項目情況。
Cost Function
YOLO 系列的損失計算是基于 objectness score, class probability score,和 bounding box regression score.
YOLO V5使用 GIOU Loss作為bounding box的損失。
YOLO V5使用二進制交叉熵和 Logits 損失函數計算類機率和目标得分的損失。同時我們也可以使用fl _ gamma參數來激活Focal loss計算損失函數。
YOLO V4使用 CIOU Loss作為bounding box的損失,與其他提到的方法相比,CIOU帶來了更快的收斂和更好的性能。
上圖結果基于Faster R-CNN,可以看出,實際上CIoU 的表現比 GIoU 好。
Benchmarks- YOLO V5 VS YOLO V4
由于Ultralytics公司目前重心都放在盡快推廣YOLO V5對象檢測架構,YOLO V5也在不停的更新和完善之中,是以作者打算年底在YOLO V5的研究完成之後發表正式論文。在沒有論文的詳細論述之前,我們隻能通過檢視作者放出的COCO名額并結合大佬們後續的執行個體評估來比較兩者的性能。
- 官方性能評估
在上面的兩個圖中,FPS與ms/img的關系是反轉的,經過機關轉換後我們可以發現,在V100GPU上YOLO V5可以達到250FPS,同時具有較高的mAP。
由于YOLO V4的原始訓練是在1080TI上的,遠低于V100的性能,并且AP_50與AP_val的對标不同,是以僅憑上述的表格是無法得出兩者的Benchmarks。
好在YOLO V4的第二作者WongKinYiu使用V100的GPU提供了可以對比的Benchmarks。
從圖表中可以看出,兩者性能其實很接近,但是從資料上看YOLO V4仍然是最佳對象檢測架構。YOLO V4的可定制化程度很高,如果不懼怕更多自定義配置,那麼基于Darknet的YOLO V4仍然是最準确的。值得注意的是YOLO V4其實使用了大量Ultralytics YOLOv3代碼庫中的資料增強技術,這些技術在YOLO V5中也被運作,資料增強技術對于結果的影響到底有多大,還得等作者的論文分析。
- 訓練時間
根據Roboflow的研究表明,YOLO V5的訓練非常迅速,在訓練速度上遠超YOLO V4。對于Roboflow的自定義資料集,YOLO V4達到最大驗證評估花了14個小時,而YOLO V5僅僅花了3.5個小時。
Summary
總的來說,YOLO V4 在性能上優于YOLO V5,但是在靈活性與速度上弱于YOLO V5。由于YOLO V5仍然在快速更新,是以YOLO V5的最終研究成果如何,還有待分析。我個人覺得對于這些對象檢測架構,特征融合層的性能非常重要,目前兩者都是使用PANET,但是根據谷歌大腦的研究,BiFPN才是特征融合層的最佳選擇。誰能整合這項技術,很有可能取得性能大幅超越。
盡管YOLO V5目前仍然計遜一籌,但是YOLO V5仍然具有以下顯著的優點:
- 使用Pytorch架構,對使用者非常友好,能夠友善地訓練自己的資料集,相對于YOLO V4采用的Darknet架構,Pytorch架構更容易投入生産
- 代碼易讀,整合了大量的計算機視覺技術,非常有利于學習和借鑒
- 不僅易于配置環境,模型訓練也非常快速,并且批處理推理産生實時結果
- 能夠直接對單個圖像,批處理圖像,視訊甚至網絡攝像頭端口輸入進行有效推理
- 能夠輕松的将Pytorch權重檔案轉化為安卓使用的ONXX格式,然後可以轉換為OPENCV的使用格式,或者通過CoreML轉化為IOS格式,直接部署到手機應用端
- 最後YOLO V5s高達140FPS的對象識别速度令人印象非常深刻,使用體驗非常棒
其實很多人都覺得YOLO V4和YOLO V5實際上沒有什麼耳目一新創新,而是大量整合了計算機視覺領域的State-of-the-art,進而顯著改善YOLO對象檢測的性能。其實我覺得有的時候工程應用的能力同樣也很重要,能有兩個這麼優秀的技術整合執行個體供我們免費使用和學習研究,已經不能奢求更多了,畢竟活雷鋒還是少啊。先别管别人誰更強,自己能學到更多才是最重要的,畢竟讨論别人誰強,還不如自己強。
最後想說的是,技術發展如此之快,究竟誰能最後拿下最佳對象檢測架構的頭銜尤未可知,而我們處在最好的時代,讓我們且行且學且珍惜。
這裡有一點資料可以幫助你,掃碼免費領取