深度剖析目標檢測算法YOLOV4

深度剖析目標檢測算法YOLOV4

 

目錄

 

  • 簡述 yolo 的發展歷程

  • 介紹 yolov3 算法原理

  • 介紹 yolov4 算法原理(相比於 yolov3,有哪些改進點)

  • YOLOV4 源代碼日誌解讀

 


 

 

 

yolo 發展歷程

 

 

採用卷積神經的目標檢測算法大體能夠分爲兩個流派,一類是以 R-CNN 爲表明的 two-stage,另外一類是以 YOLO 爲表明的 one-stage,html

R-CNN 系列的原理:經過 ROI 提取出大約 2000 個候選框,而後每一個候選框經過一個獨立的 CNN 通道進行預測輸出。git

R-CNN 特色:準確度高,速度慢,因此速度成爲它優化的主要方向。github

YOLO 系列的原理:將輸入圖片做爲一個總體,經過 CNN 通道進行預測輸出。算法

YOLO 特色:速度快,準確度低,因此準確度成爲它優化的主要方向。網絡

通過一系列的優化與改進,特別是今年 4 月份推出的 YOLOV4,使得它在準確度方面獲得了大幅度的提高,另外,它還能達到實時檢測(在 GPU 加持的狀況下)。函數

下圖是 YOLOV4 源代碼的頁面,github:  https://github.com/AlexeyAB/darknet測試

 

 

它的 Star 達到 13400,能夠說,知名度不是通常的高,在目標檢測領域,好像只有 YOLOV3 超過它了,達到了 19000 ,是否是值得你們花點時間精力去探索一下呢 ?優化

這裏須要說明一下的是 YOLOV3(美國大神),YOLOV4 (俄羅斯大神)做者不是同一我的,在 19 年的時候,YOLOV3 做者發表了一個聲明:有些組織將他的算法用於spa

軍事和窺探我的隱私方面,使得他在道德上很難接受,他將再也不進行 CV 的研究與更新。固然,這是一個小插曲了,這裏,咱們看到,YOLOV4 做者更新是很是頻繁的,.net

commits 達到了 2000 + 。下面咱們看看官方給出的實驗結果。

 

這裏是以 COCO 做爲測試數據集,相比於 YOLOV3,YOLOV4 在精度方面提高了 10%,FPS(frame per second) 提高了 12%。

順便說一句,YOLOV3 的做者也是承認 YOLOV4 的改進的,在 YOLOV3 的官網 https://github.com/pjreddie/darknet 也是給出了

YOLOV4 的連接。

 

yolov3 算法原理

 

  

這裏借用某位大神畫的結構圖,由於 YOLOV4 是在 YOLOV3 的基礎上改進的,因此咱們須要先介紹一下 YOLOV3,

這裏可能須要一些神經網絡的知識,好比卷積,池化,全鏈接,前向傳播,反向傳播,損失函數,梯度計算,權重參數更新,若是對

