深入淺出Yolo系列之Yolox核心基礎(chǔ)完整講解

在Yolov4、Yolov5剛出來時(shí),大白就寫過關(guān)于Yolov3、Yolov4、Yolov5的文章,并且做了一些講解的視頻,反響都還不錯。
而從2015年的Yolov1,2016年Yolov2,2018年的Yolov3,再到2020年的Yolov4、Yolov5,Yolo系列也在不斷的進(jìn)化發(fā)展。
就在大家質(zhì)疑,Yolo如何進(jìn)一步改進(jìn)時(shí),曠視科技發(fā)表了研究改進(jìn)的Yolox算法。
大白對于Yolox文章和相關(guān)的代碼,進(jìn)行了學(xué)習(xí),發(fā)現(xiàn)有很多改進(jìn)的方式。
比如Decoupled Head、SimOTA等方式,效果還是非常不錯的,很值得借鑒。
但因?yàn)楹茈y直接可視化的學(xué)習(xí),了解Yolox和之前Yolo相關(guān)算法的區(qū)別。
因此本文,大白對Yolox的一些細(xì)節(jié),和之前的Yolov3、Yolov4、Yolov5算法對比,進(jìn)行深入淺出的分析講解,和大家一些探討學(xué)習(xí)。
1 Yolov3&Yolov4&Yolov5相關(guān)資料1.1 Yolov3相關(guān)資料1.2 Yolov4相關(guān)資料1.3 Yolov5相關(guān)資料2 Yolox相關(guān)基礎(chǔ)知識點(diǎn)2.1 Yolox的論文及代碼2.2. Yolox個版本網(wǎng)絡(luò)結(jié)構(gòu)圖2.2.1 Netron工具2.2.2 各個Yolox的onnx文件2.2.3 各個Yolox網(wǎng)絡(luò)結(jié)構(gòu)圖3 Yolox核心知識點(diǎn)3.1 Yolov3&Yolov4&Yolov5網(wǎng)絡(luò)結(jié)構(gòu)圖3.2 Yolox基礎(chǔ)知識點(diǎn)3.2.1 基準(zhǔn)模型:Yolov3_spp3.2.2 Yolox-Darknet533.2.3 Yolox-s、l、m、x系列3.2.4 輕量級網(wǎng)絡(luò)研究4 深入淺出Yolox之自有數(shù)據(jù)集訓(xùn)練5 不同的落地模型部署方式6 后續(xù)更新ing7 相關(guān)推薦:數(shù)據(jù)集分類下載
1 Yolov3&Yolov4&Yolov5相關(guān)資料
在了解Yolox之前,我們首先要對之前的一些Yolo算法,比如Yolov3、Yolov4、Yolov5進(jìn)行了解。
因?yàn)閅olox很多的網(wǎng)絡(luò)結(jié)構(gòu),都是在其基礎(chǔ)上,延伸而來的。
比如Yolox-Darknet53,就是在Yolov3的基礎(chǔ)上進(jìn)行的改進(jìn)。
而Yolox-s、Yolox-l等網(wǎng)絡(luò),就是在Yolov5-s、Yolov5-l等網(wǎng)絡(luò)的基礎(chǔ)上,進(jìn)行的改進(jìn)。
所以大白將之前整理的,Yolo相關(guān)文章和視頻,進(jìn)行匯總。有需要的同學(xué),可以先進(jìn)行了解。
① Yolov3相關(guān)資料
【視頻】:深入淺出Yolov3(上)、深入淺出Yolov3(下)
② Yolov4相關(guān)資料
【視頻】:深入淺出Yolov4(上)、深入淺出Yolov4(下)【文章】:《深入淺出Yolo系列之Yolov3&4核心基礎(chǔ)知識完整講解》③ Yolov5相關(guān)資料
【文章】:《深入淺出Yolo系列之Yolov5核心基礎(chǔ)知識完整講解》
④ Yolox相關(guān)資料
【文章】:《深入淺出Yolox之自有數(shù)據(jù)集訓(xùn)練超詳細(xì)教程》
注意:因無法直接放文章或視頻外鏈,可點(diǎn)擊最下方,閱讀原文進(jìn)行查看。
2 Yolox相關(guān)基礎(chǔ)知識點(diǎn)
2.1 Yolox的論文及代碼
Yolox論文名:《YOLOX: Exceeding YOLO Series in 2021》
Yolox論文地址:https://arxiv.org/abs/2107.08430
Yolox代碼地址:https://github.com/Megvii-BaseDetection/YOLOX
2.2 Yolox各版本網(wǎng)絡(luò)結(jié)構(gòu)圖
想學(xué)習(xí)一個算法,最好從直觀圖示的角度,進(jìn)行了解。
如果純粹從代碼上進(jìn)行查看,很可能會一頭霧水。
而且Yolox的各種網(wǎng)絡(luò)結(jié)構(gòu)也很多,比如下面的各個網(wǎng)絡(luò)結(jié)構(gòu)權(quán)重文件。

