導(dǎo)讀
目標(biāo)檢測Yolo算法是非常經(jīng)典且應(yīng)用廣泛的算法,而在Yolo中,又分成了輸入端、網(wǎng)絡(luò)推理、輸出層,每個(gè)部分都可以延伸出很多的優(yōu)化方式,本文主要從Yolov1~v7各個(gè)版本的Backbone,Neck,Head,Tricks進(jìn)行了講解,希望對(duì)大家有幫助。
近年來YOLO系列層出不窮,更新不斷,已經(jīng)到v7版本。不能簡單用版本高低來評(píng)判一個(gè)系列的效果好壞,YOLOv1-v7不同版本各有特色,在不同場景,不同上下游環(huán)境,不同資源支持的情況下,如何從容選擇使用哪個(gè)版本,甚至使用哪個(gè)特定部分,都需要我們對(duì)YOLOv1-v7有一個(gè)全面的認(rèn)識(shí)。
故將YOLO系列每個(gè)版本都表示成下圖中的五個(gè)部分,逐一進(jìn)行解析,并將每個(gè)部分帶入業(yè)務(wù),競賽,研究等維度進(jìn)行延伸思考,探索更多可能性。
這五個(gè)部分已經(jīng)全部深入解析并撰寫成文:
【Make YOLO Great Again】YOLOv1-v7全系列大解析(Neck篇),
【Make YOLO Great Again】YOLOv1-v7全系列大解析(Head篇),
【Make YOLO Great Again】YOLOv1-v7全系列大解析(輸入側(cè)篇),
【Make YOLO Great Again】YOLOv1-v7全系列大解析(Backbone篇)以及【Make YOLO Great Again】YOLOv1-v7全系列大解析(Tricks篇),大家可按需取用~
【文章目錄】
-
YOLOv1-v7論文&&代碼大放送
-
YOLO系列中Backbone,Neck,Head,Tricks的特點(diǎn)
-
YOLOv1?Backbone,Neck,Head,Tricks解析
-
YOLOv2?Backbone,Neck,Head,Tricks解析
-
YOLOv3?Backbone,Neck,Head,Tricks解析
-
YOLOv4?Backbone,Neck,Head,Tricks解析
-
YOLOv5?Backbone,Neck,Head,Tricks解析
-
YOLOx?Backbone,Neck,Head,Tricks解析
-
YOLOv6?Backbone,Neck,Head,Tricks解析
-
YOLOv7?Backbone,Neck,Head,Tricks解析
【一】YOLOv1-v7論文&&代碼大放送
YOLOv1論文名以及論文地址:You Only Look Once:Unified, Real-Time Object Detection[1]
YOLOv1開源代碼:YOLOv1-Darkent[2]
YOLOv2論文名以及論文地址:YOLO9000:Better, Faster, Stronger[3]
YOLOv2開源代碼:YOLOv2-Darkent[4]
YOLOv3論文名以及論文地址:YOLOv3: An Incremental Improvement[5]
YOLOv3開源代碼:YOLOv3-PyTorch[6]
YOLOv4論文名以及論文地址:YOLOv4: Optimal Speed and Accuracy of Object Detection[7]
YOLOv4開源代碼:YOLOv4-Darkent[8]
YOLOv5論文名以及論文地址:無
YOLOv5開源代碼:YOLOv5-PyTorch[9]
YOLOx論文名以及論文地址:YOLOX: Exceeding YOLO Series in 2021[10]
YOLOx開源代碼:YOLOx-PyTorch[11]
YOLOv6論文名以及論文地址:YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications[12]
YOLOv6開源代碼:YOLOv6-PyTorch[13]
YOLOv7論文名以及論文地址:YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[14]
YOLOv7開源代碼:Official YOLOv7-PyTorch[15]
【二】YOLO系列中輸入側(cè),Backbone,Neck,Head,Tricks的特點(diǎn)
輸入側(cè)
YOLO系列中的輸入側(cè)主要包含了輸入數(shù)據(jù),數(shù)據(jù)增強(qiáng)算法以及一些特殊預(yù)處理操作。
輸入數(shù)據(jù)可以是圖片,也可以是視頻。
數(shù)據(jù)增強(qiáng)算法包含通用增強(qiáng)以及YOLO自帶的一些高階增強(qiáng)算法。
YOLO系列的輸入側(cè)可謂是通用性最強(qiáng)的一個(gè)部分,具備很強(qiáng)的向目標(biāo)檢測其他模型,圖像分類,圖像分割,目標(biāo)跟蹤等方向遷移應(yīng)用的價(jià)值。
并且從業(yè)務(wù),競賽,研究等角度觀察,輸入側(cè)結(jié)構(gòu)也能在這些方面比較好的融入,從容。
Backbone
YOLO系列中的Backbone結(jié)構(gòu)主要作為算法模型的一個(gè)核心特征提取器,隨著時(shí)代的變遷不斷發(fā)展。
某種程度上,YOLO系列的各個(gè)Backbone代表著當(dāng)時(shí)的高價(jià)值模型與AI行業(yè)的發(fā)展記憶,計(jì)算機(jī)視覺江湖上,名噪一時(shí)的那些“算法兵器”,它們確實(shí)來過。
YOLO系列的Backbone與輸入側(cè)一樣,是通用性非常強(qiáng)的一個(gè)部分,在不同的計(jì)算機(jī)視覺細(xì)分方向,都有廣泛的應(yīng)用。
Neck
YOLO從v3版本開始設(shè)計(jì)Neck結(jié)構(gòu),其中的特征融合思想最初在FPN(feature pyramid networks)網(wǎng)絡(luò)中提出,在YOLOv3中進(jìn)行結(jié)構(gòu)的微調(diào),最終成為YOLO后續(xù)系列不可或缺的部分。
FPN的思路劍指小目標(biāo),原來很多目標(biāo)檢測算法都是只采用高層特征進(jìn)行預(yù)測,高層的特征中語義信息比較豐富,但是分辨率較低,目標(biāo)位置比較粗略。假設(shè)在深層網(wǎng)絡(luò)中,最后的高層特征圖中一個(gè)像素可能對(duì)應(yīng)著輸出圖像的像素區(qū)域,那么小于像素的小物體的特征大概率已經(jīng)丟失。與此同時(shí),低層的特征語義信息比較少,但是目標(biāo)位置準(zhǔn)確,這是對(duì)小目標(biāo)檢測有幫助的。FPN將高層特征與底層特征進(jìn)行融合,從而同時(shí)利用低層特征的高分辨率和高層特征的豐富語義信息,并進(jìn)行了多尺度特征的獨(dú)立預(yù)測,對(duì)小物體的檢測效果有明顯的提升。
FPN結(jié)構(gòu)
FPN論文地址:Feature Pyramid Networks for Object Detection[16]
【延伸思考】
-
業(yè)務(wù):FPN具備在業(yè)務(wù)場景中的應(yīng)用價(jià)值,但還是要分場景來使用,主要在小目標(biāo)場景可以嘗試,并同時(shí)要兼顧上游數(shù)據(jù)側(cè)與下游部署側(cè)的適配。
-
競賽:FPN的思想可謂是算法競賽的一個(gè)利器,在分類,分割,檢測等任務(wù)中都能大展拳腳,進(jìn)行遷移應(yīng)用。
-
研究:FPN具備作為baseline的價(jià)值,不管是進(jìn)行拓展研究還是單純的學(xué)習(xí)FPN思想,都是提升研究能力的不錯(cuò)選擇。
Head
YOLO系列中的Head結(jié)構(gòu)主要包含了Head檢測頭,損失函數(shù)部分以及Head結(jié)構(gòu)的優(yōu)化策略。
Head檢測頭體現(xiàn)了YOLO系列“簡潔美”的思想,與two-stage檢測算法相比,YOLO取消了RPN模塊,設(shè)計(jì)了特征提取網(wǎng)絡(luò)Backbone+檢測頭Head的end-to-end整體邏輯,其對(duì)工程的友好特性讓工業(yè)界頓時(shí)開滿“YOLO花”。
YOLO系列的損失函數(shù)部分可謂是目標(biāo)檢測領(lǐng)域中的“掌上明珠”,其在業(yè)務(wù),競賽和研究等維度都有很強(qiáng)的遷移價(jià)值。
two-stage檢測算法簡明邏輯
【延伸思考】
-
業(yè)務(wù):YOLO系列的Head結(jié)構(gòu)中,不管是Head檢測頭,損失函數(shù)部分以及Head結(jié)構(gòu)的優(yōu)化策略,其在業(yè)務(wù)中都可以作為baseline進(jìn)行遷移使用。
-
競賽:YOLO系列的Head結(jié)構(gòu)在目標(biāo)檢測競賽中可以說時(shí)入場必選結(jié)構(gòu),能極大程度上縮短競賽初期的熟悉適應(yīng)成本。
-
研究:YOLO系列的Head結(jié)構(gòu)和Neck結(jié)構(gòu)一樣,具備作為baseline的價(jià)值。
Tricks
YOLO系列中使用的Tricks,從橫向角度來看,基本算是當(dāng)時(shí)的最優(yōu)Trcks;從縱向角度來看,其大部分都具備了可遷移性,強(qiáng)適應(yīng)性,能夠跟隨著我們一起進(jìn)入2020年代,并且依舊發(fā)揮余熱。
YOLO系列中使用的Tricks和Backbone以及輸入側(cè)一樣,是通用性非常強(qiáng)的一個(gè)部分,遷移應(yīng)用在業(yè)務(wù),競賽,研究等維度,可能會(huì)帶來出其不意的效果與驚喜。
【三】YOLOv1 輸入側(cè),Backbone,Neck,Head,Tricks大解析
YOLOv1作為YOLO系列的開山鼻祖,讓YOLO這個(gè)計(jì)算機(jī)視覺中的“璀璨明珠”在2015年的夏天,拉開了帷幕。
YOLOv1整體上有著樸素的邏輯,但是隱隱約約已經(jīng)為后續(xù)的YOLO發(fā)展定下了簡單實(shí)用的基調(diào)。
下面就將YOLOv1拆解,從輸入側(cè),Backbone,Head,Tricks入手,帶著大家一起學(xué)習(xí)研究。
(需要注意的是,YOLO系列中的Neck結(jié)構(gòu)在YOLOv3才出現(xiàn),故在后面的YOLOv3部分將加入Neck結(jié)構(gòu)的講解)
YOLOv1 輸入側(cè)大解析
YOLOv1在輸入側(cè)做的最多的工作是調(diào)整輸入圖像的尺寸以支持對(duì)圖像細(xì)粒度特征的挖掘與檢測。
同樣的,YOLO系列的grid邏輯(“分而治之”)也從輸入側(cè)開始展開,直到Head結(jié)構(gòu)輸出相應(yīng)結(jié)果。
YOLOv1整體結(jié)構(gòu)
YOLOv1 Backbone大解析
YOLOv1的Backbone結(jié)構(gòu)主要受啟發(fā)于GoogLeNet思想,從上面的整體結(jié)構(gòu)可以看出,模型結(jié)構(gòu)非常簡潔,卷積一卷到底。
YOLOv1的backbone結(jié)構(gòu)中使用了Leaky ReLu激活函數(shù),但并沒有引入BN層。
YOLOv1 Head大解析
YOLOv1作為YOLO系列的開山鼻祖,其Head結(jié)構(gòu)整體邏輯比較直觀,并且對(duì)后續(xù)的版本影響深遠(yuǎn)。
YOLOv1 Head結(jié)構(gòu)
YOLOv1中,圖片被劃分為??的網(wǎng)格(grid cell),每個(gè)網(wǎng)絡(luò)在Head結(jié)構(gòu)中進(jìn)行獨(dú)立檢測。
YOLOv1在Inference過程中并不是把每個(gè)單獨(dú)的網(wǎng)格作為輸入,網(wǎng)格只是用于物體ground truth中心點(diǎn)位置的分配,如果一個(gè)物體的ground truth中心點(diǎn)坐標(biāo)在一個(gè)grid cell中,那么就認(rèn)為這個(gè)grid cell就是包含這個(gè)物體,這個(gè)物體的預(yù)測就由該grid cell負(fù)責(zé)。而不是對(duì)圖片進(jìn)行切片,并不會(huì)讓網(wǎng)格的視野受限且只有局部特征。
YOLOv1的輸出是一個(gè)??的張量,?表示把輸入圖片劃分成??的網(wǎng)格,每一個(gè)網(wǎng)格的通道維度等于?,代表YOLOv1中每個(gè)網(wǎng)格能預(yù)測2個(gè)框,每個(gè)框能預(yù)測5個(gè)參數(shù)??再加上20個(gè)種類。
把上述內(nèi)容轉(zhuǎn)換成通用公式就是網(wǎng)格一共是??個(gè),每個(gè)網(wǎng)格產(chǎn)生??個(gè)檢測框,每個(gè)檢測框會(huì)經(jīng)過網(wǎng)絡(luò)最終得到相應(yīng)的bounding box。最終會(huì)得到??個(gè)bounding box,每個(gè)bounding box都包含5個(gè)預(yù)測值,分別是bounding box的中心坐標(biāo)?,bounding box的寬高??和置信度?。其中??代表網(wǎng)格中box能與物體的取得的最大IOU值。
鋪墊了這么多變量表示,到這里終于可以引出對(duì)工業(yè)界產(chǎn)生深遠(yuǎn)影響的YOLOv1的損失函數(shù),YOLO系列的后續(xù)版本的損失函數(shù)都是從這個(gè)最初的形式優(yōu)化而來。
乍一看YOLOv1的損失函數(shù)十分復(fù)雜,don't worry,接下來將進(jìn)行詳細(xì)分析。
整體上來看,YOLOv1的損失函數(shù)可以分為檢測框的回歸損失,置信度誤差損失以及分類誤差損失。
公式中第一行和第二行代表了檢測框的中心點(diǎn)和寬高的回歸損失,其中??表示第??個(gè)網(wǎng)格的第??個(gè)box是否去預(yù)測這個(gè)物體,即這個(gè)box與物體的ground truth box的IOU值和其他box相比是否是最大的。如果是,那么?,否則?,而YOLOv1中每個(gè)網(wǎng)格只有2個(gè)box,還是比較簡單的。值得注意的是寬高回歸損失中使用了開根號(hào)的操作,這是考慮到了小目標(biāo)與大目標(biāo)對(duì)應(yīng)的檢測框會(huì)存在差異,并消除這個(gè)差異。不開根號(hào)時(shí),損失函數(shù)往往更傾向于調(diào)整尺寸比較大的檢測框。例如,12個(gè)像素點(diǎn)的偏差,對(duì)于??的檢測框幾乎沒有影響,因?yàn)榇藭r(shí)的IOU值還是很大,但是對(duì)于??的小檢測框影響就很大。
公式中第三行和第四行代表了置信度誤差損失,分別是含物體的置信度誤差損失和不含物體的置信度誤差損失。當(dāng)網(wǎng)格中含有物體時(shí),,并且置信度ground truth值?;當(dāng)網(wǎng)格中不含物體時(shí),,并且置信度ground truth值?。包含物體的預(yù)測置信度??為網(wǎng)格中box與物體ground truth box能取到的最大的IOU值,這很好理解,計(jì)算邏輯也直接明了。但是不包含物體的置信度誤差損失究竟是怎么回事?don't worry,不包含物體的置信度誤差損失包含兩部分,一部分是包含物體的網(wǎng)格中的兩個(gè)box中不負(fù)責(zé)預(yù)測的那個(gè)box,另外一部分是不包含物體的網(wǎng)格中的box,讓他們都往0回歸吧!
目標(biāo)檢測中存在一個(gè)常見問題,那就是類別不均衡問題,YOLOv1中也不例外。在一張圖像中物體往往只占一小部分,大部分還是背景為主。故在置信度誤差損失中設(shè)置了??和??來平衡含物體的置信度誤差損失和不含物體的置信度誤差損失兩者的權(quán)重,讓模型更加重視含物體的置信度誤差損失。
公式中第五行代表了分類誤差損失,只有當(dāng)??時(shí)才會(huì)進(jìn)行計(jì)算。
到這里,YOLOv1損失函數(shù)的解析就告一段落了。接下來我們看一下YOLOv1Head側(cè)的優(yōu)化策略:
-
使用NMS算法,過濾掉一些重疊的檢測框。
-
同一網(wǎng)格中的不同檢測框有不同作用,也就是置信度誤差損失的設(shè)計(jì)邏輯,這樣可以增加召回率
-
Inference時(shí)使用??作為輸出置信度。使用物體的類別預(yù)測最大值??乘以最合適的預(yù)測框?,這樣也可以過濾掉一些大部分重疊的檢測框,同時(shí)考慮了檢測框與類別讓輸出更加可信。
Inference時(shí)使用??作為輸出置信度
YOLOv1 Tricks大解析
作為YOLO系列的開山之作,YOLOv1中并未用太多的Tricks,但是設(shè)計(jì)出YOLO的架構(gòu),已經(jīng)足夠偉大。
YOLOv1的缺陷:
-
由于YOLOv1每個(gè)網(wǎng)格的檢測框只有2個(gè),對(duì)于密集型目標(biāo)檢測和小物體檢測都不能很好適用。
-
Inference時(shí),當(dāng)同一類物體出現(xiàn)的不常見的長寬比時(shí)泛化能力偏弱。
-
由于損失函數(shù)的問題,定位誤差是影響檢測效果的主要原因,尤其是大小物體的處理上,還有待加強(qiáng)。
【延伸思考】
-
業(yè)務(wù):YOLOv1 輸入側(cè)邏輯非常適合作為新業(yè)務(wù)的實(shí)驗(yàn)性Baseline,快速搭建,快速試錯(cuò)。Head結(jié)構(gòu)經(jīng)過時(shí)間的考驗(yàn)與沉淀,非常適合作為簡單業(yè)務(wù)的入場baseline部分模塊進(jìn)行搭建。
-
競賽:YOLOv1 坦率來說在競賽中已不具備競爭力,但作為baseline入場模型也未嘗不可。
-
研究:YOLOv1 Head架構(gòu)可謂是YOLO系列的開山鼻祖,給后續(xù)系列搭建了baseline,不管是入門學(xué)習(xí)還是進(jìn)行擴(kuò)展研究,都是非常有價(jià)值的。
【四】YOLOv2 輸入側(cè),Backbone,Neck,Head,Tricks大解析
時(shí)隔一年,在2016年的冬天,YOLOv2來了,YOLOv2讓工業(yè)界狂喜的同時(shí),YOLO版本號(hào)迭代的周期也來開了帷幕。
YOLOv2 輸入側(cè)大解析
YOLOv2的輸入側(cè)在YOLOv1的基礎(chǔ)上引入了多尺度訓(xùn)練(Multi-Scale Training),并且優(yōu)化了預(yù)訓(xùn)練模型(High Resolution Classifier)。
多尺度訓(xùn)練(Multi-Scale Training)的邏輯是模型每訓(xùn)練一定的Epoch,改變輸入圖片的尺寸,使得模型對(duì)不同的輸入尺寸更魯棒,能夠從容地對(duì)不同尺寸的圖像進(jìn)行檢測。
論文中使用32的倍數(shù)作為輸入的尺寸,具體使用了320、352、384、416、448、480、512、544、576、608這10種尺寸。
在預(yù)訓(xùn)練模型這塊,YOLOv2使用了High Resolution Classifier思想。一般基于ImageNet預(yù)訓(xùn)練的模型的輸入尺寸都是小于的。YOLOv2使用的輸入尺寸是,比YOLOv1的要大,故預(yù)訓(xùn)練模型網(wǎng)絡(luò)需要使用大分辨率輸入在ImageNet上進(jìn)行微調(diào)。經(jīng)過這個(gè)操作,YOLOv2的mAP提升了4%。
YOLOv2 Backbone大解析
YOLOv2的Backbone結(jié)構(gòu)在YOLOv1的基礎(chǔ)上設(shè)計(jì)了Darknet-19網(wǎng)絡(luò),并引入了BN層優(yōu)化模型整體性能。
Darknet-19網(wǎng)絡(luò)結(jié)構(gòu)
Darknet-19網(wǎng)絡(luò)包含19個(gè)卷積層和5個(gè)max pooling層,整體計(jì)算量比YOLOv1中采用的GoogleNet更少,最后用average pooling層代替全連接層進(jìn)行Inference。
在YOLOv2的Backbone中加入BN層之后,使得mAP提升了2%,而BN層也成為了YOLO后續(xù)系列的標(biāo)配。
YOLOv2 Head大解析
YOLOv2的Head結(jié)構(gòu)在YOLOv1的基礎(chǔ)上進(jìn)行了網(wǎng)絡(luò)結(jié)構(gòu)和損失函數(shù)的改進(jìn),并且大名鼎鼎的anchor box也在此引入。
passthrough layer結(jié)構(gòu)
YOLOv2在YOLOv1的基礎(chǔ)上去掉了最后的全連接層,采用了卷積和anchor boxes來預(yù)測檢測框。由于使用卷積對(duì)特征圖進(jìn)行下采樣會(huì)使很多細(xì)粒度特征(Fine-Grained Features)的損失,導(dǎo)致小物體的識(shí)別效果不佳。故在YOLOv2Head側(cè)中引入了passthrough layer結(jié)構(gòu),將特征圖一分為四,并進(jìn)行concat操作,保存了珍貴的細(xì)粒度特征。
剛才提到了YOLOv2使用卷積和anchor box來輸出檢測框,那么到底anchor box機(jī)制是怎么樣的呢?
YOLOv1中每個(gè)網(wǎng)格預(yù)測兩個(gè)檢測框,并讓最合適的檢測框向ground truth框進(jìn)行回歸修正。在YOLOv2中,Head側(cè)不對(duì)檢測框的寬高進(jìn)行直接硬回歸,而是將檢測框與Anchor框的偏差(offset)進(jìn)行回歸,并且每個(gè)網(wǎng)格指定??個(gè)anchor box。在訓(xùn)練時(shí),只有最接近ground truth的檢測框進(jìn)行損失的計(jì)算。在引入anchor box后,mAP由69.5下降至69.2,原因在于每個(gè)網(wǎng)格預(yù)測的物體變多之后,召回率大幅上升,準(zhǔn)確率有所下降,總體mAP略有下降。
Dimension Clusters
在引入anchor box之后,又使用了Dimension Clusters操作,使得anchor box的寬高由聚類算法產(chǎn)生。沒錯(cuò),就是K-means算法(K-NN算法)。使用K-means算法獲得anchor box的具體細(xì)節(jié)可以在我之前的文章【三年面試五年模擬】算法工程師的獨(dú)孤九劍秘籍(第七式)中取用。YOLOv2Head側(cè)輸出的feature map大小為?,每個(gè)grid cell設(shè)置了??個(gè)anchor box預(yù)測得到??個(gè)檢測框,一共有??個(gè)檢測框,與YOLOv1相比大大提高目標(biāo)的定位準(zhǔn)確率。
優(yōu)化了anchor box預(yù)設(shè)置后,YOLOv2設(shè)計(jì)了Direct location prediction操作來支持檢測框與Anchor框的偏差(offset)回歸邏輯。與YOLOv1相比,YOLOv2中每個(gè)檢測框輸出5個(gè)偏差參數(shù)?,為了將預(yù)測框的中心點(diǎn)約束在當(dāng)前grid cell中,使用sigmoid函數(shù)??將?和?歸一化處理,將值約束在??之間,這使得模型訓(xùn)練更穩(wěn)定。
Direct location prediction整體邏輯
其中??和??代表anchor box的寬高,?和??代表grid cell左上角相對(duì)于feature map左上角的距離。
講完了網(wǎng)絡(luò)結(jié)構(gòu)的改進(jìn)和anchor box,接下來就是損失函數(shù)的改進(jìn)了:
可以看出,在計(jì)算檢測框的回歸損失時(shí),YOLOv2去掉了開根號(hào)操作,進(jìn)行直接計(jì)算。但是根據(jù)ground truth的大小對(duì)權(quán)重系數(shù)進(jìn)行修正:(這里??和??都?xì)w一化到?),這樣對(duì)于尺度較小的預(yù)測框其權(quán)重系數(shù)會(huì)更大一些,可以放大誤差,起到和YOLOv1計(jì)算平方根相似的效果。
在訓(xùn)練前期(iter < 12800),YOLOv2還會(huì)進(jìn)行??的計(jì)算,表示對(duì)anchor boxes和檢測框進(jìn)行坐標(biāo)回歸,促進(jìn)網(wǎng)絡(luò)學(xué)習(xí)到anchor的形狀。
YOLOv2 Tricks大解析
等到Y(jié)OLOv2發(fā)布時(shí),引入了當(dāng)時(shí)來說比較有創(chuàng)造性的Tricks,即設(shè)計(jì)了分類與檢測的聯(lián)合訓(xùn)練方法,使得YOLO能夠?qū)崟r(shí)檢測多達(dá)9000種目標(biāo),在這種方法下輸出的模型稱為YOLO9000。
YOLO9000聯(lián)合訓(xùn)練邏輯
YOLO9000主要在COCO和ImageNet數(shù)據(jù)集上進(jìn)行訓(xùn)練,首先在檢測數(shù)據(jù)集上訓(xùn)練一定的epoch來讓模型學(xué)習(xí)定位和檢測目標(biāo)的能力;再使用分類數(shù)據(jù)集進(jìn)行訓(xùn)練,從而擴(kuò)展模型對(duì)目標(biāo)的識(shí)別能力。
在訓(xùn)練的過程中,混合目標(biāo)檢測和分類的數(shù)據(jù)集。當(dāng)輸入是檢測數(shù)據(jù)集時(shí),對(duì)整個(gè)Loss函數(shù)計(jì)算Loss;當(dāng)輸入是分類數(shù)據(jù)集時(shí),Loss函數(shù)只計(jì)算分類Loss,其余部分Loss設(shè)為零。
YOLO9000使用的聯(lián)合訓(xùn)練不同于將Backbone在ImageNet上進(jìn)行預(yù)訓(xùn)練,聯(lián)合訓(xùn)練可以擴(kuò)充檢測識(shí)別的目標(biāo)類別。例如,當(dāng)模型檢測出車的位置后,更進(jìn)一步將其細(xì)分類別轎車、卡車、客車、自行車、三輪車等。
【延伸思考】
-
業(yè)務(wù)側(cè):YOLOv2 輸入側(cè)的多尺度訓(xùn)練思想,Backbone以及Head結(jié)構(gòu)完全可以作為baseline模型的一部分進(jìn)行業(yè)務(wù)開展。
-
競賽側(cè):YOLOv2 輸入側(cè)的多尺度訓(xùn)練思想在競賽側(cè)是一個(gè)提分利器。Head結(jié)構(gòu)中的anchor box機(jī)制,Dimension Clusters以及Direct location prediction優(yōu)化方法可以作為競賽側(cè)的提分策略。
-
研究側(cè):YOLOv2 輸入側(cè)的多尺度訓(xùn)練思想以及High Resolution Classifier和Head結(jié)構(gòu)以及損失函數(shù)具備作為baseline的價(jià)值,不管是進(jìn)行拓展研究還是單純學(xué)習(xí)思想。
【五】YOLOv3 輸入側(cè),Backbone,Neck,Head,Tricks大解析
時(shí)間來到2018年,當(dāng)時(shí)正要開始研究生的生涯,與此同時(shí),YOLOv3來了!后續(xù)YOLO系列的整體結(jié)構(gòu),都在YOLOv3中已經(jīng)定型。
下面在這里先分享一下YOLOv3的整體結(jié)構(gòu):
YOLOv3網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOv3 輸入側(cè)大解析
在YOLOv3輸入側(cè),想引入常用基礎(chǔ)數(shù)據(jù)增強(qiáng)技術(shù)和高階數(shù)據(jù)增強(qiáng)算法。
因?yàn)椴还苁荵OLO系列還是二階段目標(biāo)檢測系列;不管是目標(biāo)檢測還是圖像分類和分割,基礎(chǔ)數(shù)據(jù)增強(qiáng)技術(shù)和高階數(shù)據(jù)增強(qiáng)算法都有很強(qiáng)的實(shí)用價(jià)值。
高階數(shù)據(jù)增強(qiáng)算法:
高階數(shù)據(jù)增強(qiáng)算法
其中RandErasing將圖像的部分區(qū)域替換為隨機(jī)值,或者是訓(xùn)練集的平均像素值。
而GridMask則使用了一個(gè)網(wǎng)格掩碼,并將掩碼進(jìn)行隨機(jī)翻轉(zhuǎn),與原圖相乘,從而得到增廣后的圖像,通過超參數(shù)控制生成的掩碼網(wǎng)格的大小。
基于NAS搜索的AutoAugment在一系列圖像增強(qiáng)子策略的搜索空間中通過搜索算法找到適合特定數(shù)據(jù)集的圖像增強(qiáng)方案。針對(duì)不同類型的數(shù)據(jù)集,會(huì)包含不同數(shù)量的子策略。每個(gè)子策略中都包含兩種變換,針對(duì)每張圖像都隨機(jī)的挑選一個(gè)子策略,然后以一定的概率來決定是否執(zhí)行子策略中的每種變換方法。
其余方法的細(xì)節(jié)知識(shí),將在后續(xù)的高階數(shù)據(jù)增強(qiáng)專題文章中依次展開,大家敬請(qǐng)期待。
常用基礎(chǔ)數(shù)據(jù)增強(qiáng)技術(shù):
-
顏色變換:在色彩通道空間進(jìn)行數(shù)據(jù)增強(qiáng),比如將某種顏色通道關(guān)閉,或者改變亮度值。
-
旋轉(zhuǎn)變換:選擇一個(gè)角度,左右旋轉(zhuǎn)圖像,可以改變圖像內(nèi)容朝向。
-
添加噪聲:從高斯等分布中采樣出的隨機(jī)值矩陣加入到圖像中。
-
銳化和模糊:使用高斯算子,拉普拉斯算子等處理圖像。
-
縮放變換:圖像按照比例進(jìn)行放大和縮小并不改變圖像中的內(nèi)容。
-
平移變換:向上下左右四個(gè)維度移動(dòng)圖像。
-
翻轉(zhuǎn)變換:關(guān)于水平或者豎直的軸進(jìn)行圖像翻轉(zhuǎn)操作。
-
裁剪變換:主要有中心裁剪與隨機(jī)裁剪。
-
仿射變換:對(duì)圖像進(jìn)行一次線性變換并接上一個(gè)平移變換。
YOLOv3 Backbone大解析
YOLOv3的Backbone在YOLOv2的基礎(chǔ)上設(shè)計(jì)了Darknet-53結(jié)構(gòu)。
YOLOv3將YOLOv2的Darknet-19加深了網(wǎng)絡(luò)層數(shù),并引入了ResNet的殘差思想,也正是殘差思想讓YOLOv3將Backbone深度大幅擴(kuò)展至Darknet-53。
YOLOv3優(yōu)化了下采樣方式(無池化層結(jié)構(gòu)),采用卷積層來實(shí)現(xiàn),而YOLOv2中采用池化層實(shí)現(xiàn)。
YOLOv3 Neck大解析
YOLOv3則是較好的引入了FPN的思想,以支持后面的Head側(cè)采用多尺度來對(duì)不同size的目標(biāo)進(jìn)行檢測,越精細(xì)的grid cell就可以檢測出越精細(xì)的目標(biāo)物體。YOLOv3設(shè)置了三個(gè)不同的尺寸,分別是,和,他們之間的比例為。
YOLOv3采用全卷積的思路,在Neck結(jié)構(gòu)也不例外(YOLOv1-v2中采用池化層做特征圖的下采樣, v3中采用卷積層來實(shí)現(xiàn))。
YOLOv3 Head大解析
YOLOv3Head結(jié)構(gòu)在YOLOv2的基礎(chǔ)上引入了多尺度檢測邏輯和多標(biāo)簽分類思想,優(yōu)化了損失函數(shù)。
YOLOv3在Neck結(jié)構(gòu)的基礎(chǔ)上順勢而為融合了3個(gè)尺度,在多個(gè)尺度的融合特征圖上分別獨(dú)立做檢測。再將Anchor Box由5個(gè)增加至9個(gè),每個(gè)尺度下分配3個(gè)Anchor Box,最終對(duì)于小目標(biāo)的檢測效果提升明顯。并且多尺度+9anchor box讓YOLOv3的整體檢測性能達(dá)到了一個(gè)比較從容的level。
再說多標(biāo)簽分類思想,我大受震撼。首先什么是多標(biāo)簽分類呢?我們先對(duì)幾種常見的分類邏輯做一個(gè)對(duì)比:
-
二分類(Two-Class Classification)問題,是最簡單的分類問題,比如一個(gè)任務(wù)中只有貓和狗,每個(gè)樣本中也只有其中的一類。
-
單標(biāo)簽多分類(Multi-Class Classification)問題,指一個(gè)樣本(一個(gè)圖片或者一個(gè)檢測框)有一個(gè)標(biāo)簽,但總共的類別數(shù)是大于兩類的。目標(biāo)檢測中針對(duì)每個(gè)檢測框的分類是多分類問題。在深度學(xué)習(xí)中,使用softmax是最常用的解決方案。
-
多標(biāo)簽多分類(Multi-Label Classification)問題,指一個(gè)樣本(一個(gè)圖片或者一個(gè)檢測框)中含有多個(gè)物體或者多個(gè)label。在深度學(xué)習(xí)中,使用多個(gè)Logistic輸出是一種性價(jià)比很高的做法。
YOLOv3將YOLOv2的單標(biāo)簽分類改進(jìn)為多標(biāo)簽分類,Head結(jié)構(gòu)將用于單標(biāo)簽分類的Softmax分類器改成多個(gè)獨(dú)立的用于多標(biāo)簽分類的Logistic分類器,取消了類別之間的互斥,可以使網(wǎng)絡(luò)更加靈活。YOLOv2使用Softmax分類器,認(rèn)為一個(gè)檢測框只屬于一個(gè)類別,每個(gè)檢測框分配到概率最大的類別。但實(shí)際場景中一個(gè)檢測框可能含有多個(gè)物體或者有重疊的類別標(biāo)簽。Logistic分類器主要用到Sigmoid函數(shù),可以將輸入約束在0到1的范圍內(nèi),當(dāng)一張圖像經(jīng)過特征提取后的某一檢測框類別置信度經(jīng)過sigmoid函數(shù)約束后如果大于設(shè)定的閾值,就表示該檢測框負(fù)責(zé)的物體屬于該類別。
YOLOv3的損失函數(shù)在YOLOv2的基礎(chǔ)上進(jìn)行了改進(jìn):
YOLOv3中置信度誤差損失和分類誤差損失都使用交叉熵來表示。
YOLOv3 Tricks大解析
等到Y(jié)OLOv3發(fā)布時(shí),YOLO系列的整體架構(gòu)算是基本確定,Adam優(yōu)化器也開始逐漸流行起來。
Adam優(yōu)化器結(jié)合了AdaGrad和RMSProp兩種優(yōu)化算法的優(yōu)點(diǎn)。對(duì)梯度的一階矩估計(jì)(First Moment Estimation,即梯度的均值)和二階矩估計(jì)(Second Moment Estimation,即梯度的未中心化的方差)進(jìn)行綜合考慮,計(jì)算出更新步長。
Adam的優(yōu)勢:
-
實(shí)現(xiàn)簡單,計(jì)算高效,對(duì)內(nèi)存需求少。
-
參數(shù)的更新不受梯度的伸縮變換影響。
-
超參數(shù)具有很好的解釋性,且通常無需調(diào)整或僅需很少的微調(diào)。
-
更新的步長能夠被限制在大致的范圍內(nèi)(初始學(xué)習(xí)率)。
-
能自然地實(shí)現(xiàn)步長退火過程(自動(dòng)調(diào)整學(xué)習(xí)率)。
-
很適合應(yīng)用于大規(guī)模的數(shù)據(jù)及參數(shù)的場景。
-
適用于不穩(wěn)定目標(biāo)函數(shù)。
-
適用于梯度稀疏或梯度存在很大噪聲的問題。
Adam的實(shí)現(xiàn)原理:
【延伸思考】
-
基礎(chǔ)數(shù)據(jù)增強(qiáng)技術(shù)和高階數(shù)據(jù)增強(qiáng)算法不管是在業(yè)務(wù),競賽還是研究維度都能非常穩(wěn)定的帶來性能的提升。
-
業(yè)務(wù):YOLOv3 整體結(jié)構(gòu)在工程中非常穩(wěn)定,且久經(jīng)時(shí)間的考驗(yàn),可以作為業(yè)務(wù)baseline模型的首選。
-
競賽:YOLOv3 整體結(jié)構(gòu)在競賽中的地位和業(yè)務(wù)側(cè)同理。
-
研究:基于YOLOv3優(yōu)化而來的論文日新月異,讓人眼花繚亂,但正真價(jià)值幾何,還需要我們?nèi)ヅ袛唷?/p>
【六】YOLOv4 輸入側(cè),Backbone,Neck,Head,Tricks大解析
首先,在這里先分享一下YOLOv4的整體結(jié)構(gòu):
YOLOv4網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOv4 輸入側(cè)大解析
YOLOv4的輸入側(cè)在YOLOv3的基礎(chǔ)上,使用了Mosaic和CutMix高階數(shù)據(jù)增強(qiáng)來提升模型的整體性能。
Mosaic數(shù)據(jù)增強(qiáng)技術(shù)從經(jīng)典的CutMix優(yōu)化而來。在CutMix的邏輯中,使用兩張圖片分別選取部分像素進(jìn)行拼接,產(chǎn)生新的數(shù)據(jù)。而Mosaic則在此基礎(chǔ)上圖片數(shù)量增加到四張,并采用隨機(jī)縮放,裁剪和排布的方式進(jìn)行拼接。
Mosaic邏輯
Mosaic數(shù)據(jù)增強(qiáng)的優(yōu)點(diǎn):
-
優(yōu)化模型對(duì)小目標(biāo)的檢測效果。
-
減少訓(xùn)練算力,由于一次性可以計(jì)算4張圖片,所以Batch Size可以不用很大,也為YOLOv4在一張GPU卡上完成訓(xùn)練奠定了數(shù)據(jù)基礎(chǔ)。
-
依然是一種增強(qiáng)數(shù)據(jù)操作,讓模型的魯棒性與泛化性能更優(yōu)。
而上面提到的CutMix則從Mixup和Cutout優(yōu)化而來。
由上圖可知,Mixup將兩張圖片按比例混合,其label也按同等比例分配;Cutout則是將圖片中的部分像素區(qū)域置0,但是label不變;CutMix則是在Cutout的基礎(chǔ)上對(duì)置0的像素區(qū)域隨機(jī)填充其他圖像的部分像素值,label則按同等比例進(jìn)行分配。
其中,是二進(jìn)制矩陣,用來標(biāo)記需要裁剪的區(qū)域和保留的區(qū)域,裁剪的區(qū)域值均為,其余位置為。圖片和組合得到新樣本,最后兩個(gè)圖的label也對(duì)應(yīng)求加權(quán)和。
CutMix的優(yōu)勢:
-
由于采用填充的形式,合成的圖片不會(huì)有不自然的混合情形。
-
高價(jià)值信息增多,提升訓(xùn)練效率,優(yōu)化算法性能。
-
作為YOLOv4的Bag of freebies,其不增加模型的推理耗時(shí)。
-
增加算法的局部識(shí)別與局部定位能力。
-
在輸入側(cè),起到了類似dropout的作用。
YOLOv4 Backbone大解析
YOLOv4的Backbone在YOLOv3的基礎(chǔ)上,受CSPNet網(wǎng)絡(luò)結(jié)構(gòu)啟發(fā),將多個(gè)CSP子模塊進(jìn)行組合設(shè)計(jì)成為CSPDarknet53,并且使用了Mish激活函數(shù)。
CSPDarknet53總共有72層卷積層,遵循YOLO系列一貫的風(fēng)格,這些卷積層都是大小,步長為2的設(shè)置,能起到特征提取與逐步下采樣的作用。
CSP子模塊主要解決了由于梯度信息重復(fù)導(dǎo)致的計(jì)算量龐大的問題。
CSP模塊不僅僅是一個(gè)子結(jié)構(gòu),更是一個(gè)處理思想,可以和ResNet、ResNext、DenseNet、EfficientNet等網(wǎng)絡(luò)結(jié)合使用。
DenseNet結(jié)構(gòu)與CSP模塊結(jié)構(gòu)
上圖左側(cè)是DenseNet的結(jié)構(gòu),它進(jìn)行反向傳播時(shí)會(huì)有大量的重復(fù)計(jì)算,而右側(cè)的圖是CSP模塊結(jié)構(gòu),它將基礎(chǔ)層的特征圖分成兩部分,一部分直接與該階段的末尾concat相連,另一部分經(jīng)過局部Dense模塊,從而既能保留Dense模塊的特征復(fù)用,又能截?cái)嗵荻攘鳎苊獯罅康闹貜?fù)計(jì)算,同時(shí)可以保證準(zhǔn)確率。
總的來說,CSP模塊解決了三個(gè)方面的問題:
-
提升模型的學(xué)習(xí)能力,同時(shí)使模型輕量化。
-
降低計(jì)算瓶頸,提高硬件利用率。
-
降低模型的內(nèi)存占用。
CSP模塊邏輯也可以遷移到其他Backbone網(wǎng)絡(luò),例如優(yōu)化ResNet以提升性能:
ResNet的CSP化
CSPNet論文地址:CSPNet[17]
YOLOv4論文中通過消融實(shí)驗(yàn)發(fā)現(xiàn)使用Mish激活函數(shù)會(huì)提升性能,于是在Backbone中將其使用。(注:除Backbone以外的網(wǎng)絡(luò)結(jié)構(gòu)依舊使用LeakyReLU激活函數(shù))
Mish激活函數(shù)消融實(shí)驗(yàn)
Mish激活函數(shù)的示意圖如下,其有三個(gè)主要特征:
-
無上界有下界。Mish向上無邊界避免了由于封頂而導(dǎo)致的梯度飽和,加快訓(xùn)練過程。向下有邊界有助于實(shí)現(xiàn)強(qiáng)正則化效果。
-
非單調(diào)函數(shù)。允許其在負(fù)半軸有穩(wěn)定的微小負(fù)值,從而使梯度流更穩(wěn)定。與ReLU負(fù)半軸的硬零邊界相比,其梯度更平滑。
-
無窮連續(xù)性與光滑性。具有較好的泛化能力,提高訓(xùn)練結(jié)果的質(zhì)量。
Mish激活函數(shù)
Mish激活函數(shù)的表達(dá)式:
Mish激活函數(shù)論文地址:Mish激活函數(shù)[18]
YOLOv4 Neck大解析
YOLOv4的Neck結(jié)構(gòu)主要包含了SPP模塊和PAN模塊。
SPP模塊在YOLOv3_SPP.cfg中率先展現(xiàn),但是在YOLOv4中則成為了一個(gè)標(biāo)配。SPP模塊包含3個(gè)最大池化層,其滑動(dòng)核(sliding kernel)尺寸分別是和,并通過Padding操作,使每個(gè)最大池化層的輸出特征圖不變,用于Concat融合操作。
SPP模塊代替了卷積層后的常規(guī)池化層,可以增加感受野,更能獲取多尺度特征,訓(xùn)練速度也讓人滿意。Yolov4論文中使用的圖像在COCO目標(biāo)檢測任務(wù)進(jìn)行實(shí)驗(yàn),SPP模塊能以0.5%的額外計(jì)算代價(jià)將AP50提升2.7%。
SPP模塊
SPP模塊論文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition[19]
PAN模塊對(duì)不同層次的特征進(jìn)行瘋狂融合,其在FPN模塊的基礎(chǔ)上增加了自底向上的特征金字塔結(jié)構(gòu),保留了更多的淺層位置特征,將整體特征提取能力進(jìn)一步提升。
在引入YOLOv4時(shí),特征圖最后的融合操作相比于原論文發(fā)生了變化,從add操作改為concat操作,增加了特征圖的通道數(shù):
PAN模塊論文:Path Aggregation Network for Instance Segmentation[20]
YOLOv4 Head大解析
YOLOv4的Head結(jié)構(gòu)沿用了YOLOv3的整體架構(gòu),并引入了CIOU Loss和DIOU NMS來提升Head結(jié)構(gòu)的整體性能。
在YOLOv3中,使用MSE(均方誤差)損失函數(shù)對(duì)檢測框的中心點(diǎn)以及寬高坐標(biāo)進(jìn)行優(yōu)化。在MSE損失函數(shù)的邏輯中,將檢測框的中心點(diǎn)和寬高坐標(biāo)作為獨(dú)立的變量對(duì)待,但是實(shí)際上他們之間是有關(guān)聯(lián)的。所以一個(gè)直觀的解決方案是使用IOU損失代替MSE損失。
YOLOv4論文中依次提到了IOU Loss,GIOU Loss,DIOU Loss以及CIOU Loss。其中IOU Loss是其他Loss的基石,也最為簡單,公式如下:
其中??代表檢測框,?代表ground truth,?代表兩者的交并比。
IOU Loss思想簡潔明了,但存在兩個(gè)問題:
-
當(dāng)檢測框和ground truth不相交時(shí),會(huì)使IOU=0,從而無法反應(yīng)兩個(gè)框距離的遠(yuǎn)近,進(jìn)而導(dǎo)致IOU Loss不可導(dǎo)。
-
當(dāng)兩個(gè)檢測框大小相同,IOU也相同時(shí),IOU Loss無法區(qū)分兩者位置的差異。
IOU Loss問題示意圖
而GIOU Loss能改進(jìn)這些問題,其在檢測框與ground truth之外映射一個(gè)最小外接矩形來緩解IOU Loss存在的問題,其公式和圖解如下:
其中??代表最小外接矩形,最后一項(xiàng)代表使用差集來進(jìn)行約束與懲罰。
GIOU Loss圖解
但出現(xiàn)上圖右側(cè)的情況時(shí),GIOU Loss被打回原形。
DIOU Loss在GIOU Loss基礎(chǔ)上提出了中心點(diǎn)距離的概念,來改進(jìn)GIOU Loss被打回原形的問題。
DIOU Loss圖解
對(duì)ground truth和檢測框的中心點(diǎn)進(jìn)行度量,引入位置信息的同時(shí)加快了損失函數(shù)的收斂,其公式如下:
但是DIOU Loss仍存在檢測框長寬比帶來的新問題:
DIOU Loss問題示意圖
最后,就是YOLOv4中使用的CIOU Loss登場了。CIOU Loss在DIOU Loss的基礎(chǔ)上考慮了檢測框長寬比的因素,將檢測框回歸損失的三大邏輯:重疊面積、中心點(diǎn)距離,長寬比進(jìn)行了有效整合,其公式如下:
其中??代表了長寬比一致性的參數(shù):
在使用了CIOU Loss之后,YOLOv4的整體損失函數(shù)如下所示:
介紹完YOLOv4的CIOU Loss以及整體損失函數(shù),接下來我們來介紹YOLOv4對(duì)NMS操作的優(yōu)化。
YOLOv4改進(jìn)了YOLOv1-v3中使用的傳統(tǒng)NMS操作,使用了DIOU思想計(jì)算“IOU”值,進(jìn)一步優(yōu)化了后處理效果。CIOU思想在訓(xùn)練中有很大作用,但是在Inference過程中,并沒有g(shù)round truth的信息,所以使用DIOU足矣,且能減少計(jì)算量。
YOLOv4 Tricks大解析
YOLOv4在YOLOv3的基礎(chǔ)上,設(shè)計(jì)使用了SAT,CmBN和Label Smoothing等Tricks。
YOLOv4中的SAT(self adversarial training)?使用基于FGSM原理的梯度攻擊技術(shù),生成對(duì)抗樣本進(jìn)行對(duì)抗訓(xùn)練。
首先,什么是對(duì)抗樣本呢?對(duì)抗樣本是在原圖像中增加擾動(dòng)噪聲生成,如上圖所示。對(duì)抗樣本容易使得模型輸出錯(cuò)誤判斷,這給模型的魯棒性造成了重大挑戰(zhàn)。
打不過,就加入它。秉持著這個(gè)原則,我們?cè)谟?xùn)練時(shí)將對(duì)抗樣本加入訓(xùn)練集一起訓(xùn)練,即為對(duì)抗訓(xùn)練。進(jìn)行對(duì)抗訓(xùn)練能擴(kuò)充訓(xùn)練集的可能性,使得數(shù)據(jù)集逼近我們想要的數(shù)據(jù)分布,訓(xùn)練后的模型魯棒性和泛化性能也大大增強(qiáng)。
生成對(duì)抗樣本的方法主要分為三種,具體邏輯如下圖所示。
CmBN(Cross mini-Batch Normalization)是CBN的修改版。
CBN主要用來解決在Batch-Size較小時(shí),BN的效果不佳問題。CBN連續(xù)利用多個(gè)迭代的數(shù)據(jù)來變相擴(kuò)大Batch-Size從而改進(jìn)模型的效果。(每次迭代時(shí)計(jì)算包括本次迭代的前四個(gè)迭代后統(tǒng)一計(jì)算整體BN)
而CmBN是獨(dú)立利用多個(gè)mini-batch內(nèi)的數(shù)據(jù)進(jìn)行BN操作。(每四個(gè)迭代后統(tǒng)一計(jì)算一次整體BN)
Label Smooth可以看作是一種防止過擬合的正則化方法。
其主要是在One-Hot標(biāo)簽中加入噪聲,減少訓(xùn)練時(shí)GroundTruth在計(jì)算損失函數(shù)的權(quán)重,來達(dá)到防止過擬合的作用,增強(qiáng)模型的泛化能力。
通常參數(shù)設(shè)置如下圖中的比例即可。
【延伸思考】
-
YOLOv4中的輸入側(cè)和Tricks具備在業(yè)務(wù),競賽以及研究中進(jìn)行實(shí)驗(yàn)的價(jià)值。
-
業(yè)務(wù):YOLOv4 Backbone中使用的CSP思想可以方便地與業(yè)務(wù)場景相結(jié)合。Neck結(jié)構(gòu)和Head中提出的CIOU Loss和DIOU NMS可以作為工程基線模型的首選。
-
競賽:YOLOv4 Backbone中提到的CSP結(jié)構(gòu)和Mish激活函數(shù)在競賽中是比較有效的Tricks。Neck結(jié)構(gòu)可以作為競賽的入場結(jié)構(gòu)。Head中提出的CIOU Loss和DIOU NMS在競賽中的依舊是提分利器。
-
研究:YOLOv4 整體結(jié)構(gòu)具備作為研究Baseline的價(jià)值。
【七】YOLOv5 輸入側(cè),Backbone,Neck,Head,Tricks大解析
同樣的,在這里先分享一下YOLOv5的整體結(jié)構(gòu):
YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOv5 輸入側(cè)大解析
YOLOv5的輸入側(cè)同樣使用了Mosaic高階數(shù)據(jù)增強(qiáng)策略,并增加自適應(yīng)圖像調(diào)整策略。
值得一提的是,正是Mosaic論文的作者提出了YOLOv5,并且YOLOv5的輸入側(cè)做了很多工程優(yōu)化,對(duì)工業(yè)界非常友好。
而自適應(yīng)圖像調(diào)整策略可以優(yōu)化常規(guī)圖像縮放填充引入過多無效信息導(dǎo)致Inference耗時(shí)增加的問題。其邏輯主要是計(jì)算圖像原生尺寸與輸入尺寸的縮放比例,并獲得縮放后的圖像尺寸,最后再進(jìn)行自適應(yīng)填充獲得最后的輸入圖像,具體代碼邏輯可以在datasets.py的letterbox函數(shù)中查看。
YOLOv5 Backbone大解析
YOLOv5的Backbone同樣使用了YOLOv4中使用的CSP思想。
值得一提的是,YOLOv5最初版本中會(huì)存在Focus結(jié)構(gòu),在YOLOv5第六版開始后,就舍棄了這個(gè)結(jié)構(gòu)改用,=的常規(guī)卷積,其產(chǎn)生的參數(shù)更少,效果更好。
Focus結(jié)構(gòu)
YOLOv5 Neck大解析
由于YOLOv5在YOLOv4發(fā)布之后沒多久就開源了,且并沒有論文的發(fā)表,創(chuàng)新性部分一直受到熱議。
YOLOv5的Neck結(jié)構(gòu)也使用了SPP模塊和PAN模塊,但是在PAN模塊進(jìn)行融合后,將YOLOv4中使用的常規(guī)CBL模塊替換成借鑒CSPnet設(shè)計(jì)的CSP_v5結(jié)構(gòu),加強(qiáng)網(wǎng)絡(luò)特征融合的能力。
YOLOv5 Head大解析
YOLOv5的Head結(jié)構(gòu)在YOLOv4的基礎(chǔ)上引入了Auto Learning Bounding Box Anchors(自適應(yīng)anchor box)和鄰域正負(fù)樣本分配策略。
YOLOv5的anchor box是自適應(yīng)于訓(xùn)練數(shù)據(jù)的,會(huì)根據(jù)不同的訓(xùn)練數(shù)據(jù)自動(dòng)學(xué)習(xí)適配相應(yīng)的anchor box。代碼中具體的對(duì)應(yīng)函數(shù)是check_anchor函數(shù)。
由于增加高質(zhì)量正樣本檢測框可以顯著加速收斂,故YOLOv5設(shè)計(jì)了相應(yīng)的鄰域正負(fù)樣本分配策略,其主要流程如下:
-
將ground truth與當(dāng)前feature map中的anchor box進(jìn)行比較,如果ground truth與anchor box的寬高比例都處在?,那么這個(gè)ground truth就能與當(dāng)前featuer map相匹配。
-
將當(dāng)前feature map中的ground truth分配給對(duì)應(yīng)的grid cell。將這個(gè)grid cell分為四個(gè)象限,針對(duì)與當(dāng)前feature map匹配的ground truth,會(huì)計(jì)算該ground truth處于四個(gè)象限中的哪一個(gè),并將鄰近的兩個(gè)grid cell中的檢測框也作為正樣本。如下圖所示,若ground truth偏向于右上角的象限,就會(huì)將ground truth所在grid cell的上面和右邊的grid cell中的檢測框也作為正樣本。
YOLOv5鄰域正負(fù)樣本分配策略
比起yolov4中一個(gè)ground truth只能匹配一個(gè)正樣本,YOLOv5能夠在多個(gè)grid cell中都分配到正樣本,有助于訓(xùn)練加速和正負(fù)樣本平衡。
YOLOv5 Tricks解析
YOLOv5中使用的Tricks基本上和YOLOv4一致,并在此基礎(chǔ)上引入了更多的工程優(yōu)化邏輯。
YOLOv5通過不同的訓(xùn)練參數(shù)配置,用來獲得不同復(fù)雜度的模型。
YOLOv5模型家族
除此之外,YOLOv5還嘗試了混合精度訓(xùn)練和模型EMA(Exponential Moving Average)策略。
混合精度訓(xùn)練能在盡可能減少精度損失的情況下利用FP16加速訓(xùn)練,并使用FP16存儲(chǔ)模型權(quán)重,在減少占用內(nèi)存的同時(shí)起到了加速訓(xùn)練的效果。
模型EMA(Exponential Moving Average)策略將模型近期不同epoch的參數(shù)做平均,提高模型整體檢測性能以及魯棒性。
【延伸思考】
-
YOLOv5 整體結(jié)構(gòu)的易用性使得其不管在業(yè)務(wù),競賽還是研究中都非常友好,且其github庫更新頻率讓人敬佩。YOLOv5可以說是YOLO系列在工業(yè)界用的最多最廣泛的一個(gè)分支,因?yàn)槠涫荘ytorch架構(gòu)的,減少了工業(yè)界人員對(duì)Darknet不熟悉不從容的麻煩。
【八】YOLOx 輸入側(cè),Backbone,Neck,Head,Tricks大解析
首先,在這里先分享一下YOLOx的整體結(jié)構(gòu):
YOLOx網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOx 輸入側(cè)大解析
YOLOx的輸入側(cè)在YOLOv5的基礎(chǔ)上摒棄了預(yù)訓(xùn)練邏輯,并使用Mosaic和MixUp高階數(shù)據(jù)增強(qiáng)算法。
MixUp最初應(yīng)用在分類任務(wù)上,將兩張圖片通過設(shè)定的融合系數(shù)進(jìn)行融合,兩個(gè)圖片上的label也對(duì)應(yīng)融合。
MixUp邏輯
由于Mosaic和MixUp高階數(shù)據(jù)增強(qiáng)算法已經(jīng)足夠強(qiáng)大,在這種情況下ImageNet預(yù)訓(xùn)練并不能帶來有效增益,故YOLOx摒棄了預(yù)訓(xùn)練邏輯,并從頭訓(xùn)練。
YOLOx Backbone大解析
YOLOx的Backbone沿用了YOLOv3的Backbone結(jié)構(gòu),故在此不在展開介紹。
YOLOx Neck大解析
YOLOx的Neck依然使用了YOLOv3的結(jié)構(gòu),并且使用了SPP模塊。
YOLOx Head大解析
YOLOx的Head結(jié)構(gòu)在YOLOv5的基礎(chǔ)上在網(wǎng)絡(luò)結(jié)構(gòu)中引入了Decoupled Head,并使用anchor-free思想和SimOTA正負(fù)樣本分配策略進(jìn)行損失函數(shù)的計(jì)算與優(yōu)化。
YOLOx使用了三個(gè)Decoupled Head(解耦頭),分別聚焦cls(分類信息),reg(檢測框信息)和IOU(置信度信息)。常規(guī)的檢測頭在特征的表達(dá)與學(xué)習(xí)能力上比起Decoupled Head有所欠缺,并且Decoupled Head模塊能加快模型的收斂速度。
Decoupled Head(解耦頭)與常規(guī)檢測頭的效果對(duì)比
除此之外,YOLOx還使用anchor-free思想,比起YOLO系列中常規(guī)的anchor-based,在Head側(cè)可以減少約??的參數(shù)。比起anchor-based方法使用先驗(yàn)知識(shí)設(shè)計(jì)anchor尺寸,anchor-free思想將感受野作為“anchor”信息。上述三個(gè)Decoupled Head中最上面的分支對(duì)應(yīng)著大anchor框,中間的分支對(duì)應(yīng)著中等anchor框最下面的分支對(duì)應(yīng)著小anchor框。最后的輸出將這個(gè)三個(gè)分支融合成一個(gè)??的特征向量。
接下來就是介紹YOLOx的正負(fù)樣本分配策略了,我們知道目標(biāo)檢測場景一張圖像中往往負(fù)樣本占絕大多數(shù),而正樣本只是少數(shù)。為了獲得更多高質(zhì)量的正樣本,YOLOx中設(shè)計(jì)了樣本初篩+SimOTA邏輯。
在樣本初篩中,有兩種方法來篩選正樣本:
-
根據(jù)中心點(diǎn)判斷:找到中心點(diǎn)落在ground truth框中的所有anchor box。
-
根據(jù)檢測框判斷:以ground truth中心點(diǎn)作為基準(zhǔn),繪制一個(gè)邊長為5的正方形,找到中心點(diǎn)落地這個(gè)正方形中的所有anchor box。
經(jīng)過初篩之后,再使用SimOTA進(jìn)行精細(xì)化篩選。其主要流程如下:
-
通過上面提到的樣本初篩方法,獲取正樣本,同時(shí)獲取它們的特征信息(cls,reg,IOu)。
-
計(jì)算正樣本與ground truth的Reg Loss和Cls Loss,并將它們加權(quán)相加,Reg和Cls的權(quán)重為?。(loss aware)
-
通過每個(gè)ground truth的檢測樣本來確定其能分配到的高價(jià)值正樣本數(shù)(Dynamic K),其邏輯是獲取與當(dāng)前ground truth的IOU值前10的檢測框,并將它們求和并取整,計(jì)算出來的整數(shù)就作為當(dāng)前ground truth的正樣本數(shù)“容量”。
-
確定每個(gè)ground truth的Dynamic K個(gè)正樣本,其邏輯是選取步驟2中加權(quán)Loss最小的前K個(gè)樣本作為正樣本。
-
共用正樣本去重,其邏輯是如果一個(gè)檢測框被兩個(gè)及以上的ground truth認(rèn)作正樣本,那么再次使用加權(quán)Loss進(jìn)行評(píng)判,將這個(gè)檢測框分給加權(quán)Loss最小的那個(gè)ground truth,作為其獨(dú)有的正樣本。
YOLOv5的正負(fù)樣本分配策略是基于鄰域匹配,并通過跨網(wǎng)格匹配策略增加正樣本數(shù)量,從而使得網(wǎng)絡(luò)快速收斂,但是該方法屬于靜態(tài)分配方法,并不會(huì)隨著網(wǎng)絡(luò)訓(xùn)練的過程而調(diào)整。YOLOx使用的SimOTA能夠算法動(dòng)態(tài)分配正樣本,進(jìn)一步提高檢測精度。而且比起OTA由于使用了Sinkhorn-Knopp算法導(dǎo)致訓(xùn)練時(shí)間加長,SimOTA算法使用Top-K近似策略來得到樣本最佳匹配,大大加快了訓(xùn)練速度。
YOLOx Tricks解析
YOLOx使用了YOLOv5中提到的模型EMA(Exponential Moving Average)策略,并且使用余弦退火學(xué)習(xí)率優(yōu)化訓(xùn)練過程。
余弦退火學(xué)習(xí)率衰策略(CosineAnnealingLR)使得學(xué)習(xí)率呈周期性變化,但我們通常取它的一個(gè)余弦周期來完成整個(gè)訓(xùn)練過程。
另外,固定步長衰減(StepLR),多步長衰減(MultiStepLR),指數(shù)衰減(ExponentialLR)等都是經(jīng)典實(shí)用的學(xué)習(xí)率衰減策略。
固定步長衰減在每隔一定的步長或者epoch對(duì)學(xué)習(xí)率進(jìn)行一定衰減,而多步長衰減策略比起固定步長衰減則更加靈活,它可以在不同階段使用不同強(qiáng)度和頻率的衰減策略。指數(shù)衰減策略是使用指數(shù)邏輯對(duì)學(xué)習(xí)率進(jìn)行衰減。
【延伸思考】
YOLOx 整體結(jié)構(gòu)給業(yè)務(wù),競賽以及研究提供了一些新思路,一定的落地價(jià)值。本人也很想知道YOLOv7引入Decoupled Head會(huì)是什么樣的效果。
【九】YOLOv6 輸入側(cè),Backbone,Neck,Head,Tricks大解析
首先,在這里先分享一下YOLOv6的整體結(jié)構(gòu):
YOLOv6網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOv6 輸入側(cè)大解析
YOLOv6的輸入側(cè)沿用了YOLOv5的整體邏輯,并沒有引入新的Tricks,故就不再展開贅述。
YOLOv6 Backbone大解析
YOLOv6的Backbone結(jié)構(gòu)在YOLOv5的基礎(chǔ)上,設(shè)計(jì)了EfficientRep Backbone結(jié)構(gòu)。
和YOLOv5的Backbone相比,YOLOv6的Backbone不但能夠高效利用硬件算力,而且還具有較強(qiáng)的表征能力。
YOLOv6的Backbone中將普通卷積都替換成了RepConv結(jié)構(gòu)。同時(shí),在RepConv基礎(chǔ)上設(shè)計(jì)了RepBlock結(jié)構(gòu),其中RepBlock中的第一個(gè)RepConv會(huì)做channel維度的變換和對(duì)齊。
另外,YOLOv6將SPPF優(yōu)化設(shè)計(jì)為更加高效的SimSPPF,增加特征重用的效率。
SimSPPF結(jié)構(gòu)
YOLOv6 Neck大解析
YOLOv6的Neck結(jié)構(gòu)受到硬件感知神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)思想的啟發(fā),基于RepVGG style設(shè)計(jì)了可重參數(shù)化、更高效的Rep-PAN。
YOLOv6 Neck結(jié)構(gòu)
硬件感知神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)的思想基于硬件的特性、推理框架/編譯框架的特點(diǎn),以硬件和編譯友好的結(jié)構(gòu)作為設(shè)計(jì)原則,在網(wǎng)絡(luò)構(gòu)建時(shí),綜合考慮硬件計(jì)算能力、內(nèi)存帶寬、編譯優(yōu)化特性、網(wǎng)絡(luò)表征能力等,進(jìn)而獲得又快又好的網(wǎng)絡(luò)結(jié)構(gòu)。
Rep-PAN在PAN模塊基礎(chǔ)上,引入RepVGG style的RepBlock替換了YOLOv5中使用的CSP-Block,同時(shí)對(duì)整體Neck中的算子進(jìn)行了調(diào)整,目的是在硬件上達(dá)到高效推理的同時(shí),保持較好的多尺度特征融合能力。
RepVGG論文:RepVGG: Making VGG-style ConvNets Great Again[21]
YOLOv6 Head大解析
YOLOv6的Head結(jié)構(gòu)和YOLOx一樣使用Anchor-free邏輯和SimOTA標(biāo)簽分配策略,并在其基礎(chǔ)上改進(jìn)了Decoupled Head(解耦檢測頭)結(jié)構(gòu),在損失函數(shù)中引入了SIoU邊界框回歸損失。
YOLOv6依然采用了Decoupled Head結(jié)構(gòu),并對(duì)其進(jìn)行了精簡設(shè)計(jì)。YOLOX的檢測頭雖然提升了檢測精度,但一定程度上增加了網(wǎng)絡(luò)延時(shí)。YOLOv6采用Hybrid Channels策略重新設(shè)計(jì)了一個(gè)更高效的Decoupled Head結(jié)構(gòu),在維持精度的同時(shí)降低了延時(shí),緩解了Decoupled Head中??卷積帶來的額外延時(shí)開銷。
為了進(jìn)一步提升回歸精度,YOLOv6使用了SIoU檢測框回歸損失函數(shù)來優(yōu)化網(wǎng)絡(luò)的學(xué)習(xí)過程。
YOLOv4中的CIoU Loss雖然考慮到檢測框與ground truth之間的重疊面積、中心點(diǎn)距離,長寬比這三大因素,但是依然缺少了對(duì)檢測框與ground truth之間方向的匹配性的考慮。SIoU Loss通過引入了所需回歸之間的向量角度,重新定義了距離損失,有效降低了回歸的自由度,加快網(wǎng)絡(luò)收斂,進(jìn)一步提升了回歸精度。
SIOU Loss論文地址:SIoU Loss: More Powerful Learning for Bounding Box Regression[22]
YOLOv6 Tricks大解析
YOLOv6進(jìn)行了很多蒸餾方向上的嘗試。
比如Self-distillation,Reparameterizing Optimizer,使用 Channel-wise Distillation進(jìn)行量化感知訓(xùn)練等方法,進(jìn)一步加強(qiáng)模型的整體性能。
【延伸思考】
-
業(yè)務(wù):YOLOv6 Backbone可以高效用于業(yè)務(wù)向的部署端。Neck結(jié)構(gòu)使用了端側(cè)友好的設(shè)計(jì)策略,也在實(shí)際中測試過,發(fā)現(xiàn)其效果會(huì)因任務(wù)類型與場景的改變而變化,是否使用還需要通過實(shí)驗(yàn)來反饋。
-
競賽:YOLOv6 Backbone可以用于競賽的Baseline嘗試。本人也相信YOLOv6會(huì)在一些限定算力資源的競賽中會(huì)大放異。
-
研究:YOLOv6 整體結(jié)構(gòu)可以用于研究的入場Baseline。
【十】YOLOv7 輸入側(cè),Backbone,Neck,Head,Tricks大解析
首先,在這里先分享一下YOLOv7的整體結(jié)構(gòu):
YOLOv7網(wǎng)絡(luò)結(jié)構(gòu)圖
YOLOv7 輸入側(cè)大解析
YOLOv7的輸入側(cè)沿用了YOLOv5的整體邏輯,并沒有引入新的Tricks,故就不再展開贅述。
YOLOv7 Backbone大解析
YOLOv7的Backbone結(jié)構(gòu)在YOLOv5的基礎(chǔ)上,設(shè)計(jì)了E-ELAN和MPConv結(jié)構(gòu)。
E-ELAN結(jié)構(gòu)會(huì)在后面的Neck部分中詳細(xì)介紹,這里就不再展開。MPConv結(jié)構(gòu)由常規(guī)卷積與maxpool雙路徑組成,增加模型對(duì)特征的提取融合能力。不管是E-ELAN還是MPConv結(jié)構(gòu),都將特征重用邏輯演繹到了比較高的水準(zhǔn),讓人眼前一亮。
YOLOv7 Neck大解析
YOLOv7的Neck結(jié)構(gòu)主要包含了SPPSCP模塊和優(yōu)化的PAN模塊。
SPPCSP模塊在SPP模塊基礎(chǔ)上在最后增加concat操作,與SPP模塊之前的特征圖進(jìn)行融合,更加豐富了特征信息。
PAN模塊引入E-ELAN結(jié)構(gòu),使用expand、shuffle、merge cardinality等策略實(shí)現(xiàn)在不破壞原始梯度路徑的情況下,提高網(wǎng)絡(luò)的學(xué)習(xí)能力。
論文原文:(E-ELAN uses expand, shuffle, merge cardinality to achieve the ability to continuously enhance the learning ability of the network without destroying the original gradient path.)
E-ELAN模塊
YOLOv7 Head大解析
YOLOv7的Head結(jié)構(gòu)使用了和YOLOv5一樣的損失函數(shù),引入RepVGG style改造了Head網(wǎng)絡(luò)結(jié)構(gòu),并使用了輔助頭(auxiliary Head)訓(xùn)練以及相應(yīng)的正負(fù)樣本匹配策略。
RepVGG style在訓(xùn)練過程中可以通過多路分支提升性能,推理可以通過結(jié)構(gòu)重新參數(shù)化實(shí)現(xiàn)推理速度的加快。
之前也對(duì)RepVGG style思想進(jìn)行遷移性實(shí)驗(yàn),發(fā)現(xiàn)RepVGG style在不同模型中的兼容性并不是很強(qiáng),往往需要針對(duì)當(dāng)前的模型和場景進(jìn)行大量調(diào)參才能展現(xiàn)效果。
輔助頭訓(xùn)練策略以及相應(yīng)的正負(fù)樣本匹配策略
YOLOv7在Head結(jié)構(gòu)引入了輔助頭(auxiliary Head)進(jìn)行訓(xùn)練。正常網(wǎng)絡(luò)訓(xùn)練如上圖(a)所示,而用輔助頭參與訓(xùn)練時(shí),將對(duì)模型的訓(xùn)練進(jìn)行深度監(jiān)督,如上圖(b)所示。將輔助頭和檢測頭的損失進(jìn)行融合,相當(dāng)于在網(wǎng)絡(luò)高層進(jìn)行局部的模型ensemble操作,提升模型的整體性能。
而YOLOv7的正負(fù)樣本分配策略正是圍繞著檢測頭(lead head)與auxiliary Head進(jìn)行設(shè)計(jì),其主要是將YOLOv5和YOLOx的正負(fù)樣本分配策略相結(jié)合:
-
使用YOLOv5的正負(fù)樣本分配策略分配正樣本。
-
使用YOLOx的正負(fù)樣本分配策略確定正樣本。
YOLOv7的正負(fù)樣本分配策略相較于yolov5,加入了loss aware,利用當(dāng)前模型的表現(xiàn),能夠?qū)崟r(shí)精篩;而較于只使用YOLOX中的SimOTA算法,能夠提供更精確的先驗(yàn)知識(shí)。
上圖(d)中,lead head和auxiliary head使用一樣的正負(fù)樣本匹配策略,通過讓淺層的auxiliary head學(xué)習(xí)到lead head已經(jīng)獲得的特征,讓lead head更能專注于學(xué)習(xí)尚未學(xué)習(xí)到的剩余特征。
而上圖(e)中,在使用lead head和auxiliary head一起優(yōu)化模型的時(shí)候,auxiliary head的正樣本是較為“粗糙的“,主要是通過放寬正樣本分配過程的約束來獲得更多的正樣本。lead head中的一個(gè)anchor如果匹配上ground truth,則分配3個(gè)正樣本,而同樣的情況下auxiliary head分配5個(gè)。lead head中將top10個(gè)樣本IOU求和取整,而auxiliary head中取top20。auxiliary head的學(xué)習(xí)能力不如lead head強(qiáng),為了避免丟失需要學(xué)習(xí)的信息,將重點(diǎn)優(yōu)化auxiliary head的召回率。而lead head可以從高recall的結(jié)果中篩選出高精度的結(jié)果作為最終輸出。lead head和auxiliary head的損失函數(shù)權(quán)重設(shè)置為?。
YOLOv7 Tricks大解析
YOLOv7也使用了YOLOv5中提到的模型EMA(Exponential Moving Average)策略,并引入了YOLOR中使用的隱性知識(shí)。文章來源:http://www.zghlxwxcb.cn/news/detail-590300.html
YOLOR中的隱式知識(shí)可以在推理階段將計(jì)算值簡化為向量。這個(gè)向量可以與前一層或后一層卷積層的偏差和權(quán)重相結(jié)合。文章來源地址http://www.zghlxwxcb.cn/news/detail-590300.html
到了這里,關(guān)于YOLOv1-YOLOv7全系列解析匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!