深度剖析目标检测算法YOLOV4
深度剖析目標(biāo)檢測(cè)算法YOLOV4
目錄
- 簡述 yolo 的發(fā)展歷程
- 介紹 yolov3 算法原理
- 介紹 yolov4 算法原理(相比于 yolov3,有哪些改進(jìn)點(diǎn))
- YOLOV4 源代碼日志解讀
yolo 發(fā)展歷程
?
采用卷積神經(jīng)的目標(biāo)檢測(cè)算法大致可以分為兩個(gè)流派,一類是以 R-CNN 為代表的 two-stage,另一類是以 YOLO 為代表的 one-stage,
R-CNN 系列的原理:通過 ROI 提取出大約 2000 個(gè)候選框,然后每個(gè)候選框通過一個(gè)獨(dú)立的 CNN 通道進(jìn)行預(yù)測(cè)輸出。
R-CNN 特點(diǎn):準(zhǔn)確度高,速度慢,所以速度成為它優(yōu)化的主要方向。
YOLO 系列的原理:將輸入圖片作為一個(gè)整體,通過 CNN 通道進(jìn)行預(yù)測(cè)輸出。
YOLO 特點(diǎn):速度快,準(zhǔn)確度低,所以準(zhǔn)確度成為它優(yōu)化的主要方向。
經(jīng)過一系列的優(yōu)化與改進(jìn),特別是今年 4 月份推出的 YOLOV4,使得它在準(zhǔn)確度方面得到了大幅度的提升,另外,它還能達(dá)到實(shí)時(shí)檢測(cè)(在 GPU 加持的情況下)。
下圖是 YOLOV4 源代碼的頁面,github: https://github.com/AlexeyAB/darknet
?
它的 Star 達(dá)到 13400,可以說,知名度不是一般的高,在目標(biāo)檢測(cè)領(lǐng)域,好像只有 YOLOV3 超過它了,達(dá)到了 19000 ,是不是值得大家花點(diǎn)時(shí)間精力去探索一下呢 ?
這里需要說明一下的是 YOLOV3(美國大神),YOLOV4 (俄羅斯大神)作者不是同一個(gè)人,在 19 年的時(shí)候,YOLOV3 作者發(fā)表了一個(gè)聲明:有些組織將他的算法用于
軍事和窺探個(gè)人隱私方面,使得他在道德上很難接受,他將不再進(jìn)行 CV 的研究與更新。當(dāng)然,這是一個(gè)小插曲了,這里,我們看到,YOLOV4 作者更新是非常頻繁的,
commits 達(dá)到了 2000 + 。下面我們看看官方給出的實(shí)驗(yàn)結(jié)果。
?
這里是以 COCO 作為測(cè)試數(shù)據(jù)集,相比于 YOLOV3,YOLOV4 在精度方面提升了 10%,FPS(frame per second) 提升了 12%。
順便說一句,YOLOV3 的作者也是認(rèn)可 YOLOV4 的改進(jìn)的,在 YOLOV3 的官網(wǎng) https://github.com/pjreddie/darknet 也是給出了
YOLOV4 的鏈接。
yolov3 算法原理
?
這里借用某位大神畫的結(jié)構(gòu)圖,因?yàn)?YOLOV4 是在 YOLOV3 的基礎(chǔ)上改進(jìn)的,所以我們需要先介紹一下 YOLOV3,
這里可能需要一些神經(jīng)網(wǎng)絡(luò)的知識(shí),比如卷積,池化,全連接,前向傳播,反向傳播,損失函數(shù),梯度計(jì)算,權(quán)重參數(shù)更新,如果對(duì)
這些不是很清楚,可以看我之前的博客(卷積神經(jīng)網(wǎng)絡(luò)(CNN)詳解與代碼實(shí)現(xiàn) 深度學(xué)習(xí)之卷積神經(jīng)網(wǎng)絡(luò)(CNN)詳解與代碼實(shí)現(xiàn)(一) - w_x_w1985 - 博客園)。
YOLOV3 原理我在上上一篇博客(深度剖析YOLO系列的原理 深度剖析YOLO系列的原理 - w_x_w1985 - 博客園)有過介紹,
這里我就介紹一下大家容易忽略,或者是比較難理解的點(diǎn):
- 輸入圖片尺寸可變
輸入圖片尺寸是 608 * 608,當(dāng)然,這個(gè)尺寸是可以改變的,它只需要滿足是 32 的倍數(shù),因?yàn)樵诮?jīng)過后面的網(wǎng)絡(luò)結(jié)構(gòu)的時(shí)候,圖片尺寸縮小的最大倍數(shù)是 32 倍,
這可以從它的輸出 19 * 19 看出來。
- 主干網(wǎng)絡(luò)
采用的是 darknet 53 層網(wǎng)絡(luò)結(jié)構(gòu),去掉了全連接層,53 - 1 = 52
52 = 1+(1+2*1)+(1+2*2)+(1+2*8)+(1+2*8)+(1+2*4)
為什么要去掉全連接層 ?
解答:全連接的本質(zhì)是矩陣的乘法運(yùn)算,會(huì)產(chǎn)生固定尺寸的輸出,而 YOLOV3 是需要多尺寸的輸出的,所以要去掉全連接層。
CBL :表示基礎(chǔ)的卷積模塊,是由一個(gè) Conv 卷積層 + BN 批量歸一化層 + relu 非線性激活函數(shù)層組成。
為什么在 CBL 里沒有池化層 pooling ?
解答:池化層有兩種實(shí)現(xiàn)方式,最大值池化和平均值池化,他們都有一個(gè)缺點(diǎn),會(huì)造成信息的明顯丟失(相比于卷積實(shí)現(xiàn)池化的功能來說,改變滑動(dòng)窗口的步長) 。
Res Unit(殘差單元) :表示將上一層的輸出一分為二,一部分通過兩個(gè)基礎(chǔ)卷積模塊得到輸出,與另一部分進(jìn)行求和,這樣就能使得輸出的殘差不可能為 0,
從而有效的防止梯度消失或者梯度爆炸。
ResX : 是由不同的 Res Unit 組成。
多尺寸輸出:用到 2 個(gè)上采樣,注意 Concat 和 Add 的區(qū)別。
上采樣原理:以特征圖相鄰像素值來預(yù)測(cè)中間位置的像素值,然后以這個(gè)值插入到中間位置,實(shí)現(xiàn)特征圖尺寸的翻倍。
Concat : 特征圖張量的拼接,拼接后尺寸不變,深度改變。
Add :特征圖對(duì)應(yīng)位置像素值的求和,求和后的尺寸和深度不發(fā)生改變。
- 輸出
有三個(gè)輸出,19 * 19 * 255,38 * 38 * 255,76 * 76 * 255
這三個(gè)輸出有著怎樣的物理含義 ?
?
解答:將輸入圖片網(wǎng)格化,網(wǎng)格化后的大小是 19 *19, 38 * 38,76 * 76,每個(gè)網(wǎng)格化后的小方格,也就是一個(gè) grid cell,將要
預(yù)測(cè) 3 個(gè) bounding box,每個(gè) bounding box = 1 個(gè)置信度 + 4 個(gè)位置信息 + 類別總數(shù)(COCO 數(shù)據(jù)集就是 80)
為什么每個(gè) grid cell 要預(yù)測(cè) 3 個(gè) bounding box ?
解答:這樣來理解,比如說,一個(gè)人站在一輛車的前面,從遠(yuǎn)處看,這個(gè)人和這輛車中心點(diǎn)是完全重合的,但是我們能夠看清楚
人和車,但是如果中心點(diǎn)重合的對(duì)象超過 3 個(gè),那么我們很有可能對(duì)第 4 個(gè),第 5 個(gè)以及后面的對(duì)象就完全看不清楚了,
所以,這里的 3 表示對(duì)象中心點(diǎn)重疊的最大值。
bounding box 如此之多,如何確定最佳的 bounding box ?
解答:采用的 NMS(Non Maximum Suppression)非極大值抑制算法來去除重疊。
?
NMS 算法原理:> 將預(yù)測(cè)輸出的 bounding boxes 放入到左邊的列表中,以置信度來進(jìn)行降序排列,找到置信度最大的 bounding box ,
比如說這里的 dog1,將 dog1 移出左邊列表到右邊列表中;
> 遍歷左邊列表,求出每個(gè) bounding box 與 dog1 的交并比(IoU = Intersection over Union 兩個(gè)框的交集/并集),
當(dāng)然,要提前設(shè)定一個(gè)閾值(一般是 0.5),大于 0.5表示左邊 bounding box 與 dog1 有高度的重疊,將這個(gè) bounding box 去掉;
> 重復(fù)之前的操作,直至左邊列表為空,右邊列表得到的 bounding box 就是最佳的結(jié)果;
檢測(cè)匹配問題,為什么 19 * 19 => 大對(duì)象 ? 38 * 38 => 中等對(duì)象 ? 76 * 76 => 小對(duì)象 ?
解答:輸入圖片尺寸是固定的,比如說這里的 608 * 608,將它網(wǎng)格化,網(wǎng)格化就有三種情況:19 * 19,38 * 38,76 * 76,那么是不是 19 * 19 網(wǎng)格化后
的小方格的寬和高要比其他兩種要大,這也就意味著它的感受視野是最大的,所以它就能檢測(cè)出大對(duì)象,而其他兩個(gè)的對(duì)應(yīng)關(guān)系也是相同的道理。
yolov4 算法原理
?
還是借用某位大神畫的結(jié)構(gòu)圖,記不清名字了,是在抱歉。
乍一看,是不是跟 YOLOV3 長得很像,只不過比 YOLOV3 更復(fù)雜了一些,這里 YOLOV4 的作者將結(jié)構(gòu)劃分為以下四個(gè)部分:
Input,Backbone,Neck,Head,下面就來看看每個(gè)部分都做了哪些改進(jìn)。
- Input 改進(jìn)點(diǎn)
采用 Mosaic 實(shí)現(xiàn)數(shù)據(jù)增強(qiáng)。
?
Mosaic 算法原理:在輸入圖片集中隨機(jī)選取 4 張圖片進(jìn)行隨機(jī)縮放,隨機(jī)裁剪,隨機(jī)扭曲,然后將他們拼接起來,
其目的就是豐富樣本數(shù)據(jù)集。
- Backbone 改進(jìn)點(diǎn)
采用 CSPNet(Cross Stage Partial Network)網(wǎng)絡(luò)結(jié)構(gòu),它其實(shí)是在殘差網(wǎng)絡(luò)的基礎(chǔ)上發(fā)展起來的。
?
具體改進(jìn)點(diǎn):
> 用 Concat 代替 Add,提取更豐富的特征。
之前介紹過 Concat 操作后,特征圖的尺寸不變,深度會(huì)增加,而 Add 操作后尺寸和深度都不改變,從這個(gè)意義上說,用 Concat 代替 Add,就能夠提取更豐富的特征。
> 引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,降低計(jì)算量,提升速度。
為什么引入 1 * 1conv,能夠降低計(jì)算量,提升速度 ?
?
解答:這里我舉一個(gè)實(shí)例來說明,輸入圖片大小是 56 * 56 * 256,要求得到輸出大小是 28 * 28 * 512,這里就有兩種實(shí)現(xiàn)方式:
一次卷積方式,它的卷積核參數(shù)個(gè)數(shù)是 117 萬;另一種是二次卷積方式,引入了 1 * 1 卷積,它的卷積核參數(shù)個(gè)數(shù)是 62 萬,
相比于一次卷積方式,它的卷積核參數(shù)個(gè)數(shù)降低了一倍。
> 將 Base layer 分為兩部分進(jìn)行融合,提取更豐富的特征。
將 Base layer 一分為二,一部分通過類似殘差網(wǎng)絡(luò)得到的輸出與另一部分進(jìn)行 Concat 操作,將操作后的結(jié)果通過 Transition Layer。
- Backbone 改進(jìn)點(diǎn)
用 dropblock 取代 dropout
?
dropout 作用:防止過擬合,
dropout 缺點(diǎn):每次訓(xùn)練時(shí)隨機(jī)去掉的神經(jīng)元可以通過相鄰的神經(jīng)元來預(yù)測(cè),因?yàn)殡S著網(wǎng)絡(luò)層數(shù)的增加,神經(jīng)元之間的相關(guān)性是越來越強(qiáng)。
dropblock:每次訓(xùn)練時(shí)隨機(jī)去掉一整片區(qū)域,這樣就能組合更多不一樣的網(wǎng)絡(luò),從而表現(xiàn)出更好的泛化作用。
- Neck 改進(jìn)點(diǎn)
FPN(Feature pyramid networks) + PANet(Path Aggregation Network)
?
它其實(shí)是在 YOLOV3 的基礎(chǔ)上增加了一個(gè)自底向上的 PANet 結(jié)構(gòu),特征圖的尺寸是通過下采樣得到的,而下采樣是通過卷積的方式實(shí)現(xiàn)的(改變滑動(dòng)窗口的步長)。
- Head 改進(jìn)點(diǎn)
用 CIoU Loss 取代 Iou Loss
?
IoU loss 中 IoU 交并比,兩個(gè)框的交集/并集,有兩個(gè)缺點(diǎn):
> 無法反應(yīng)兩個(gè)的距離
例如 狀態(tài) 1,兩個(gè)框不相交,無論怎樣移動(dòng)兩個(gè)框,IoU = 0。
> 無法區(qū)分兩者相交的情況
例如 狀態(tài) 2 和 3,兩個(gè)框相交的情況完全不一樣,但是 IoU 相同。
?
CIoU Loss 的思想:第一步,在兩個(gè)框最外層再畫一個(gè)最小的矩形框,求出這個(gè)框的對(duì)角線的距離,這個(gè)距離就能衡量兩個(gè)框的距離;
第二步,求出兩個(gè)框中心點(diǎn)的歐式距離,這歐式距離就能衡量兩者的相交情況。
?
CIoU Loss 數(shù)學(xué)表達(dá)式如上,它能有效的解決 IoU Loss 存在的問題。
YOLOV4 源代碼日志解讀
?
- 網(wǎng)絡(luò)層數(shù):
YOLOV4 總共層數(shù)有 161 層,YOLOV3 是 106 層,網(wǎng)絡(luò)層數(shù)增加是非常明顯的。
從這個(gè)圖可以看出,YOLOV4 采用了大量的 1 * 1 卷積,之前介紹過,采用 1 * 1 卷積,是能降低計(jì)算量,提升速度的。
- 每列含義
layer : 每層操作名稱
filters :卷積核的深度
size/strd(dil):卷積核的尺寸/滑動(dòng)窗口的步長
input:輸入圖片的大小
output:輸出圖片的大小
- 代表性層的含義(需要注意的是,這里隱藏了一個(gè)前提條件 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,大家發(fā)現(xiàn)沒有,輸出特征圖的尺寸
相比于輸入特征圖的尺寸,降低了一倍,這是因?yàn)榛瑒?dòng)窗口的步長變成了 2 。
> 第 7 層 Shortcut,它其實(shí)等價(jià)于 Add 操作,也就是第 6 層的輸出與第 4 層的輸出進(jìn)行卷積,
304 * 304 * 64 & 304 * 304 * 64 => 304 * 304 * 64,輸出特征圖的尺寸和深度都沒有改變。
> 第 9 層 route 操作,它其實(shí)等價(jià)于 Concat 操作,也就是第 8 層的輸出與第 2 層的輸出進(jìn)行卷積,
304 * 304 * 64 & 304 * 304 * 64 => 304 * 304 * 128,輸出特征圖尺寸不變,深度增加,為兩個(gè)輸入特征圖深度之和。
相信大家理解了這些層的含義之后,對(duì)于后面的其他層的理解,就比較容易了,下面看看它最后的輸出:
76 * 76 * 255, 38 * 38 * 255,19 * 19 * 255,這跟之前介紹 YOLOV4 結(jié)構(gòu)圖的輸出是相一致的。
引用
深入淺出 Yolo 系列之 Yolov3&Yolov4 核心基礎(chǔ)知識(shí)完整講解 - 極市社區(qū)
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
不要讓懶惰占據(jù)你的大腦,不要讓妥協(xié)拖垮了你的人生。青春就是一張票,能不能趕上時(shí)代的快車,你的步伐就掌握在你的腳下。
總結(jié)
以上是生活随笔為你收集整理的深度剖析目标检测算法YOLOV4的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行速盈理财保本吗
- 下一篇: 目标检测算法YOLOv4详解