因此可以采用,將各個模型文件轉(zhuǎn)換成onnx格式,再用netron工具打開的方式,對網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行可視化學(xué)習(xí)。

注意:以上所有模型,可點(diǎn)擊最下方,閱讀原文,查看下載。
2.2.1 Netron工具
如果有同學(xué)對netron工具還不是很熟悉,這里還是放上netron工具安裝的詳細(xì)流程。
可以移步大白的另一篇文章:《網(wǎng)絡(luò)可視化工具netron詳細(xì)安裝流程》。
https://blog.csdn.net/nan355655600/article/details/106245563
2.2.2 各個Yolox的onnx文件
各個onnx文件,可以采用代碼中的,tools/export_onnx.py腳本,進(jìn)行轉(zhuǎn)換。
此外,官方代碼中的這個版塊,已經(jīng)轉(zhuǎn)換好了各個版本的onnx,也可以直接下載使用。

2.2.3 各個Yolox網(wǎng)絡(luò)結(jié)構(gòu)圖
不過考慮到,有些同學(xué)可能不方便,使用netron查看。
因此,大白也上傳了使用netron打開的,每個網(wǎng)絡(luò)結(jié)構(gòu)圖的圖片,也可以直接查看。
(1)Yolox-Nano
Yolox-Nano是Yolox系列最小的結(jié)構(gòu),網(wǎng)絡(luò)參數(shù)只有0.91M。
此處放上netron打開的,Yolox-Nano網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329864
(2)Yolox-Tiny
此處放上Yolox-Tiny網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329848
(3)Yolox-Darknet53
Yolox-Darknet53是在Yolov3的基礎(chǔ)上,進(jìn)行的改進(jìn),也是后面主要介紹的網(wǎng)絡(luò)結(jié)構(gòu)。
此處放上Yolox-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329834
(4)Yolox-s
Yolox-s是在Yolov5-s的基礎(chǔ)上,進(jìn)行的改進(jìn),也是后面主要介紹的網(wǎng)絡(luò)結(jié)構(gòu)。
此處放上Yolox-s網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329727
(5)Yolox-m
此處放上Yolox-m網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329801
(6)Yolox-l
此處放上Yolox-l網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329801
(7)Yolox-x
此處放上Yolox-x網(wǎng)絡(luò)結(jié)構(gòu)可視圖的地址,點(diǎn)擊查看。
https://blog.csdn.net/nan355655600/article/details/119329818
3 Yolox核心知識點(diǎn)
3.1 Yolov3&Yolov4&Yolov5網(wǎng)絡(luò)結(jié)構(gòu)圖
在學(xué)習(xí)Yolox之前,我們先了解一下Yolov3、Yolov4、Yolov5的網(wǎng)絡(luò)結(jié)構(gòu)圖,而后面的Yolox網(wǎng)絡(luò),都是在此基礎(chǔ)上延伸而來的。
① Yolov3網(wǎng)絡(luò)結(jié)構(gòu)圖

Yolov3是在2018年提出,也是工業(yè)界使用非常廣泛的目標(biāo)檢測算法。
不過在Yolox系列中的,Yolox-Darknet53模型,采用的Baseline基準(zhǔn)網(wǎng)絡(luò),采用的并不是Yolov3版本,而是改進(jìn)后的Yolov3_spp版本。
而Yolov3和Yolov3_spp的不同點(diǎn)在于,Yolov3的主干網(wǎng)絡(luò)后面,添加了spp組件,這里需要注意。
② Yolov4網(wǎng)絡(luò)結(jié)構(gòu)圖

