YOLO系列算法精讲:从yolov1至yolov4的进阶之路(呕心沥血2万字超全整理,建议收藏!)
從剛開始接觸YOLO到現在也已經有大半年時間了,中間也陸陸續續接觸過其它網絡。最近又抽時間研究了一下YOLOv4。 因此,趁此機會,將yolov1到yolov4進行一個全面的整理和總結,希望對即將入坑的你有所幫助!
?
文章目錄
- 一、開山之作:YOLOv1
- 1.1 簡介
- 1.2 網絡結構
- 1.3 實現細節
- 1.4 性能表現
- 二、更快更準:YOLOv2
- 2.1 簡介
- 2.2 網絡結構
- 2.3 改進方法
- 2.4 性能表現
- 三、巔峰之作:YOLOv3
- 3.1 簡介
- 3.2 網絡結構
- 3.3 改進之處
- 3.4 性能表現
- 四、大神接棒:YOLOv4
- 4.1 簡介
- 4.2 網絡結構
- 4.3 各種Tricks總結
- 4.4 改進方法
- 4.5 性能表現
?
一、開山之作:YOLOv1
1.1 簡介
在YOLOv1提出之前,R-CNN系列算法在目標檢測領域獨占鰲頭。R-CNN系列檢測精度高,但是由于其網絡結構是雙階段(two-stage)的特點,使得它的檢測速度不能滿足實時性,飽受詬病。為了打破這一僵局,設計一種速度更快的目標檢測器是大勢所趨。
2016年,Joseph Redmon、Santosh Divvala、Ross Girshick等人提出了一種單階段(one-stage)的目標檢測網絡。它的檢測速度非常快,每秒可以處理45幀圖片,能夠輕松地實時運行。由于其速度之快和其使用的特殊方法,作者將其取名為:You Only Look Once(也就是我們常說的YOLO的全稱),并將該成果發表在了CVPR 2016上,從而引起了廣泛地關注。
YOLO 的核心思想就是把目標檢測轉變成一個回歸問題,利用整張圖作為網絡的輸入,僅僅經過一個神經網絡,得到bounding box(邊界框) 的位置及其所屬的類別。
1.2 網絡結構
現在看來,YOLOv1的網路結構非常明晰,是一種傳統的one-stage的卷積神經網絡:
- 網絡輸入:448×448×3的彩色圖片。
- 中間層:由若干卷積層和最大池化層組成,用于提取圖片的抽象特征。
- 全連接層:由兩個全連接層組成,用來預測目標的位置和類別概率值。
- 網絡輸出:7×7×30的預測結果。
1.3 實現細節
(1)檢測策略
YOLOv1采用的是“分而治之”的策略,將一張圖片平均分成7×7個網格,每個網格分別負責預測中心點落在該網格內的目標。回憶一下,在Faster R-CNN中,是通過一個RPN來獲得目標的感興趣區域,這種方法精度高,但是需要額外再訓練一個RPN網絡,這無疑增加了訓練的負擔。在YOLOv1中,通過劃分得到了7×7個網格,這49個網格就相當于是目標的感興趣區域。通過這種方式,我們就不需要再額外設計一個RPN網絡,這正是YOLOv1作為單階段網絡的簡單快捷之處!
具體實現過程如下:
在實際過程中,YOLOv1把一張圖片劃分為了7×7個網格,并且每個網格預測2個Box(Box1和Box2),20個類別。所以實際上,S=7,B=2,C=20。那么網絡輸出的shape也就是:7×7×30。
(2)目標損失函數
- 損失由三部分組成,分別是:坐標預測損失、置信度預測損失、類別預測損失。
- 使用的是差方和誤差。需要注意的是,w和h在進行誤差計算的時候取的是它們的平方根,原因是對不同大小的bounding box預測中,相比于大bounding box預測偏一點,小box預測偏一點更不能忍受。而差方和誤差函數中對同樣的偏移loss是一樣。 為了緩和這個問題,作者用了一個比較取巧的辦法,就是將bounding box的w和h取平方根代替原本的w和h。
- 定位誤差比分類誤差更大,所以增加對定位誤差的懲罰,使λcoord=5λ_{coord}=5λcoord?=5。
- 在每個圖像中,許多網格單元不包含任何目標。訓練時就會把這些網格里的框的“置信度”分數推到零,這往往超過了包含目標的框的梯度。從而可能導致模型不穩定,訓練早期發散。因此要減少了不包含目標的框的置信度預測的損失,使?λnoobj=0.5λ_{noobj}=0.5λnoobj?=0.5。
1.4 性能表現
(1)優點:
(2)局限:
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者【AI 菌】。
博客首頁:https://blog.csdn.net/wjinjie
本文鏈接:https://ai-wx.blog.csdn.net/article/details/107509243
未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
二、更快更準:YOLOv2
2.1 簡介
2017年,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基礎上,進行了大量改進,提出了 YOLOv2 和 YOLO9000。重點解決YOLOv1召回率和定位精度方面的不足。
YOLOv2 是一個先進的目標檢測算法,比其它的檢測器檢測速度更快。除此之外,該網絡可以適應多種尺寸的圖片輸入,并且能在檢測精度和速度之間進行很好的權衡。
相比于YOLOv1是利用全連接層直接預測Bounding Box的坐標,YOLOv2借鑒了Faster R-CNN的思想,引入Anchor機制。利用K-means聚類的方法在訓練集中聚類計算出更好的Anchor模板,大大提高了算法的召回率。同時結合圖像細粒度特征,將淺層特征與深層特征相連,有助于對小尺寸目標的檢測。
YOLO9000 使用 WorldTree 來混合來自不同資源的訓練數據,并使用聯合優化技術同時在ImageNet和COCO數據集上進行訓練,能夠實時地檢測超過9000種物體。由于 YOLO9000 的主要檢測網絡還是YOLOv2,所以這部分以講解應用更為廣泛的YOLOv2為主。
2.2 網絡結構
YOLOv2 采用 Darknet-19 作為特征提取網絡,其整體結構如下:
改進后的YOLOv2: Darknet-19,總結如下:
注:如果想了解降維的思想,可以戳戳:TF2.0深度學習實戰(六):搭建GoogLeNet卷積神經網絡,對文章中1×1卷積核降維部分細看。
為了更好的說明,這里我將 Darknet-19 與 YOLOv1、VGG16網絡進行對比:
- VGG-16:?大多數檢測網絡框架都是以VGG-16作為基礎特征提取器,它功能強大,準確率高,但是計算復雜度較大,所以速度會相對較慢。因此YOLOv2的網絡結構將從這方面進行改進。
- YOLOv1:?基于GoogLeNet的自定義網絡(具體看上周報告),比VGG-16的速度快,但是精度稍不如VGG-16。
- Darknet-19:?速度方面,處理一張圖片僅需要55.8億次運算,相比于VGG306.9億次,速度快了近6倍。精度方面,在ImageNet上的測試精度為:top1準確率為72.9%,top5準確率為91.2%。
2.3 改進方法
(1)Batch Normalization
Batch Normalization 簡稱 BN ,意思是批量標準化。2015年由 Google 研究員在論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中提出。
BN 對數據進行預處理(統一格式、均衡化、去噪等)能夠大大提高訓練速度,提升訓練效果。基于此,YOLOv2 對每一層輸入的數據都進行批量標準化,這樣網絡就不需要每層都去學數據的分布,收斂會變得更快。
BN算法實現:
在卷積或池化之后,激活函數之前,對每個數據輸出進行標準化,實現方式如下圖所示:
如上圖所示,前三行是對Batch進行數據歸一化(如果一個Batch中有訓練集每個數據,那么同一Batch內數據近似代表了整體訓練數據),第四行引入了附加參數 γ 和 β,這兩個參數的具體取值可以參考上面提到的 Batch Normalization 這篇論文。
想更深入了解 Batch Normalization 的原理和應用,可以參見我的:深度學習理論專欄——Batch Normalization
(2)引入 Anchor Box 機制
在YOLOv1中,作者設計了端對端的網路,直接對邊界框的位置(x, y, w, h)進行預測。這樣做雖然簡單,但是由于沒有類似R-CNN系列的推薦區域,所以網絡在前期訓練時非常困難,很難收斂。于是,自YOLOv2開始,引入了 Anchors box 機制,希望通過提前篩選得到的具有代表性先驗框Anchors,使得網絡在訓練時更容易收斂。
在 Faster R-CNN 算法中,是通過預測 bounding box 與 ground truth 的位置偏移值?tx,tyt_x, t_ytx?,ty?,間接得到bounding box的位置。其公式如下:
這個公式是無約束的,預測的邊界框很容易向任何方向偏移。因此,每個位置預測的邊界框可以落在圖片任何位置,這會導致模型的不穩定性。
因此 YOLOv2 在此方法上進行了一點改變:預測邊界框中心點相對于該網格左上角坐標(Cx,Cy)(C_x, C_y)(Cx?,Cy?)的相對偏移量,同時為了將bounding box的中心點約束在當前網格中,使用 sigmoid 函數將?tx,tyt_x, t_ytx?,ty??歸一化處理,將值約束在0-1,這使得模型訓練更穩定。
下圖為 Anchor box 與 bounding box 轉換示意圖,其中藍色的是要預測的bounding box,黑色虛線框是Anchor box。
YOLOv2 在最后一個卷積層輸出 13×13 的 feature map,意味著一張圖片被分成了13×13個網格。每個網格有5個anchor box來預測5個bounding box,每個bounding box預測得到5個值:tx、ty、tw、tht_x、t_y、t_w、t_htx?、ty?、tw?、th??和?tot_oto?(類似YOLOv1的confidence)。引入Anchor Box 機制后,通過間接預測得到的 bounding box 的位置的計算公式為:
置信度?tot_oto?的計算公式為:
(3)Convolution With Anchor Boxes
YOLOv1 有一個致命的缺陷就是:一張圖片被分成7×7的網格,一個網格只能預測一個類,當一個網格中同時出現多個類時,就無法檢測出所有類。針對這個問題,YOLOv2做出了相應的改進:
- 首先將YOLOv1網絡的FC層和最后一個Pooling層去掉,使得最后的卷積層的輸出可以有更高的分辨率特征。
- 然后縮減網絡,用416×416大小的輸入代替原來的448×448,使得網絡輸出的特征圖有奇數大小的寬和高,進而使得每個特征圖在劃分單元格的時候只有一個中心單元格(Center Cell)。YOLOv2通過5個Pooling層進行下采樣,得到的輸出是13×13的像素特征。
- 借鑒Faster R-CNN,YOLOv2通過引入Anchor Boxes,預測Anchor Box的偏移值與置信度,而不是直接預測坐標值。
- 采用Faster R-CNN中的方式,每個Cell可預測出9個Anchor Box,共13×13×9=1521個(YOLOv2確定Anchor Boxes的方法見是維度聚類,每個Cell選擇5個Anchor Box)。比YOLOv1預測的98個bounding box 要多很多,因此在定位精度方面有較好的改善。
(4)聚類方法選擇Anchors
Faster R-CNN 中 Anchor Box 的大小和比例是按經驗設定的,不具有很好的代表性。若一開始就選擇了更好的、更有代表性的先驗框Anchor Boxes,那么網絡就更容易學到準確的預測位置了!
YOLOv2 使用 K-means 聚類方法得到 Anchor Box 的大小,選擇具有代表性的尺寸的Anchor Box進行一開始的初始化。傳統的K-means聚類方法使用標準的歐氏距離作為距離度量,這意味著大的box會比小的box產生更多的錯誤。因此這里使用其他的距離度量公式。聚類的目的是使 Anchor boxes 和臨近的 ground truth boxes有更大的IOU值,因此自定義的距離度量公式為 :
到聚類中心的距離越小越好,但IOU值是越大越好,所以使用 1 - IOU;這樣就保證距離越小,IOU值越大。具體實現方法如下:
如下圖所示,是論文中的聚類效果,其中紫色和灰色也是分別表示兩個不同的數據集,可以看出其基本形狀是類似的。
從下表可以看出,YOLOv2采用5種 Anchor 比 Faster R-CNN 采用9種 Anchor 得到的平均 IOU 還略高,并且當 YOLOv2 采用9種時,平均 IOU 有顯著提高。說明 K-means 方法的生成的Anchor boxes 更具有代表性。為了權衡精確度和速度的開銷,最終選擇K=5。
(5)Fine-Grained Features
細粒度特征,可理解為不同層之間的特征融合。YOLOv2通過添加一個Passthrough Layer,把高分辨率的淺層特征連接到低分辨率的深層特征(把特征堆積在不同Channel中)而后進行融合和檢測。具體操作是:先獲取前層的26×26的特征圖,將其同最后輸出的13×13的特征圖進行連接,而后輸入檢測器進行檢測(而在YOLOv1中網絡的FC層起到了全局特征融合的作用),以此來提高對小目標的檢測能力。
Passthrough層與ResNet網絡的shortcut類似,以前面更高分辨率的特征圖為輸入,然后將其連接到后面的低分辨率特征圖上。前面的特征圖維度是后面的特征圖的2倍,passthrough層抽取前面層的每個2×2的局部區域,然后將其轉化為channel維度,對于26×26×512的特征圖,經Passthrough層處理之后就變成了13×13×2048的新特征圖(特征圖大小降低4倍,而channles增加4倍),這樣就可以與后面的13×13×1024特征圖連接在一起形成13×13×3072的特征圖,然后在此特征圖基礎上卷積做預測。示意圖如下:
2.4 性能表現
在VOC2007數據集上進行測試,YOLOv2在速度為67fps時,精度可以達到76.8的mAP;在速度為40fps時,精度可以達到78.6
的mAP 。可以很好的在速度和精度之間進行權衡。下圖是YOLOv1在加入各種改進方法后,檢測性能的改變。可見在經過多種改進方法后,YOLOv2在原基礎上檢測精度具有很大的提升!
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者【AI 菌】。
博客首頁:https://blog.csdn.net/wjinjie
本文鏈接:https://ai-wx.blog.csdn.net/article/details/107509243
未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
三、巔峰之作:YOLOv3
3.1 簡介
2018年,作者 Redmon 又在 YOLOv2 的基礎上做了一些改進。特征提取部分采用darknet-53網絡結構代替原來的darknet-19,利用特征金字塔網絡結構實現了多尺度檢測,分類方法使用邏輯回歸代替了softmax,在兼顧實時性的同時保證了目標檢測的準確性。
從YOLOv1到YOLOv3,每一代性能的提升都與backbone(骨干網絡)的改進密切相關。在YOLOv3中,作者不僅提供了darknet-53,還提供了輕量級的tiny-darknet。如果你想檢測精度與速度兼具,可以選擇darknet-53作為backbone;如果你希望達到更快的檢測速度,精度方面可以妥協,那么tiny-darknet是你很好的選擇。總之,YOLOv3的靈活性使得它在實際工程中得到很多人的青睞!
3.2 網絡結構
相比于 YOLOv2 的 骨干網絡,YOLOv3 進行了較大的改進。借助殘差網絡的思想,YOLOv3 將原來的 darknet-19 改進為darknet-53。論文中給出的整體結構如下:
Darknet-53主要由1×1和3×3的卷積層組成,每個卷積層之后包含一個批量歸一化層和一個Leaky ReLU,加入這兩個部分的目的是為了防止過擬合。卷積層、批量歸一化層以及Leaky ReLU共同組成Darknet-53中的基本卷積單元DBL。因為在Darknet-53中共包含53個這樣的DBL,所以稱其為Darknet-53。
為了更加清晰地了解darknet-53的網絡結構,可以看下面這張圖:
為了更好的理解此圖,下面我將主要單元進行說明:
- DBL:?一個卷積層、一個批量歸一化層和一個Leaky ReLU組成的基本卷積單元。
- res unit:?輸入通過兩個DBL后,再與原輸入進行add;這是一種常規的殘差單元。殘差單元的目的是為了讓網絡可以提取到更深層的特征,同時避免出現梯度消失或爆炸。
- resn:?其中的n表示n個res unit;所以 resn = Zero Padding + DBL + n × res unit 。
- concat:?將darknet-53的中間層和后面的某一層的上采樣進行張量拼接,達到多尺度特征融合的目的。這與殘差層的add操作是不一樣的,拼接會擴充張量的維度,而add直接相加不會導致張量維度的改變。
- Y1、Y2、Y3:?分別表示YOLOv3三種尺度的輸出。
與darknet-19對比可知,darknet-53主要做了如下改進:
- 沒有采用最大池化層,轉而采用步長為2的卷積層進行下采樣。
- 為了防止過擬合,在每個卷積層之后加入了一個BN層和一個Leaky ReLU。
- 引入了殘差網絡的思想,目的是為了讓網絡可以提取到更深層的特征,同時避免出現梯度消失或爆炸。
- 將網絡的中間層和后面某一層的上采樣進行張量拼接,達到多尺度特征融合的目的。
3.3 改進之處
YOLOv3最大的改進之處還在于網絡結構的改進,由于上面已經講過。因此下面主要對其它改進方面進行介紹:
(1)多尺度預測
為了能夠預測多尺度的目標,YOLOv3 選擇了三種不同shape的Anchors,同時每種Anchors具有三種不同的尺度,一共9種不同大小的Anchors。在COCO數據集上選擇的9種Anchors的尺寸如下圖紅色框所示:
借鑒特征金字塔網的思想,YOLOv3設計了3種不同尺度的網絡輸出Y1、Y2、Y3,目的是預測不同尺度的目標。由于在每一個尺度網格都負責預測3個邊界框,且COCO數據集有80個類。所以網絡輸出的張量應該是:N ×N ×[3?(4 + 1 + 80)]。由下采樣次數不同,得到的N不同,最終Y1、Y2、Y3的shape分別為:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]。可見參見原文:
(2)損失函數
對于神經網絡來說,損失函數的設計也非常重要。但是YOLOv3這篇文中并沒有直接給出損失函數的表達式。下面通過對源碼的分析,給出YOLOv3的損失函數表達式:
對比YOLOv1中的損失函數很容易知道:位置損失部分并沒有改變,仍然采用的是sum-square error的損失計算方法。但是置信度損失和類別預測均由原來的sum-square error改為了交叉熵的損失計算方法。對于類別以及置信度的預測,使用交叉熵的效果應該更好!
(3)多標簽分類
YOLOv3在類別預測方面將YOLOv2的單標簽分類改進為多標簽分類,在網絡結構中將YOLOv2中用于分類的softmax層修改為邏輯分類器。在YOLOv2中,算法認定一個目標只從屬于一個類別,根據網絡輸出類別的得分最大值,將其歸為某一類。然而在一些復雜的場景中,單一目標可能從屬于多個類別。
比如在一個交通場景中,某目標的種類既屬于汽車也屬于卡車,如果用softmax進行分類,softmax會假設這個目標只屬于一個類別,這個目標只會被認定為汽車或卡車,這種分類方法就稱為單標簽分類。如果網絡輸出認定這個目標既是汽車也是卡車,這就被稱為多標簽分類。
為實現多標簽分類就需要用邏輯分類器來對每個類別都進行二分類。邏輯分類器主要用到了sigmoid函數,它可以把輸出約束在0到1,如果某一特征圖的輸出經過該函數處理后的值大于設定閾值,那么就認定該目標框所對應的目標屬于該類。
3.4 性能表現
如下圖所示,是各種先進的目標檢測算法在COCO數據集上測試結果。很明顯,在滿足檢測精度差不都的情況下,YOLOv3具有更快的推理速度!
如下表所示,對不同的單階段和兩階段網絡進行了測試。通過對比發現,YOLOv3達到了與當前先進檢測器的同樣的水平。檢測精度最高的是單階段網絡RetinaNet,但是YOLOv3的推理速度比RetinaNet快得多。
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者【AI 菌】。
博客首頁:https://blog.csdn.net/wjinjie
本文鏈接:https://ai-wx.blog.csdn.net/article/details/107509243
未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
四、大神接棒:YOLOv4
4.1 簡介
今年(2020年)YOLO系列的作者Redmon在推特上發表聲明,出于道德方面的考慮,從此退出CV界。聽到此消息的我,為之震驚!本以為YOLOv3已經是YOLO系列的終局之戰。沒想到就在今年,Alexey Bochkovskiy等人與Redmon取得聯系,正式將他們的研究命名為YOLOv4。
YOLOv4對深度學習中一些常用Tricks進行了大量的測試,最終選擇了這些有用的Tricks:WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization 和 CIoU loss。
YOLOv4在傳統的YOLO基礎上,加入了這些實用的技巧,實現了檢測速度和精度的最佳權衡。實驗表明,在Tesla V100上,對MS COCO數據集的實時檢測速度達到65 FPS,精度達到43.5%AP。
YOLOv4的獨到之處在于:
- 是一個高效而強大的目標檢測網咯。它使我們每個人都可以使用 GTX 1080Ti 或 2080Ti 的GPU來訓練一個超快速和精確的目標檢測器。這對于買不起高性能顯卡的我們來說,簡直是個福音!
- 在論文中,驗證了大量先進的技巧對目標檢測性能的影響,真的是非常良心!
- 對當前先進的目標檢測方法進行了改進,使之更有效,并且更適合在單GPU上訓練;這些改進包括CBN、PAN、SAM等。
4.2 網絡結構
最簡單清晰的表示:?YOLOv4 = CSPDarknet53(主干) + SPP附加模塊(頸) + PANet路徑聚合(頸) + YOLOv3(頭部)
完整的網絡結構圖如下:
YOLOv4的網絡結構是由 CSPDarknet53、 SPP、 PANet、YOLOv3頭部等組成,下面對各部分逐一講解:
(1)CSPDarknet53
在YOLOv4中,將CSPDarknet53作為主干網絡。在了解CSPDarknet53之前,需要先介紹下CSPNet。
CSPNet來源于這篇論文:《CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN》
CSPNet開源地址:?https://github.com/WongKinYiu/CrossStagePartialNetworks
CSPNet全稱是Cross Stage Partial Network,在2019年由Chien-Yao Wang等人提出,用來解決以往網絡結構需要大量推理計算的問題。作者將問題歸結于網絡優化中的重復梯度信息。CSPNet在ImageNet dataset和MS COCO數據集上有很好的測試效果,同時它易于實現,在ResNet、ResNeXt和DenseNet網絡結構上都能通用。
CSPNet的主要目的是能夠實現更豐富的梯度組合,同時減少計算量。這個目標是通過將基本層的特征圖分成兩部分,然后通過一個跨階段的層次結構合并它們來實現的。
而在YOLOv4中,將原來的Darknet53結構換為了CSPDarknet53,這在原來的基礎上主要進行了兩項改變:
-
將原來的Darknet53與CSPNet進行結合。在前面的YOLOv3中,我們已經了解了Darknet53的結構,它是由一系列殘差結構組成。進行結合后,CSPnet的主要工作就是將原來的殘差塊的堆疊進行拆分,把它拆分成左右兩部分:主干部分繼續堆疊原來的殘差塊,支路部分則相當于一個殘差邊,經過少量處理直接連接到最后。具體結構如下:
-
使用MIsh激活函數代替了原來的Leaky ReLU。在YOLOv3中,每個卷積層之后包含一個批量歸一化層和一個Leaky ReLU。而在YOLOv4的主干網絡CSPDarknet53中,使用Mish代替了原來的Leaky ReLU。Leaky ReLU和Mish激活函數的公式與圖像如下:
(2)SPP
SPP來源于這篇論文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
SPP最初的設計目的是用來使卷積神經網絡不受固定輸入尺寸的限制。在YOLOv4中,作者引入SPP,是因為它顯著地增加了感受野,分離出了最重要的上下文特征,并且幾乎不會降低的YOLOv4運行速度。如下圖所示,就是SPP中經典的空間金字塔池化層。
在YOLOv4中,具體的做法就是:分別利用四個不同尺度的最大池化對上層輸出的feature map進行處理。最大池化的池化核大小分別為13x13、9x9、5x5、1x1,其中1x1就相當于不處理。
(3)PANet
論文鏈接:《Path Aggregation Network for Instance Segmentation》
這篇文章發表于CVPR2018,它提出的Path Aggregation Network (PANet)既是COCO2017實例分割比賽的冠軍,也是目標檢測比賽的第二名。PANet整體上可以看做是在Mask R-CNN上做多處改進,充分利用了特征融合,比如引入Bottom-up path augmentation結構,充分利用網絡淺特征進行分割;引入Adaptive feature pooling使得提取到的ROI特征更加豐富;引入Fully-conneFcted fusion,通過融合一個前背景二分類支路的輸出得到更加精確的分割結果。
下圖是PANet的示意圖,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四個部分。
- FPN發表于CVPR2017,主要是通過融合高低層特征提升目標檢測的效果,尤其可以提高小尺寸目標的檢測效果。
- Bottom-up Path Augmentation的引入主要是考慮網絡淺層特征信息對于實例分割非常重要,因為淺層特征一般是邊緣形狀等特征。
- Adaptive Feature Pooling用來特征融合。也就是用每個ROI提取不同層的特征來做融合,這對于提升模型效果顯然是有利無害。
- Fully-connected Fusion是針對原有的分割支路(FCN)引入一個前背景二分類的全連接支路,通過融合這兩條支路的輸出得到更加精確的分割結果。
在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作為參數聚合的方法,針對不同的檢測器級別從不同的主干層進行參數聚合。并且對原PANet方法進行了修改, 使用張量連接(concat)代替了原來的捷徑連接(shortcut connection)。
(4)YOLOv3 Head
在YOLOv4中,繼承了YOLOv3的Head進行多尺度預測,提高了對不同size目標的檢測性能。YOLOv3的完整結構在上文已經詳細介紹,下面我們截取了YOLOv3的Head進行分析:
YOLOv4學習了YOLOv3的方式,采用三個不同層級的特征圖進行融合,并且繼承了YOLOv3的Head。從上圖可以看出,在COCO數據集上訓練時,YOLOv4的3個輸出張量的shape分別是:(19,19,225)、(38,38,255)、(76,76,225)。這是因為COCO有80個類別,并且每一個網格對應3個Anchor boxes,而每個要預測的bounding box對應的5個值(tx、ty、tw、tht_x、t_y、t_w、t_htx?、ty?、tw?、th??、tot_oto?),所以有:3 x (80+5)=255 。
4.3 各種Tricks總結
作者將所有的Tricks可以分為兩類:
- 在不增加推理成本的前提下獲得更好的精度,而只改變訓練策略或只增加訓練成本的方法,作著稱之為 “免費包”(Bag of freebies);
- 只增加少量推理成本但能顯著提高目標檢測精度的插件模塊和后處理方法,稱之為“特價包”(Bag of specials)
下面分別對這兩類技巧進行介紹。
(1)免費包
以數據增強方法為例,雖然增加了訓練時間,但不增加推理時間,并且能讓模型泛化性能和魯棒性更好。像這種不增加推理成本,還能提升模型性能的方法,作者稱之為"免費包",非常形象。下面總結了一些常用的數據增強方法:
- 隨機縮放
- 翻轉、旋轉
- 圖像擾動、加噪聲、遮擋
- 改變亮度、對比對、飽和度、色調
- 隨機裁剪(random crop)
- 隨機擦除(random erase)
- Cutout
- MixUp
- CutMix
常見的正則化方法有:
- DropOut
- DropConnect
- DropBlock
平衡正負樣本的方法有:
- Focal loss
- OHEM(在線難分樣本挖掘)
除此之外,還有回歸 損失方面的改進:
- GIOU
- DIOU
- CIoU
(2)特價包
增大感受野技巧:
- SPP
- ASPP
- RFB
注意力機制:
- Squeeze-and-Excitation (SE)
- Spatial Attention Module (SAM)
特征融合集成:
- FPN
- SFAM
- ASFF
- BiFPN (出自于大名鼎鼎的EfficientDet)
更好的激活函數:
- ReLU
- LReLU
- PReLU
- ReLU6
- SELU
- Swish
- hard-Swish
后處理非極大值抑制算法:
- soft-NMS
- DIoU NMS
想具體了解作者通過大量實驗,選擇了哪些Tricks?可戳我上一篇文章:YOLOv4 怎么學,看完這一篇就夠了!
4.4 改進方法
除了下面已經提到的各種Tricks,為了使目標檢測器更容易在單GPU上訓練,作者也提出了5種改進方法:
(1)Mosaic
這是作者提出的一種新的數據增強方法,該方法借鑒了CutMix數據增強方式的思想。CutMix數據增強方式利用兩張圖片進行拼接,但是Mosaic使利用四張圖片進行拼接。如下圖所示:
Mosaic數據增強方法有一個優點:擁有豐富檢測目標的背景,并且在BN計算的時候一次性會處理四張圖片!
(2)SAT
SAT是一種自對抗訓練數據增強方法,這一種新的對抗性訓練方式。在第一階段,神經網絡改變原始圖像而不改變網絡權值。以這種方式,神經網絡對自身進行對抗性攻擊,改變原始圖像,以制造圖像上沒有所需對象的欺騙。在第二階段,用正常的方法訓練神經網絡去檢測目標。
(3)CmBN
CmBN的全稱是Cross mini-Batch Normalization,定義為跨小批量標準化(CmBN)。CmBN 是 CBN 的改進版本,它用來收集一個batch內多個mini-batch內的統計數據。BN、CBN和CmBN之間的區別具體如下圖所示:
(4)修改過的SAM
作者在原SAM(Spatial Attention Module)方法上進行了修改,將SAM從空間注意修改為點注意。如下圖所示,對于常規的SAM,最大值池化層和平均池化層分別作用于輸入的feature map,得到兩組shape相同的feature map,再將結果輸入到一個卷積層,接著是一個 Sigmoid 函數來創建空間注意力。
將SAM(Spatial Attention Module)應用于輸入特征,能夠輸出精細的特征圖。
在YOLOv4中,對原來的SAM方法進行了修改。如下圖所示,修改后的SAM直接使用一個卷積層作用于輸入特征,得到輸出特征,然后再使用一個Sigmoid 函數來創建注意力。作者認為,采用這種方式創建的是點注意力。
(5)修改過的PAN
作者對原PAN(Path Aggregation Network)方法進行了修改, 使用張量連接(concat)代替了原來的快捷連接(shortcut connection)。如下圖所示:
注:想具體了解原PANet網絡結構,可參考上文中的PANet介紹部分。
4.5 性能表現
如下圖所示,在COCO目標檢測數據集上,對當前各種先進的目標檢測器進行了測試。可以發現,YOLOv4的檢測速度比EfficientDet快兩倍,性能相當。同時,將YOLOv3的AP和FPS分別提高10%和12%,吊打YOLOv3!
綜合以上分析,總結出YOLOv4帶給我們的優點有:
- 與其它先進的檢測器相比,對于同樣的精度,YOLOv4更快(FPS);對于同樣的速度,YOLOv4更準(AP)。
- YOLOv4能在普通的GPU上訓練和使用,比如GTX 1080Ti和GTX 2080Ti等。
- 論文中總結了各種Tricks(包括各種BoF和BoS),給我們啟示,選擇合適的Tricks來提高自己的檢測器性能。
由于水平有限,博客中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!
相關文章推薦:
R-CNN系列算法詳解:R-CNN —》Fast R-CNN —》Faster R-CNN 進階之路
YOLOv4 怎么學,看完這一篇就夠了!
參考資料:
https://zhuanlan.zhihu.com/p/161439809
https://zhuanlan.zhihu.com/p/135980432
https://blog.csdn.net/u014380165/article/details/81273343
https://blog.csdn.net/weixin_44791964/article/details/106533581
總結
以上是生活随笔為你收集整理的YOLO系列算法精讲:从yolov1至yolov4的进阶之路(呕心沥血2万字超全整理,建议收藏!)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国银行信用卡审批通过多久发卡
- 下一篇: 老年人如何理财