採用卷積神經的目標檢測算法大體能夠分爲兩個流派,一類是以 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 的連接。
這裏借用某位大神畫的結構圖,由於 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 網格化後
的小方格的寬和高要比其餘兩種要大,這也就意味着它的感覺視野是最大的,因此它就能檢測出大對象,而其餘兩個的對應關係也是相同的道理。
仍是借用某位大神畫的結構圖,記不清名字了,是在抱歉。
乍一看,是否是跟 YOLOV3 長得很像,只不過比 YOLOV3 更復雜了一些,這裏 YOLOV4 的做者將結構劃分爲如下四個部分:
Input,Backbone,Neck,Head,下面就來看看每一個部分都作了哪些改進。
採用 Mosaic 實現數據加強。
Mosaic 算法原理:在輸入圖片集中隨機選取 4 張圖片進行隨機縮放,隨機裁剪,隨機扭曲,而後將他們拼接起來,
其目的就是豐富樣本數據集。
採用 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。
用 dropblock 取代 dropout
dropout 做用:防止過擬合,
dropout 缺點:每次訓練時隨機去掉的神經元能夠經過相鄰的神經元來預測,由於隨着網絡層數的增長,神經元之間的相關性是愈來愈強。
dropblock:每次訓練時隨機去掉一整片區域,這樣就能組合更多不同的網絡,從而表現出更好的泛化做用。
FPN(Feature pyramid networks) + PANet(Path Aggregation Network)
它實際上是在 YOLOV3 的基礎上增長了一個自底向上的 PANet 結構,特徵圖的尺寸是經過下采樣獲得的,而下采樣是經過卷積的方式實現的(改變滑動窗口的步長)。
用 CIoU Loss 取代 Iou Loss
IoU loss 中 IoU 交併比,兩個框的交集/並集,有兩個缺點:
> 沒法反應兩個的距離
例如 狀態 1,兩個框不相交,不管怎樣移動兩個框,IoU = 0。
> 沒法區分二者相交的狀況
例如 狀態 2 和 3,兩個框相交的狀況徹底不同,可是 IoU 相同。
CIoU Loss 的思想:第一步,在兩個框最外層再畫一個最小的矩形框,求出這個框的對角線的距離,這個距離就能衡量兩個框的距離;
第二步,求出兩個框中心點的歐式距離,這歐式距離就能衡量二者的相交狀況。
CIoU Loss 數學表達式如上,它能有效的解決 IoU Loss 存在的問題。
YOLOV4 總共層數有 161 層,YOLOV3 是 106 層,網絡層數增長是很是明顯的。
從這個圖能夠看出,YOLOV4 採用了大量的 1 * 1 卷積,以前介紹過,採用 1 * 1 卷積,是能下降計算量,提高速度的。
layer : 每層操做名稱
filters :卷積核的深度
size/strd(dil):卷積核的尺寸/滑動窗口的步長
input:輸入圖片的大小
output:輸出圖片的大小
> 第 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
不要讓懶惰佔據你的大腦,不要讓妥協拖垮了你的人生。青春就是一張票,能不能遇上時代的快車,你的步伐就掌握在你的腳下。