上圖是DarknetAB大神,在2020年提出的Yolov4算法。
在此算法中,網(wǎng)絡(luò)的很多地方,都進(jìn)行了改進(jìn)。
比如輸入端:采用Mosaic數(shù)據(jù)增強(qiáng);
Backbone:采用了CSPDarknet53、Mish激活函數(shù)、Dropblock等方式;
Neck:采用了SPP(按照DarknetAB的設(shè)定)、FPN+PAN結(jié)構(gòu);
輸出端:采用CIOU_Loss、DIOU_Nms操作。
因此可以看出,Yolov4對Yolov3的各個部分,都進(jìn)行了很多的整合創(chuàng)新。
關(guān)于Yolov4,如果有不清楚的,可以參照大白之前寫的《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識完整講解》,寫的比較詳細(xì)。
③ Yolov5網(wǎng)絡(luò)結(jié)構(gòu)圖

而在Yolov5網(wǎng)絡(luò)中,和Yolov4不同,最大的創(chuàng)新點(diǎn)在于,作者將網(wǎng)絡(luò)結(jié)構(gòu),做成了可選擇配置的方式。
比如主干網(wǎng)絡(luò)結(jié)構(gòu),根據(jù)各個網(wǎng)絡(luò)的寬度、高度不同,可以分為Yolov5s、Yolov5l、Yolov5s、Yolo5x等版本。
這種轉(zhuǎn)變,在目標(biāo)檢測領(lǐng)域,引領(lǐng)了一股網(wǎng)絡(luò)拆分的熱潮。
本文的Yolox算法,也從這個角度出發(fā),將Yolox模型,變?yōu)槎喾N可選配的網(wǎng)絡(luò),比如標(biāo)準(zhǔn)網(wǎng)絡(luò)結(jié)構(gòu)和輕量級網(wǎng)絡(luò)結(jié)構(gòu)。
(1)標(biāo)準(zhǔn)網(wǎng)絡(luò)結(jié)構(gòu):Yolox-s、Yolox-m、Yolox-l、Yolox-x、Yolox-Darknet53。
(2)輕量級網(wǎng)絡(luò)結(jié)構(gòu):Yolox-Nano、Yolox-Tiny。
在實(shí)際的項(xiàng)目中,大家可以根據(jù)不同項(xiàng)目需求,進(jìn)行挑選使用。
3.2 Yolox基礎(chǔ)知識點(diǎn)
從上面的描述中,我們可以知道Yolox整體的改進(jìn)思路:
(1)基準(zhǔn)模型:Yolov3_spp
選擇Yolov3_spp結(jié)構(gòu),并添加一些常用的改進(jìn)方式,作為Yolov3 baseline基準(zhǔn)模型;
(2)Yolox-Darknet53
對Yolov3 baseline基準(zhǔn)模型,添加各種trick,比如Decoupled Head、SimOTA等,得到Yolox-Darknet53版本;
(3)Yolox-s、Yolox-m、Yolox-l、Yolox-x系列
對Yolov5的四個版本,采用這些有效的trick,逐一進(jìn)行改進(jìn),得到Yolox-s、Yolox-m、Yolox-l、Yolox-x四個版本;
(4)輕量級網(wǎng)絡(luò)
設(shè)計(jì)了Yolox-Nano、Yolox-Tiny輕量級網(wǎng)絡(luò),并測試了一些trick的適用性;
總體來說,論文中做了很多的工作,下面和大家一起,從以上的角度,對Yolox算法的網(wǎng)絡(luò)結(jié)構(gòu),以及各個創(chuàng)新點(diǎn)進(jìn)行講解。
3.2.1 基準(zhǔn)模型:Yolov3_spp
在設(shè)計(jì)算法時(shí),為了對比改進(jìn)trick的好壞,常常需要選擇基準(zhǔn)的模型算法。
而在選擇Yolox的基準(zhǔn)模型時(shí),作者考慮到:
Yolov4和Yolov5系列,從基于錨框的算法角度來說,可能有一些過度優(yōu)化,因此最終選擇了Yolov3系列。
不過也并沒有直接選擇Yolov3系列中,標(biāo)準(zhǔn)的Yolov3算法,而是選擇添加了spp組件,進(jìn)而性能更優(yōu)的Yolov3_spp版本。
以下是論文中的解釋:
Considering YOLOv4 and YOLOv5 may be a little over-optimized for the anchor-based pipeline, we choose YOLOv3 [25] as our start point (we set YOLOv3-SPP as the default YOLOv3)。
為了便于大家理解,大白在前面Yolov3結(jié)構(gòu)圖的基礎(chǔ)上,添加上spp組件,變?yōu)橄聢D所示的Yolov3_spp網(wǎng)絡(luò)。