這些不是很清楚,能夠看我以前的博客(卷積神經網絡(CNN)詳解與代碼實現 http://www.javashuo.com/article/p-tuifjaoz-g.html)。

YOLOV3 原理我在上上一篇博客(深度剖析YOLO系列的原理 http://www.javashuo.com/article/p-btcodynk-dr.html)有過介紹,

這裏我就介紹一下你們容易忽略,或者是比較難理解的點:

  • 輸入圖片尺寸可變

輸入圖片尺寸是 608 * 608,固然,這個尺寸是能夠改變的,它只須要知足是 32 的倍數,由於在通過後面的網絡結構的時候,圖片尺寸縮小的最大倍數是 32 倍,

這能夠從它的輸出 19 * 19 看出來。

  • 主幹網絡

採用的是 darknet 53 層網絡結構,去掉了全鏈接層,53 - 1 = 52

52 = 1+(1+2*1)+(1+2*2)+(1+2*8)+(1+2*8)+(1+2*4)

爲何要去掉全鏈接層 ?

解答:全鏈接的本質是矩陣的乘法運算,會產生固定尺寸的輸出,而 YOLOV3 是須要多尺寸的輸出的,因此要去掉全鏈接層。

CBL :表示基礎的卷積模塊,是由一個 Conv 卷積層 + BN 批量歸一化層 + relu 非線性激活函數層組成。

爲何在 CBL 裏沒有池化層 pooling ?

解答:池化層有兩種實現方式,最大值池化和平均值池化,他們都有一個缺點,會形成信息的明顯丟失(相比於卷積實現池化的功能來講,改變滑動窗口的步長) 。

Res Unit(殘差單元) :表示將上一層的輸出一分爲二,一部分經過兩個基礎卷積模塊獲得輸出,與另外一部分進行求和,這樣就能使得輸出的殘差不可能爲 0,

                                     從而有效的防止梯度消失或者梯度爆炸。

ResX : 是由不一樣的 Res Unit 組成。

多尺寸輸出:用到 2 個上採樣,注意 Concat 和 Add 的區別。

上採樣原理:以特徵圖相鄰像素值來預測中間位置的像素值,而後以這個值插入到中間位置,實現特徵圖尺寸的翻倍。

Concat : 特徵圖張量的拼接,拼接後尺寸不變,深度改變。

Add :特徵圖對應位置像素值的求和,求和後的尺寸和深度不發生改變。

  • 輸出

有三個輸出,19 * 19 * 255,38 * 38 * 255,76 * 76 * 255

這三個輸出有着怎樣的物理含義 ?

 

解答:將輸入圖片網格化,網格化後的大小是 19 *19, 38 * 38,76 * 76,每一個網格化後的小方格,也就是一個 grid cell,將要

          預測 3 個 bounding box,每一個 bounding box = 1 個置信度 + 4 個位置信息 + 類別總數(COCO 數據集就是 80)

爲何每一個 grid cell 要預測 3 個 bounding box ?

解答:這樣來理解,好比說,一我的站在一輛車的前面,從遠處看,這我的和這輛車中心點是徹底重合的,可是咱們可以看清楚

          人和車,可是若是中心點重合的對象超過 3 個,那麼咱們頗有可能對第 4 個,第 5 個以及後面的對象就徹底看不清楚了,

          因此,這裏的 3 表示對象中心點重疊的最大值。

bounding box 如此之多,如何肯定最佳的 bounding box ?

解答:採用的 NMS(Non Maximum Suppression)非極大值抑制算法來去除重疊。

 

 

NMS 算法原理:> 將預測輸出的 bounding boxes 放入到左邊的列表中,以置信度來進行降序排列,找到置信度最大的 bounding box ,

                              好比說這裏的 dog1,將 dog1 移出左邊列表到右邊列表中;

                          > 遍歷左邊列表,求出每一個 bounding box 與 dog1 的交併比(IoU = Intersection over Union 兩個框的交集/並集),

                             固然,要提早設定一個閾值(通常是 0.5),大於 0.5表示左邊 bounding box 與 dog1 有高度的重疊,將這個 bounding box 去掉;

                          > 重複以前的操做,直至左邊列表爲空,右邊列表獲得的 bounding box 就是最佳的結果;

檢測匹配問題,爲何 19 * 19 => 大對象 ? 38 * 38 => 中等對象 ?  76 * 76 => 小對象 ?

解答:輸入圖片尺寸是固定的,好比說這裏的 608 * 608,將它網格化,網格化就有三種狀況:19 * 19,38 * 38,76 * 76,那麼是否是 19 * 19 網格化後

          的小方格的寬和高要比其餘兩種要大,這也就意味着它的感覺視野是最大的,因此它就能檢測出大對象,而其餘兩個的對應關係也是相同的道理。

 

yolov4 算法原理

 

仍是借用某位大神畫的結構圖,記不清名字了,是在抱歉。

乍一看,是否是跟 YOLOV3 長得很像,只不過比 YOLOV3 更復雜了一些,這裏 YOLOV4 的做者將結構劃分爲如下四個部分:

Input,Backbone,Neck,Head,下面就來看看每一個部分都作了哪些改進。

  • Input 改進點

採用 Mosaic 實現數據加強。

 

 Mosaic 算法原理:在輸入圖片集中隨機選取 4 張圖片進行隨機縮放,隨機裁剪,隨機扭曲,而後將他們拼接起來,

                              其目的就是豐富樣本數據集。

 

  • Backbone 改進點

採用 CSPNet(Cross Stage Partial Network)網絡結構,它實際上是在殘差網絡的基礎上發展起來的。

 

具體改進點:

        > 用 Concat 代替 Add,提取更豐富的特徵。

以前介紹過 Concat 操做後,特徵圖的尺寸不變,深度會增長,而 Add 操做後尺寸和深度都不改變,從這個意義上說,用 Concat 代替 Add,就可以提取更豐富的特徵。

       > 引入 transition layer (1 * 1conv + 2 * 2pooling),提取特徵,下降計算量,提高速度。

爲何引入 1 * 1conv,可以下降計算量,提高速度 ?

 

解答:這裏我舉一個實例來講明,輸入圖片大小是 56 * 56 * 256,要求獲得輸出大小是 28 * 28 * 512,這裏就有兩種實現方式:

          一次卷積方式,它的卷積核參數個數是 117 萬;另外一種是二次卷積方式,引入了 1 * 1 卷積,它的卷積核參數個數是 62 萬,

         相比於一次卷積方式,它的卷積核參數個數下降了一倍。

 

        > 將 Base layer 分爲兩部分進行融合,提取更豐富的特徵。

將 Base layer 一分爲二,一部分經過相似殘差網絡獲得的輸出與另外一部分進行 Concat 操做,將操做後的結果經過 Transition Layer。

  • Backbone 改進點

用 dropblock 取代 dropout

 

dropout 做用:防止過擬合,

dropout 缺點:每次訓練時隨機去掉的神經元能夠經過相鄰的神經元來預測,由於隨着網絡層數的增長,神經元之間的相關性是愈來愈強。

dropblock:每次訓練時隨機去掉一整片區域,這樣就能組合更多不同的網絡,從而表現出更好的泛化做用。

  • Neck 改進點 

FPN(Feature pyramid networks) + PANet(Path Aggregation Network)

 

 

它實際上是在 YOLOV3 的基礎上增長了一個自底向上的 PANet 結構,特徵圖的尺寸是經過下采樣獲得的,而下采樣是經過卷積的方式實現的(改變滑動窗口的步長)。

  • Head 改進點

用 CIoU Loss 取代 Iou Loss

 

 IoU loss 中 IoU 交併比,兩個框的交集/並集,有兩個缺點:

  > 沒法反應兩個的距離

例如 狀態 1,兩個框不相交,不管怎樣移動兩個框,IoU = 0。

  > 沒法區分二者相交的狀況

例如 狀態 2 和 3,兩個框相交的狀況徹底不同,可是 IoU 相同。

 

 

 

 CIoU Loss 的思想:第一步,在兩個框最外層再畫一個最小的矩形框,求出這個框的對角線的距離,這個距離就能衡量兩個框的距離;

                               第二步,求出兩個框中心點的歐式距離,這歐式距離就能衡量二者的相交狀況。

 

CIoU Loss 數學表達式如上,它能有效的解決 IoU Loss 存在的問題。

 

YOLOV4 源代碼日誌解讀

  

 

 

 

  • 網絡層數:

 YOLOV4 總共層數有 161 層,YOLOV3 是 106 層,網絡層數增長是很是明顯的。

從這個圖能夠看出,YOLOV4 採用了大量的 1 * 1 卷積,以前介紹過,採用 1 * 1 卷積,是能下降計算量,提高速度的。

  • 每列含義

layer : 每層操做名稱

filters :卷積核的深度

size/strd(dil):卷積核的尺寸/滑動窗口的步長

input:輸入圖片的大小

output:輸出圖片的大小

  • 表明性層的含義(須要注意的是,這裏隱藏了一個前提條件 padding = 1)

> 第 0 層 conv 卷積操做,表示 608 * 608 * 3  &  3 * 3 * 32 => 608 * 608 * 32,這裏 32(輸出特徵圖尺寸深度)

是由卷積核的深度決定的。

> 第 1 層 conv 仍是卷積操做,表示 608 * 608 * 32  &  3 * 3 * 64 => 304 * 304 * 64,你們發現沒有,輸出特徵圖的尺寸

相比於輸入特徵圖的尺寸,下降了一倍,這是由於滑動窗口的步長變成了 2 。

> 第 7 層 Shortcut,它其實等價於 Add 操做,也就是第 6 層的輸出與第 4 層的輸出進行卷積,

304 * 304 * 64  &  304 * 304 * 64 => 304 * 304 * 64,輸出特徵圖的尺寸和深度都沒有改變。

> 第 9 層 route 操做,它其實等價於 Concat 操做,也就是第 8 層的輸出與第 2 層的輸出進行卷積,

304 * 304 * 64  &  304 * 304 * 64 => 304 * 304 * 128,輸出特徵圖尺寸不變,深度增長,爲兩個輸入特徵圖深度之和。

相信你們理解了這些層的含義以後,對於後面的其餘層的理解,就比較容易了,下面看看它最後的輸出:

76 * 76 * 255,  38 * 38 * 255,19 * 19 * 255,這跟以前介紹 YOLOV4 結構圖的輸出是相一致的。

 

引用

https://bbs.cvmart.net/topics/2365

https://pjreddie.com/media/files/papers/YOLOv3.pdf

https://arxiv.org/pdf/2004.10934.pdf

https://arxiv.org/pdf/1911.11929v1.pdf

https://arxiv.org/pdf/1803.01534.pdf

 

 

 

 

 

 不要讓懶惰佔據你的大腦,不要讓妥協拖垮了你的人生。青春就是一張票,能不能遇上時代的快車,你的步伐就掌握在你的腳下。

相關文章
相關標籤/搜索