大家可以看到,主干網(wǎng)絡(luò)Backbone后面,增加了一個SPP組件。
當(dāng)然在此基礎(chǔ)上,對網(wǎng)絡(luò)訓(xùn)練過程中的很多地方,都進(jìn)行了改進(jìn),比如:
(1)添加了EMA權(quán)值更新、Cosine學(xué)習(xí)率機(jī)制等訓(xùn)練技巧
(2)使用IOU損失函數(shù)訓(xùn)練reg分支,BCE損失函數(shù)訓(xùn)練cls與obj分支
(3)添加了RandomHorizontalFlip、ColorJitter以及多尺度數(shù)據(jù)增廣,移除了RandomResizedCrop。
在此基礎(chǔ)上,Yolov3_spp的AP值達(dá)到38.5,即下圖中的Yolov3 baseline。

不過在對上圖研究時(shí),有一點(diǎn)點(diǎn)小疑惑:
YOLOv3_ultralytics的AP值為44.3,論文中引用時(shí),說是目前Yolov3_spp算法中,精度最好的版本。(the current best practice of YOLOv3)。
接著對此代碼進(jìn)行查看,發(fā)現(xiàn)正如論文中所說,增加了很多trick的Yolov3_spp版本,AP值為44.3。

而Yolox的基準(zhǔn)模型,是最原始的Yolov3_spp版本,經(jīng)過一系列的改進(jìn)后,AP值達(dá)到38.5。
在此基礎(chǔ)上,又增加了Strong augmentation、Decoupled head、anchor-free、multi positives、SimOTA,等5種trick,最終達(dá)到了AP47.3。
但存在疑惑的是?
如果直接采用YOLOv3_ultralytics的Yolov3_spp版本,再增加上面的4種trick(除掉strong augmentation,因?yàn)榇a中已經(jīng)改進(jìn)了),是否會有更好的AP提升?
3.2.2 Yolox-Darknet53
我們在前面知道,當(dāng)?shù)玫結(jié)olov3 baseline后,作者又添加了一系列的trick,最終改進(jìn)為Yolox-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)。

上圖即是Yolox-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)圖。
為了便于分析改進(jìn)點(diǎn),我們對Yolox-Darknet53網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行拆分,變?yōu)樗膫€板塊:
① 輸入端:Strong augmentation數(shù)據(jù)增強(qiáng)
② BackBone主干網(wǎng)絡(luò):主干網(wǎng)絡(luò)沒有什么變化,還是Darknet53。
③ Neck:沒有什么變化,Yolov3 baseline的Neck層還是FPN結(jié)構(gòu)。
④ Prediction:Decoupled Head、End-to-End YOLO、Anchor-free、Multi positives。
在經(jīng)過一系列的改進(jìn)后,Yolox-Darknet53最終達(dá)到AP47.3的效果。

下面我們對于Yolox-Darknet53的輸入端、Backbone、Neck、Prediction四個部分,進(jìn)行詳解的拆解。
3.2.2.1 輸入端
(1)Strong augmentation
① Mosaic數(shù)據(jù)增強(qiáng)Mosaic增強(qiáng)的方式,是U版YOLOv3引入的一種非常有效的增強(qiáng)策略。而且在Yolov4、Yolov5算法中,也得到了廣泛的應(yīng)用。通過隨機(jī)縮放、隨機(jī)裁剪、隨機(jī)排布的方式進(jìn)行拼接,對于小目標(biāo)的檢測效果提升,還是很不錯的。

② MixUp數(shù)據(jù)增強(qiáng)MixUp是在Mosaic基礎(chǔ)上,增加的一種額外的增強(qiáng)策略。主要來源于2017年,頂會ICLR的一篇論文《mixup: Beyond Empirical Risk Minimization》。當(dāng)時(shí)主要應(yīng)用在圖像分類任務(wù)中,可以在幾乎無額外計(jì)算開銷的情況下,穩(wěn)定提升1個百分點(diǎn)的分類精度。而在Yolox中,則也應(yīng)用到目標(biāo)檢測中,代碼在yolox/datasets/mosaicdetection.py這個文件中。

3.2.2.2 Backbone
Yolox-Darknet53的Backbone主干網(wǎng)絡(luò),和原本的Yolov3 baseline的主干網(wǎng)絡(luò)都是一樣的。
3.2.2.3 Neck
在Neck結(jié)構(gòu)中,Yolox-Darknet53和Yolov3 baseline的Neck結(jié)構(gòu),也是一樣的,都是采用FPN的結(jié)構(gòu)進(jìn)行融合。
?

3.2.2.4 Prediction層
在輸出層中,主要從四個方面進(jìn)行講解:Decoupled Head、Anchor Free、標(biāo)簽分配、Loss計(jì)算。
? ?
(1)Decoupled Head我們先來看一下Decoupled Head,目前在很多一階段網(wǎng)絡(luò)中都有類似應(yīng)用,比如RetinaNet、FCOS等。而在Yolox中,作者增加了三個Decoupled Head,俗稱“解耦頭”大白這里從兩個方面對Decoupled Head進(jìn)行講解:① 為什么使用Decoupled Head?② Decoupled Head的細(xì)節(jié)?
① 為什么使用Decoupled Head?在了解原理前,我們先了解下改進(jìn)的原因。為什么將原本的Yolo head,修改為Decoupled Head呢?我們先看一張論文中的表格:



曲線表明:Decoupled Head的收斂速度更快,且精度更高一些。但是需要注意的是:將檢測頭解耦,會增加運(yùn)算的復(fù)雜度。因此作者經(jīng)過速度和性能上的權(quán)衡,最終使用 1個1x1 的卷積先進(jìn)行降維,并在后面兩個分支里,各使用了 2個3x3 卷積,最終調(diào)整到僅僅增加一點(diǎn)點(diǎn)的網(wǎng)絡(luò)參數(shù)。而且這里解耦后,還有一個更深層次的重要性:Yolox的網(wǎng)絡(luò)架構(gòu),可以和很多算法任務(wù),進(jìn)行一體化結(jié)合。比如:(1)YOLOX + Yolact/CondInst/SOLO ,實(shí)現(xiàn)端側(cè)的實(shí)例分割。(2)YOLOX + 34 層輸出,實(shí)現(xiàn)端側(cè)人體的 17 個關(guān)鍵點(diǎn)檢測。
② Decoupled Head的細(xì)節(jié)?了解了Decoupled Head的來源,再看一下Decoupled Head的細(xì)節(jié)。我們將Yolox-Darknet53中,Decoupled Head①提取出來,經(jīng)過前面的Neck層,這里Decouple Head①輸入的長寬為20*20。


(2)Anchor-free這里就要引入Anchor的內(nèi)容,目前行業(yè)內(nèi),主要有Anchor Based和Anchor Free兩種方式。在Yolov3、Yolov4、Yolov5中,通常都是采用Anchor Based的方式,來提取目標(biāo)框,進(jìn)而和標(biāo)注的groundtruth進(jìn)行比對,判斷兩者的差距。
① Anchor Based方式比如輸入圖像,經(jīng)過Backbone、Neck層,最終將特征信息,傳送到輸出的Feature Map中。這時(shí),就要設(shè)置一些Anchor規(guī)則,將預(yù)測框和標(biāo)注框進(jìn)行關(guān)聯(lián)。從而在訓(xùn)練中,計(jì)算兩者的差距,即損失函數(shù),再更新網(wǎng)絡(luò)參數(shù)。比如在下圖的,最后的三個Feature Map上,基于每個單元格,都有三個不同尺寸大小的錨框。


② Anchor Free方式而Yolox-Darknet53中,則采用Anchor Free的方式。我們從兩個方面,來對Anchor Free進(jìn)行了解。a.輸出的參數(shù)量我們先計(jì)算下,當(dāng)?shù)玫桨繕?biāo)框所有輸出信息時(shí),所需要的參數(shù)量?這里需要注意的是:最后黃色的85*8400,不是類似于Yolov3中的Feature Map,而是特征向量。

b.Anchor框信息在前面Anchor Based中,我們知道,每個Feature map的單元格,都有3個大小不一的錨框。那么Yolox-Darknet53就沒有嗎?其實(shí)并不然,這里只是巧妙的,將前面Backbone中,下采樣的大小信息引入進(jìn)來。

因此如上圖所示:最后8400個預(yù)測框中,其中有400個框,所對應(yīng)錨框的大小,為32*32。同樣的原理,中間的分支,最后有1600個預(yù)測框,所對應(yīng)錨框的大小,為16*16。最下面的分支,最后有6400個預(yù)測框,所對應(yīng)錨框的大小,為8*8。當(dāng)有了8400個預(yù)測框的信息,每張圖片也有標(biāo)注的目標(biāo)框的信息。這時(shí)的錨框,就相當(dāng)于橋梁。這時(shí)需要做的,就是將8400個錨框,和圖片上所有的目標(biāo)框進(jìn)行關(guān)聯(lián),挑選出正樣本錨框。而相應(yīng)的,正樣本錨框所對應(yīng)的位置,就可以將正樣本預(yù)測框,挑選出來。這里采用的關(guān)聯(lián)方式,就是標(biāo)簽分配。(3)標(biāo)簽分配當(dāng)有了8400個Anchor錨框后,這里的每一個錨框,都對應(yīng)85*8400特征向量中的預(yù)測框信息。不過需要知道,這些預(yù)測框只有少部分是正樣本,絕大多數(shù)是負(fù)樣本。那么到底哪些是正樣本呢?這里需要利用錨框和實(shí)際目標(biāo)框的關(guān)系,挑選出一部分適合的正樣本錨框。比如第3、10、15個錨框是正樣本錨框,則對應(yīng)到網(wǎng)絡(luò)輸出的8400個預(yù)測框中,第3、10、15個預(yù)測框,就是相應(yīng)的正樣本預(yù)測框。訓(xùn)練過程中,在錨框的基礎(chǔ)上,不斷的預(yù)測,然后不斷的迭代,從而更新網(wǎng)絡(luò)參數(shù),讓網(wǎng)絡(luò)預(yù)測的越來越準(zhǔn)。那么在Yolox中,是如何挑選正樣本錨框的呢?這里就涉及到兩個關(guān)鍵點(diǎn):初步篩選、SimOTA。
① 初步篩選初步篩選的方式主要有兩種:根據(jù)中心點(diǎn)來判斷、根據(jù)目標(biāo)框來判斷;這部分的代碼,在models/yolo_head.py的get_in_boxes_info函數(shù)中。a. 根據(jù)中心點(diǎn)來判斷:規(guī)則:尋找anchor_box中心點(diǎn),落在groundtruth_boxes矩形范圍的所有anchors。比如在get_in_boxes_info的代碼中,通過groundtruth的[x_center,y_center,w,h],計(jì)算出每張圖片的每個groundtruth的左上角、右下角坐標(biāo)。



b.根據(jù)目標(biāo)框來判斷:除了根據(jù)錨框中心點(diǎn),和groundtruth兩邊距離判斷的方式外,作者還設(shè)置了根據(jù)目標(biāo)框判斷的方法。規(guī)則:以groundtruth中心點(diǎn)為基準(zhǔn),設(shè)置邊長為5的正方形,挑選在正方形內(nèi)的所有錨框。同樣在get_in_boxes_info的代碼中,通過groundtruth的[x_center,y_center,w,h],繪制了一個邊長為5的正方形。



② 精細(xì)化篩選而在精細(xì)化篩選中,就用到論文中提到的SimOTA了:

a.初篩正樣本信息提取初篩出的1000個正樣本錨框的位置,我們是知道的。而所有錨框的位置,和網(wǎng)絡(luò)最后輸出的85*8400特征向量是一一對應(yīng)。所以根據(jù)位置,可以將網(wǎng)絡(luò)預(yù)測的候選檢測框位置bboxes_preds、前景背景目標(biāo)分?jǐn)?shù)obj_preds、類別分?jǐn)?shù)cls_preds等信息,提取出來。

b.Loss函數(shù)計(jì)算針對篩選出的1000個候選檢測框,和3個groundtruth計(jì)算Loss函數(shù)。計(jì)算的代碼,也在yolo_head.py的get_assignments函數(shù)中。首先是位置信息的loss值:pair_wise_ious_loss


c.cost成本計(jì)算有了reg_loss和cls_loss,就可以將兩個損失函數(shù)加權(quán)相加,計(jì)算cost成本函數(shù)了。這里涉及到論文中提到的一個公式:


d.SimOTA ? ? ? ? ? ? ? ? ? ? ?有了上面的一系列信息,標(biāo)簽分配問題,就轉(zhuǎn)換為了標(biāo)準(zhǔn)的OTA問題。但是經(jīng)典的Sinkhorn-Knopp算法,需要多次迭代求得最優(yōu)解。作者也提到,該算法會導(dǎo)致25%額外訓(xùn)練時(shí)間,所以采用一種簡化版的SimOTA方法,求解近似最優(yōu)解。這里對應(yīng)的函數(shù),是get_assignments函數(shù)中的self.dynamic_k_matching:



第二步:通過cost挑選候選框下面再通過topk_ious的信息,動態(tài)選擇候選框,這里是個關(guān)鍵。代碼如dynamic_k_matching函數(shù)中,下圖所示:



第三步:過濾共用的候選框不過在分析matching_matrix時(shí),我們發(fā)現(xiàn),第5列有兩個1。這也就說明,第五列所對應(yīng)的候選框,被目標(biāo)檢測框1和2,都進(jìn)行關(guān)聯(lián)。因此對這兩個位置,還要使用cost值進(jìn)行對比,選擇較小的值,再進(jìn)一步篩選。



經(jīng)過第三行代碼,可以找到最小的值是0.3,即cost_min為0.3,所對應(yīng)的行數(shù),cost_argmin為2。

(4)Loss計(jì)算經(jīng)過第三部分的標(biāo)簽分配,就可以將目標(biāo)框和正樣本預(yù)測框?qū)?yīng)起來了。下面就可以計(jì)算兩者的誤差,即Loss函數(shù)。計(jì)算的代碼,位于yolo_head.py的get_losses函數(shù)中。




② ?方案二:Yolox-s+數(shù)據(jù)增強(qiáng)+(obj_output的Loss函數(shù),改為FocalLoss)

3.2.3 Yolox-s、l、m、x系列
在對Yolov3 baseline進(jìn)行不斷優(yōu)化,獲得不錯效果的基礎(chǔ)上。作者又對Yolov5系列,比如Yolov5s、Yolov5m、Yolov5l、Yolov5x四個網(wǎng)絡(luò)結(jié)構(gòu),也使用一系列trick進(jìn)行改進(jìn)。先來看一下,改進(jìn)了哪些地方?我們主要對Yolov5s進(jìn)行對比,下圖是Yolov5s的網(wǎng)絡(luò)結(jié)構(gòu)圖:


3.2.4 輕量級網(wǎng)絡(luò)研究
在對Yolov3、Yolov5系列進(jìn)行改進(jìn)后,作者又設(shè)計(jì)了兩個輕量級網(wǎng)絡(luò),與Yolov4-Tiny、和Yolox-Nano進(jìn)行對比。在研究過程中,作者有兩個方面的發(fā)現(xiàn),主要從輕量級網(wǎng)絡(luò),和數(shù)據(jù)增強(qiáng)的優(yōu)缺點(diǎn),兩個角度來進(jìn)行描述。3.2.4.1 輕量級網(wǎng)絡(luò)
因?yàn)閷?shí)際場景的需要,很多同學(xué)想將Yolo移植到邊緣設(shè)備中。因此作者針對Yolov4-Tiny,構(gòu)建了Yolox-Tiny網(wǎng)絡(luò)結(jié)構(gòu)。針對FCOS 風(fēng)格的NanoDet,構(gòu)建了Yolox-Nano網(wǎng)絡(luò)結(jié)構(gòu)。
3.2.4.2 數(shù)據(jù)增強(qiáng)的優(yōu)缺點(diǎn)
在Yolox的很多對比測試中,都使用了數(shù)據(jù)增強(qiáng)的方式。但是不同的網(wǎng)絡(luò)結(jié)構(gòu),有的深有的淺,網(wǎng)絡(luò)的學(xué)習(xí)能力不同,那么無節(jié)制的數(shù)據(jù)增強(qiáng)是否真的更好呢?作者團(tuán)隊(duì),對這個問題也進(jìn)行了對比測試。
② Scale 增強(qiáng)策略在Mosaic數(shù)據(jù)增強(qiáng)中,代碼Yolox/data/data_augment.py中的random_perspective函數(shù),生成仿射變換矩陣時(shí),對于圖片的縮放系數(shù),會生成一個隨機(jī)值。

3.3 Yolox的實(shí)現(xiàn)成果
3.3.1 精度速度對比
前面我們了解了Yolox的各種trick改進(jìn)的原因以及原理,下面我們再整體看一下各種模型精度速度方面的對比:
從左面的圖片可以得出:(1)和與Yolov4-CSP相當(dāng)?shù)?/span>Yolov5-l進(jìn)行對比,Yolo-l在COCO數(shù)據(jù)集上,實(shí)現(xiàn)AP50%的指標(biāo),在幾乎相同的速度下超過Yolov5-l 1.8個百分點(diǎn)。(2)而Yolox-Darknet53和Yolov5-Darknet53相比,實(shí)現(xiàn)AP47.3%的指標(biāo),在幾乎同等速度下,高出3個百分點(diǎn)。
而從右面的圖片可以得出:(1)和Nano相比,Yolox-Nano參數(shù)量和GFLOPS都有減少,參數(shù)量為0.91M,GFLOPS為1.08,但是精度可達(dá)到25.3%,超過Nano1.8個百分點(diǎn)。(2)而Yolox-Tiny和Yolov4-Tiny相比,參數(shù)量和GFLOPS都減少的情況下,精度遠(yuǎn)超Yolov4-Tiny 9個百分點(diǎn)。
3.3.2 Autonomous Driving競賽
在CVPR2021自動駕駛競賽的,Streaming Perception Challenge賽道中,挑戰(zhàn)的主要關(guān)注點(diǎn)之一,是自動駕駛場景下的實(shí)時(shí)視頻流2D目標(biāo)檢測問題。由一個服務(wù)器收發(fā)圖片和檢測結(jié)果,來模擬視頻流30FPS的視頻,客戶端接收到圖片后進(jìn)行實(shí)時(shí)推斷。競賽地址:https://eval.ai/web/challenges/challenge-page/800/overview

4 深入淺出Yolox之自有數(shù)據(jù)集訓(xùn)練
因?yàn)?/span>Yolox的代碼,和之前的Yolov3、Yolov4、Yolov5版本還是有很多不同的地方。很多同學(xué)可能對于如何利用自有數(shù)據(jù)集訓(xùn)練?還是有些疑惑。因此大白另外也寫了一篇《深入淺出Yolox之自有數(shù)據(jù)集訓(xùn)練》的文章。利用教室場景中,人頭部標(biāo)注的數(shù)據(jù)集,和大家一起一步步訓(xùn)練。文章鏈接:《深入淺出Yolox之自有數(shù)據(jù)集訓(xùn)練超詳細(xì)教程》5 ?不同的落地模型部署方式
當(dāng)模型訓(xùn)練好,需要在項(xiàng)目中進(jìn)行部署時(shí)。作者在代碼中,還貼心的整理了各種版本的部署方式:
6 后續(xù)更新ing
當(dāng)然在Yolox的代碼中,大白發(fā)現(xiàn)曠視作者的工作,還是不斷改進(jìn)中。后期也會推出很多改進(jìn)的工作。
7 相關(guān)推薦:數(shù)據(jù)集分類下載
當(dāng)然除了訓(xùn)練中使用到的人頭數(shù)據(jù)集,在大白網(wǎng)站的數(shù)據(jù)集下載版塊,還整理了數(shù)百種,不同類型的數(shù)據(jù)集:

牛津大學(xué)提出PSViT | Token池化+Attention Sharing讓Transformer模型不在冗余!??!

YOffleNet | YOLO V4 基于嵌入式設(shè)備的輕量化改進(jìn)設(shè)計(jì)

詳細(xì)解讀GraphFPN | 如何用圖模型提升目標(biāo)檢測模型性能?
長按掃描下方二維碼添加小助手并加入交流群,群里博士大佬云集,每日討論話題有目標(biāo)檢測、語義分割、超分辨率、模型部署、數(shù)學(xué)基礎(chǔ)知識、算法面試題分享的等等內(nèi)容,當(dāng)然也少不了搬磚人的扯犢子
長按掃描下方二維碼添加小助手。
可以一起討論遇到的問題
聲明:轉(zhuǎn)載請說明出處
掃描下方二維碼關(guān)注【集智書童】公眾號,獲取更多實(shí)踐項(xiàng)目源碼和論文解讀,非常期待你我的相遇,讓我們以夢為馬,砥礪前行!

