<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 18816字,需瀏覽 38分鐘

           ·

          2021-08-11 23:53

          f3d814ed9f1d08a9e31a1525bae1af2a.webp

          在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-sYolox-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)重文件。


          b2884ec995470ac055573ebb2294a542.webp


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


          833ce04838d49c19b8c944c5e78102cf.webp


          注意:以上所有模型,可點(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,也可以直接下載使用。


          2caa0604297bbe1ccca0f03903374728.webp


          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)圖


          5ae507f988acb458e9ec15ab44fc2294.webp


          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)圖


          125c82a426e0bd26f3fc923f2136d376.webp


          上圖是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)圖


          b23af6fcc8835b3fbe633174c68fcd88.webp


          而在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ò)。


          2b335caf385d102b3f5945d647a4c412.webp


          大家可以看到,主干網(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。


          3d7246729c0b29b906c110fe94d75f02.webp


          不過在對上圖研究時(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。


          c05de88fee92061b4a55c9055ba6713c.webp


          而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)


          7429f6d2ee2de458769883fb392036bd.webp


          上圖即是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的效果。


          e26d830923b1574a7f4bdcc3c6ecf157.webp


          下面我們對于Yolox-Darknet53的輸入端、Backbone、Neck、Prediction四個部分,進(jìn)行詳解的拆解。


          3.2.2.1 輸入端
          (1)Strong augmentation


          9a81830baac8af16e1363a768c25c75b.webp


          在網(wǎng)絡(luò)的輸入端,Yolox主要采用了Mosaic、Mixup兩種數(shù)據(jù)增強(qiáng)方法。而采用了這兩種數(shù)據(jù)增強(qiáng),直接將Yolov3 baseline,提升了2.4個百分點(diǎn)。
          ① Mosaic數(shù)據(jù)增強(qiáng)Mosaic增強(qiáng)的方式,是U版YOLOv3引入的一種非常有效的增強(qiáng)策略。而且在Yolov4、Yolov5算法中,也得到了廣泛的應(yīng)用。通過隨機(jī)縮放隨機(jī)裁剪、隨機(jī)排布的方式進(jìn)行拼接,對于小目標(biāo)的檢測效果提升,還是很不錯的。


          1b8bbfa31e55f627e97e1648e013172f.webp


          Mosaic數(shù)據(jù)增強(qiáng)的內(nèi)容,在之前《深入淺出Yolo系列之Yolov3&Yolov4核心基礎(chǔ)知識完整講解》文章中寫的很詳細(xì),詳情可以查看之前的內(nèi)容。
          ② 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這個文件中。


          13555429affd4efe262b0940ccf45d09.webp


          其實(shí)方式很簡單,比如我們在做人臉檢測的任務(wù)。先讀取一張圖片,圖像兩側(cè)填充,縮放到640*640大小,即Image_1,人臉檢測框?yàn)榧t色框。再隨機(jī)選取一張圖片,圖像上下填充,也縮放到640*640大小,即Image_2,人臉檢測框?yàn)樗{(lán)色框。然后設(shè)置一個融合系數(shù),比如上圖中,設(shè)置為0.5,將Image_1和Image_2,加權(quán)融合,最終得到右面的Image。從右圖可以看出,人臉的紅色框和藍(lán)色框是疊加存在的。我們知道,在Mosaic和Mixup的基礎(chǔ)上,Yolov3 baseline增加了2.4個百分點(diǎn)。不過有兩點(diǎn)需要注意:(1)在訓(xùn)練的最后15個epoch,這兩個數(shù)據(jù)增強(qiáng)會被關(guān)閉掉。而在此之前,Mosaic和Mixup數(shù)據(jù)增強(qiáng),都是打開的,這個細(xì)節(jié)需要注意。(2)由于采取了更強(qiáng)的數(shù)據(jù)增強(qiáng)方式,作者在研究中發(fā)現(xiàn),ImageNet預(yù)訓(xùn)練將毫無意義,因此,所有的模型,均是從頭開始訓(xùn)練的。
          3.2.2.2 Backbone
          Yolox-Darknet53的Backbone主干網(wǎng)絡(luò),和原本的Yolov3 baseline的主干網(wǎng)絡(luò)都是一樣的。


          85289eb6f8fa1887728388f06d60fb36.webp


          都是采用Darknet53的網(wǎng)絡(luò)結(jié)構(gòu),大白在Yolov3的視頻中,對于它的來源,結(jié)構(gòu),各個組件的細(xì)節(jié),都有很清晰的講解,如何有不了解的,可以點(diǎn)擊最下方,閱讀原文,查看視頻Yolov3相關(guān)算法的原理及實(shí)現(xiàn)。
          3.2.2.3 Neck
          在Neck結(jié)構(gòu)中,Yolox-Darknet53和Yolov3 baseline的Neck結(jié)構(gòu),也是一樣的,都是采用FPN的結(jié)構(gòu)進(jìn)行融合。


          0f938275122a7a89c272329a9709a054.webp?

          如下圖所示,FPN自頂向下,將高層的特征信息,通過上采樣的方式進(jìn)行傳遞融合,得到進(jìn)行預(yù)測的特征圖。


          4eea80f4de4cc95d1cd32048bd0999df.webp


          而在Yolov4、Yolov5、甚至后面講到的Yolox-s、l等版本中,都是采用FPN+PAN的形式,這里需要注意。
          3.2.2.4 Prediction層
          在輸出層中,主要從四個方面進(jìn)行講解:Decoupled Head、Anchor Free、標(biāo)簽分配、Loss計(jì)算。


          7429f6d2ee2de458769883fb392036bd.webp

          ? ?

          (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é)?
          b4294c3b15ef221e348ffc7ff8ffb633.webp


          從上圖右面的Prediction中,我們可以看到,有三個Decoupled Head分支。
          ① 為什么使用Decoupled Head?在了解原理前,我們先了解下改進(jìn)的原因。為什么將原本的Yolo head,修改為Decoupled Head呢?我們先看一張論文中的表格:


          af794209d81f3f1e1dae654879b5020b.webp


          在前面3.2.1 基準(zhǔn)網(wǎng)絡(luò)中,我們知道Yolov3 ?baseline的AP值為38.5。作者想繼續(xù)改進(jìn),比如輸出端改進(jìn)為End-to-end的方式(即無NMS的形式)。但意外的發(fā)現(xiàn),改進(jìn)完之后的AP值只有34.3而在2020年12月份,曠視科技發(fā)表的《End-to-End Object Detection with Fully Convolution Network》中。在對FCOS改進(jìn)為無NMS時(shí),在COCO上,達(dá)到了與有NMS的FCOS,相當(dāng)?shù)男阅堋?/span>那這時(shí)就奇怪了,為什么在Yolo上改進(jìn),會下降這么多?在偶然間,作者將End-to-End中的Yolo Head,修改為Decoupled Head的方式。


          32906fdf02f661c03812a37b2bf8a722.webp


          驚喜的發(fā)現(xiàn),End-to-end Yolo的AP值,從34.3增加到38.8。那End-to-end的方式有效果,Yolov3 baseline中是否也有效果呢?然后作者又將Yolov3 baseline 中Yolo Head,也修改為Decoupled Head。發(fā)現(xiàn)AP值,從38.5,增加到39.6。當(dāng)然作者在實(shí)驗(yàn)中還發(fā)現(xiàn),不單單是精度上的提高。替換為Decoupled Head后,網(wǎng)絡(luò)的收斂速度也加快了。因此可以得到一個非常關(guān)鍵的結(jié)論:★ 目前Yolo系列使用的檢測頭,表達(dá)能力可能有所欠缺,沒有Decoupled Head的表達(dá)能力更好。這里添加Yolo Head和Decoupled Head的對比曲線:?


          9407dfa208b8c8a99419da248bbffc9e.webp
          曲線表明: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。


          d63cc274ea7dc8f6d856c8c3fce5a7be.webp


          從圖上可以看出,Concat前總共有三個分支(1)cls_output:主要對目標(biāo)框的類別,預(yù)測分?jǐn)?shù)。因?yàn)镃OCO數(shù)據(jù)集總共有80個類別,且主要是N個二分類判斷,因此經(jīng)過Sigmoid激活函數(shù)處理后,變?yōu)?0*20*80大小。(2)obj_output:主要判斷目標(biāo)框是前景還是背景,因此經(jīng)過Sigmoid處理好,變?yōu)?0*20*1大小。(3)reg_output:主要對目標(biāo)框的坐標(biāo)信息(x,y,w,h)進(jìn)行預(yù)測,因此大小為20*20*4。最后三個output,經(jīng)過Concat融合到一起,得到20*20*85的特征信息。當(dāng)然,這只是Decoupled Head①的信息,再對Decoupled Head②和③進(jìn)行處理。


          815f43e873cc924c8050e2aeedb0c82c.webp


          Decoupled Head②輸出特征信息,并進(jìn)行Concate,得到40*40*85特征信息。Decoupled Head③輸出特征信息,并進(jìn)行Concate,得到80*80*85特征信息再對①②③三個信息,進(jìn)行Reshape操作,并進(jìn)行總體的Concat,得到8400*85的預(yù)測信息。并經(jīng)過一次Transpose,變?yōu)?5*8400大小的二維向量信息。這里的8400,指的是預(yù)測框的數(shù)量,而85是每個預(yù)測框的信息(reg,obj,cls)。有了預(yù)測框的信息,下面我們再了解,如何將這些預(yù)測框和標(biāo)注的框,即groundtruth進(jìn)行關(guān)聯(lián),從而計(jì)算Loss函數(shù),更新網(wǎng)絡(luò)參數(shù)呢?
          (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上,基于每個單元格,都有三個不同尺寸大小的錨框。


          4ec3eea2c473b1437f079a63b3e38191.webp


          這里為了更形象的展示,以大白Yolov3視頻中,輸入圖像大小416*416為例。


          8dc707844f353b8909100cc3083ca5a8.webp


          當(dāng)輸入為416*416時(shí),網(wǎng)絡(luò)最后的三個特征圖大小為13*13,26*26,52*52。我們可以看到,黃色框?yàn)樾」返腉roundtruth,即標(biāo)注框。而藍(lán)色的框,為小狗中心點(diǎn)所在的單元格,所對應(yīng)的錨框,每個單元格都有3個藍(lán)框。當(dāng)采用COCO數(shù)據(jù)集,即有80個類別時(shí)。基于每個錨框,都有x、y、w、h、obj(前景背景)、class(80個類別),共85個參數(shù)。因此會產(chǎn)生3*(13*13+26*26+52*52)*85=904995個預(yù)測結(jié)果。如果將輸入從416*416,變?yōu)?40*640,最后的三個特征圖大小為20*20,40*40,80*80。則會產(chǎn)生3*(20*20+40*40+80*80)*85=2142000個預(yù)測結(jié)果。
          ② 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,而是特征向量。


          a2a8cc71fd864c152d3d2ab59fc28c63.webp


          從圖中可知,當(dāng)輸入為640*640時(shí),最終輸出得到的特征向量是85*8400。我們看下,和之前Anchor Based方式,預(yù)測結(jié)果數(shù)量相差多少?通過計(jì)算,8400*85=714000個預(yù)測結(jié)果,比基于Anchor Based的方式,少了2/3的參數(shù)量。
          b.Anchor框信息在前面Anchor Based中,我們知道,每個Feature map的單元格,都有3個大小不一的錨框。那么Yolox-Darknet53就沒有嗎?其實(shí)并不然,這里只是巧妙的,將前面Backbone中,下采樣的大小信息引入進(jìn)來。


          e32f1219a9db9c959b749e4f51513489.webp


          比如上圖中,最上面的分支,下采樣了5次,2的5次方為32。并且Decoupled Head①的輸出,為20*20*85大小。ffe9afc2be8449e5508a8aa2cb911e9a.webp因此如上圖所示:最后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)。


          a2d4a2e9df8fd094975ce39115a1b403.webp


          為了大家更容易理解,大白以人臉檢測的任務(wù)繪制圖片:


          f828e9aad343e0a09470113168092756.webp


          通過上面的公式,可以對左面人臉圖片,計(jì)算出左上角(gt_l,gt_t),右下角(gt_r,gt_b)。groundtruth的矩形框范圍確定了,再根據(jù)范圍去選擇適合的錨框。這里再繪制一個錨框的中心點(diǎn),(x_center,y_center)。而右面的圖片,就是尋找錨框和groundtruth的對應(yīng)關(guān)系。即計(jì)算錨框中心點(diǎn)(x_center,y_center),和人臉標(biāo)注框左上角(gt_l,gt_t),右下角(gt_r,gt_b)兩個角點(diǎn)的相應(yīng)距離。比如下面代碼圖片中的前四行代碼


          ba072294ea0cfbaaeaae340d86b6851a.webp


          而在第五行,將四個值疊加之后,通過第六行,判斷是否都大于0?就可以將落在groundtruth矩形范圍內(nèi)的所有anchors,都提取出來了。因?yàn)閍ncor box的中心點(diǎn),只有落在矩形范圍內(nèi),這時(shí)的b_l,b_r,b_t,b_b都大于0。
          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的正方形。


          8b476a8982ebd81f567169ce044a08c0.webp


          為了大家容易理解,大白還是以人臉檢測的任務(wù)繪制圖片:


          55f68be6375bdbd31406b0eae074a278.webp


          在左面的人臉圖片中,基于人臉標(biāo)注框的中心點(diǎn),利用上面的公式,繪制了一個邊長為5的正方形。左上角點(diǎn)為(gt_l,gt_t),右下角點(diǎn)為(gt_r,gt_b)。這時(shí)groundtruth正方形范圍確定了,再根據(jù)范圍去挑選錨框。而右面的圖片,就是找出所有中心點(diǎn)(x_center,y_center)在正方形內(nèi)的錨框。


          1353d1b0b539422adfc0ed2bcb4b8b7a.webp


          在代碼圖片中的前四行代碼,也是計(jì)算錨框中心點(diǎn),和正方形兩邊的距離。通過第五行的疊加,再在第六行,判斷c_l,c_r,c_t,c_b是否都大于0?就可以將落在邊長為5的正方形范圍內(nèi),所有的anchors,都提取出來了,因?yàn)檫@時(shí)的c_l,c_r,c_t,c_b都大于0。經(jīng)過上面兩種挑選的方式,就完成初步篩選了,挑選出一部分候選的anchor,進(jìn)入下一步的精細(xì)化篩選。
          ② 精細(xì)化篩選而在精細(xì)化篩選中,就用到論文中提到的SimOTA了:


          e26d830923b1574a7f4bdcc3c6ecf157.webp


          從提升效果上來看,引入SimOTA后,AP值提升了2.3個百分點(diǎn),還是非常有效的。而SimOAT方法的提出,主要來源于曠視科技,2021年初CVPR上的一篇論文:《Ota: Optimal transport assignment for object detection》。我們將SimOTA的前后流程進(jìn)行拆解,看一下是如何進(jìn)行精細(xì)化篩選的?整個篩選流程,主要分為四個階段:a.初篩正樣本信息提取b.Loss函數(shù)計(jì)算c.cost成本計(jì)算d.SimOTA求解為了便于理解,我們假定圖片上有3個目標(biāo)框,即3個groundtruth。再假定目前在做的項(xiàng)目是對人臉和人體檢測,因此檢測類別是2。上一節(jié)中,我們知道有8400個錨框,但是經(jīng)過初步篩選后,假定有1000個錨框是正樣本錨框。
          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等信息,提取出來。


          2487e683264374b56c54628fb817d1ca.webp


          上面的代碼位于yolo_head.py的get_assignments函數(shù)中。以前面的假定信息為例,代碼圖片中的bboxes_preds_per_image因?yàn)槭呛蜻x檢測框的信息,因此維度為[1000,4]obj_preds因?yàn)槭悄繕?biāo)分?jǐn)?shù),所以維度是[1000,1]。cls_preds因?yàn)槭穷悇e分?jǐn)?shù),所以維度是[1000,2]
          b.Loss函數(shù)計(jì)算針對篩選出的1000個候選檢測框,和3個groundtruth計(jì)算Loss函數(shù)。計(jì)算的代碼,也在yolo_head.py的get_assignments函數(shù)中。首先是位置信息的loss值:pair_wise_ious_loss


          56813aa9b8e031cd9631a1d6e93f534f.webp


          通過第一行代碼,可以計(jì)算出3個目標(biāo)框,和1000個候選框,每個框相互之間的iou信息pair_wise_ious,因?yàn)橄蛄烤S度為[3,1000]。再通過-torch.log計(jì)算,得到位置損失,即代碼中的pair_wise_iou_loss。然后是綜合類別信息和目標(biāo)信息的loss值:pair_wise_cls_loss


          0328460c096386f6c69f6135461d8175.webp


          通過第一行代碼,將類別的條件概率和目標(biāo)的先驗(yàn)概率做乘積,得到目標(biāo)的類別分?jǐn)?shù)。再通過第二行代碼,F.binary_cross_entroy的處理,得到3個目標(biāo)框和1000個候選框的綜合loss值,即pair_wise_cls_loss,向量維度為[3,1000]。
          c.cost成本計(jì)算有了reg_loss和cls_loss,就可以將兩個損失函數(shù)加權(quán)相加,計(jì)算cost成本函數(shù)了。這里涉及到論文中提到的一個公式:


          47bf192b65aadc2ef3d1c62e97d94971.webp


          相應(yīng)的,對應(yīng)于yolo_head.py的get_assignments函數(shù)中的代碼:


          1945fcd71de9f4bba6b80b1bd8b1290d.webp


          可以看出,公式中的加權(quán)系數(shù),即代碼中的3。
          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:


          97476007abaf189e9e60735dff2a386d.webp


          其中的流程如下:第一步:設(shè)置候選框數(shù)量


          a1eeab3252d42ff4edfba840e6b71083.webpc34a66d4817a0d40db0fb7d8e91c7817.webp


          首先按照cost值的大小,新建一個全0變量matching_matrix,這里是[3,1000]。


          ba519dafb39958b02cc16c87174bf8e4.webp


          通過上面第二行代碼,設(shè)置候選框數(shù)量為10。再通過第三行代碼,從前面的pair_wise_ious中,給每個目標(biāo)框,挑選10個iou最大的候選框。因?yàn)榍懊婕俣ㄓ?個目標(biāo),因此這里topk_ious的維度為[3,10]。
          第二步:通過cost挑選候選框下面再通過topk_ious的信息,動態(tài)選擇候選框,這里是個關(guān)鍵。代碼如dynamic_k_matching函數(shù)中,下圖所示:


          a9054cad1df8cf227a609529954427db.webp


          為了便于大家理解,大白先把第一行制作成圖示效果。這里的topk_ious,是3個目標(biāo)框和預(yù)測框中,最大iou的10個候選框:


          7f61c996fb8362109666952c8b44a637.webp


          經(jīng)過torch.clamp函數(shù),得到最終右面的dynamic_ks值。我們就知道,目標(biāo)框1和3,給他分配3個候選框,而目標(biāo)框2,給它分配4個候選框。那么基于什么標(biāo)準(zhǔn)分配呢?這時(shí)就要利用前面計(jì)算的cost值,即[3,1000]的損失函數(shù)加權(quán)信息。在for循環(huán)中,針對每個目標(biāo)框挑選,相應(yīng)的cost值最低的一些候選框。


          775d6a325231ed25b078709519cba330.webp


          比如右面的matching_matrix中,cost值最低的一些位置,數(shù)值為1,其余位置都為0。因?yàn)槟繕?biāo)框1和3,dynamic_ks值都為3,因此matching_matrix的第一行和第三行,有3個1。而目標(biāo)框2,dynamic_ks值為4,因此matching_matrix的第二行,有4個1。
          第三步:過濾共用的候選框不過在分析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)一步篩選。


          ef01686f7ea4a12fb1b33ab7ef8ae08b.webp


          這里為了便于理解,還是采用圖示的方式:首先第一行代碼,將matching_matrix,對每一列進(jìn)行相加。


          4dc399f9526d1734e1e7f01cf70ab747.webp


          這時(shí)anchor_matching_gt中,只要有大于1的,說明有共用的情況。上圖案例中,表明第5列存在共用的情況。再利用第三行代碼,將cost中,第5列的值取出,并進(jìn)行比較,計(jì)算最小值所對應(yīng)的行數(shù),以及分?jǐn)?shù)。我們將第5列兩個位置,假設(shè)為0.4和0.3。


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


          7ad7bf1d99f6545b75c01e3197245378.webp


          經(jīng)過第四行代碼,將matching_matrix第5列都置0。再利用第五行代碼,將matching_matrix第2行,第5列的位置變?yōu)?。最終我們可以得到3個目標(biāo)框,最合適的一些候選框,即matching_matrix中,所有1所對應(yīng)的位置。
          (4)Loss計(jì)算經(jīng)過第三部分的標(biāo)簽分配,就可以將目標(biāo)框和正樣本預(yù)測框?qū)?yīng)起來了。下面就可以計(jì)算兩者的誤差,即Loss函數(shù)。計(jì)算的代碼,位于yolo_head.py的get_losses函數(shù)中。


          73410f45d1c70574fa2750596216fee5.webp


          我們可以看到:檢測框位置的iou_loss,Yolox中使用傳統(tǒng)的iou_loss,和giou_loss兩種,可以進(jìn)行選擇。而obj_loss和cls_loss,都是采用BCE_loss的方式。當(dāng)然除此之外,還有兩點(diǎn)需要注意a.在前面精細(xì)化篩選中,使用了reg_loss和cls_loss,篩選出和目標(biāo)框所對應(yīng)的預(yù)測框。因此這里的iou_loss和cls_loss,只針對目標(biāo)框和篩選出的正樣本預(yù)測框進(jìn)行計(jì)算。而obj_loss,則還是針對8400個預(yù)測框。b.在Decoupled Head中,cls_outputobj_output使用了sigmoid函數(shù)進(jìn)行歸一化,但是在訓(xùn)練時(shí),并沒有使用sigmoid函數(shù),原因是訓(xùn)練時(shí)用的nn.BCEWithLogitsLoss函數(shù),已經(jīng)包含了sigmoid操作。


          e2390cd9094639a3ba19152d882562f8.webp


          而在推理過程中,是使用Sigmoid函數(shù)的。


          7d05b9dfdeaa3d130dda0bb5cfca2786.webp


          PS:不同的實(shí)驗(yàn)數(shù)據(jù)對比因?yàn)橄霚y試Yolox不同trick的性能,和好友潘大強(qiáng)在使用自有數(shù)據(jù),對多種trick進(jìn)行對比測試時(shí)發(fā)現(xiàn):① 方案一:Yolox-s+數(shù)據(jù)增強(qiáng)+(obj_output的Loss函數(shù),用BCELoss)? ??


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


          06710476be1381f85b355ca98da17590.webp


          對比發(fā)現(xiàn):在使用自有數(shù)據(jù)集訓(xùn)練時(shí),如果將obj_loss的BCE_Loss,修改為Focal_Loss,發(fā)現(xiàn)效果很明顯,漲點(diǎn)也很多。而且iou_loss收斂的更好了,不知道是否有朋友也試過?可以在評論區(qū)討論。

          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)圖:


          b23af6fcc8835b3fbe633174c68fcd88.webp


          我們再看一下Yolox-s的網(wǎng)絡(luò)結(jié)構(gòu):


          37e508e1ab850f97ef64e9bb199b9cd3.webp


          由上面兩張圖的對比,及前面的內(nèi)容可以看出,Yolov5s和Yolox-s主要區(qū)別在于:(1)輸入端:在Mosa數(shù)據(jù)增強(qiáng)的基礎(chǔ)上,增加了Mixup數(shù)據(jù)增強(qiáng)效果;(2)Backbone:激活函數(shù)采用SiLU函數(shù);(3)Neck:激活函數(shù)采用SiLU函數(shù);(4)輸出端:檢測頭改為Decoupled Head、采用anchor free、multi positives、SimOTA的方式。在前面Yolov3 baseline的基礎(chǔ)上,以上的tricks,取得了很不錯的漲點(diǎn)。在Yolov5一系列框架中呢?下圖是對Yolov5s、Yolov5m、Yolov5l、Yolov5x四個網(wǎng)絡(luò)的改進(jìn)效果對比圖:


          e722affec447dd9226fd8716e4f996d2.webp


          可以看出,在速度增加1ms左右的情況下,AP精度實(shí)現(xiàn)了0.8~2.9的漲點(diǎn)。且網(wǎng)絡(luò)結(jié)構(gòu)越輕,比如Yolox-s的時(shí)候,漲點(diǎn)最多,達(dá)到2.9的漲點(diǎn)。隨著網(wǎng)絡(luò)深度和寬度的加深,漲點(diǎn)慢慢降低,最終Yolox-x有0.8的漲點(diǎn)。

          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)。


          06330690d3ef4a02e6dca55a5f3ab57a.webp


          從上表可以看出:(1)和Yolov4-Tiny相比,Yolox-Tiny在參數(shù)量下降1M的情況下,AP值實(shí)現(xiàn)了9個點(diǎn)的漲點(diǎn)。(2)和NanoDet相比,Yolox-Nano在參數(shù)量下降,僅有0.91M的情況下,實(shí)現(xiàn)了1.8個點(diǎn)的漲點(diǎn)。(3)因此可以看出,Yolox的整體設(shè)計(jì),在輕量級模型方面,依然有很不錯的改進(jìn)點(diǎn)。
          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)行了對比測試。


          a367b5680c6d2621306f626cbe9fc936.webp


          通過以上的表格有以下發(fā)現(xiàn):① Mosaic和Mixup混合策略(1)對于輕量級網(wǎng)絡(luò),Yolox-nano來說,當(dāng)在Mosaic基礎(chǔ)上,增加了Mixup數(shù)據(jù)增強(qiáng)的方式,AP值不增反而降,從25.3降到24。(2)而對于深一些的網(wǎng)絡(luò),Yolox-L來說,在Mosaic基礎(chǔ)上,增加了Mixup數(shù)據(jù)增強(qiáng)的方式,AP值反而有所上升,從48.6增加到49.5。(3)因此不同的網(wǎng)絡(luò)結(jié)構(gòu),采用數(shù)據(jù)增強(qiáng)的策略也不同,比如Yolox-s、Yolox-m,或者Yolov4、Yolov5系列,都可以使用不同的數(shù)據(jù)增強(qiáng)策略進(jìn)行嘗試。
          ② Scale 增強(qiáng)策略在Mosaic數(shù)據(jù)增強(qiáng)中,代碼Yolox/data/data_augment.py中的random_perspective函數(shù),生成仿射變換矩陣時(shí),對于圖片的縮放系數(shù),會生成一個隨機(jī)值。


          6130aa35f122cc282b48caabf94cd410.webp


          (1)對于Yolox-l來說,隨機(jī)范圍scale設(shè)置在[0.1,2]之間,即文章中設(shè)置的默認(rèn)參數(shù)。(2)而當(dāng)使用輕量級模型,比如YoloNano時(shí),一方面只使用Mosaic數(shù)據(jù)增強(qiáng),另一方面隨機(jī)范圍scale,設(shè)置在[0.5,1.5]之間,弱化Mosaic增廣的性能。

          3.3 Yolox的實(shí)現(xiàn)成果

          3.3.1 精度速度對比

          前面我們了解了Yolox的各種trick改進(jìn)的原因以及原理,下面我們再整體看一下各種模型精度速度方面的對比:


          ac7d200b82ed8c98d57e2146596f57a5.webp


          左面的圖片是相對比較標(biāo)準(zhǔn)的,網(wǎng)絡(luò)結(jié)構(gòu)的對比效果,主要從速度和精度方面,進(jìn)行對比。而右面的圖片,則是輕量級網(wǎng)絡(luò)的對比效果,主要對比的是參數(shù)量和精度。
          從左面的圖片可以得出:(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


          8907c7305a25b6f218f34650325e37ac.webp


          在競賽中曠視科技采用Yolox-l作為參賽模型同時(shí)使用TensorRT進(jìn)行推理加速,最終獲得了full-track和detection-only track,兩個賽道比賽的第一。因此Yolox的各種改進(jìn)方式還是挺不錯,值得好好學(xué)習(xí),深入研究一下。


          4ac960cd4802d673f241c6a4ad86a547.webp


          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í)。作者在代碼中,還貼心的整理了各種版本的部署方式:


          5acda0b8caedeb26dbaec6bcd897557a.webp


          比如以上5種方式:(1)MegEngine:基于曠視科技的深度學(xué)習(xí)框架,MegEngine的部署方式。也是Brain++的核心組件,主要有C++和Python兩種方式。(2)ONNX和Tensorrt兩種方式:英偉達(dá)的兩種方式都有支持,主要有C++和Python兩個方式,常常用在GPU服務(wù)器推理中。(3)NCNN:騰訊優(yōu)圖開源的手機(jī)端推理框架,主要有C++和Java版本。(4)OpenViNO:Intel公司開源的深度學(xué)習(xí)應(yīng)用套件,主要有C++和Python版本。一般情況下,可以選擇Yolox-Nano、Yolox-Tiny、Yolox-s用于移動端部署Yolox-m、Yolox-l、Yolox-x用于GPU服務(wù)器部署。大家也可以根據(jù)自己項(xiàng)目的需求,選擇不同的部署方式。

          6 后續(xù)更新ing

          當(dāng)然在Yolox的代碼中,大白發(fā)現(xiàn)曠視作者的工作,還是不斷改進(jìn)中。后期也會推出很多改進(jìn)的工作。


          be005c0a7f15e163d9e45e8b149e2e3f.webp


          大家也可以先關(guān)注、點(diǎn)贊、收藏,后續(xù)有更新后,大白也會在本文中進(jìn)行調(diào)整修改,更新到文章中。

          7 相關(guān)推薦:數(shù)據(jù)集分類下載

          當(dāng)然除了訓(xùn)練中使用到的人頭數(shù)據(jù)集,在大白網(wǎng)站的數(shù)據(jù)集下載版塊,還整理了數(shù)百種,不同類型的數(shù)據(jù)集:


          9278c39ca2efee48cb2ffbf8cc21d262.webp


          大家也可以根據(jù)自己的需要,選擇不同的數(shù)據(jù)集,進(jìn)行下載嘗試。數(shù)百種數(shù)據(jù)集匯總鏈接:www.jiangdabai.com希望大白制作的,關(guān)于Yolov3、Yolov4、Yolov5、Yolox的一系列文章和視頻,對大家工作和學(xué)習(xí)有幫助!22dfd0454e7ce653e48611d310e889c5.webp

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


          5e678d63efb261a994dc9363d778ea6e.webp

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


          9a6f863985cbcf0fe5db8de701357d30.webp

          詳細(xì)解讀GraphFPN | 如何用圖模型提升目標(biāo)檢測模型性能?


          長按掃描下方二維碼添加小助手并加入交流群,群里博士大佬云集,每日討論話題有目標(biāo)檢測、語義分割、超分辨率、模型部署、數(shù)學(xué)基礎(chǔ)知識、算法面試題分享的等等內(nèi)容,當(dāng)然也少不了搬磚人的扯犢子

          長按掃描下方二維碼添加小助手。

          可以一起討論遇到的問題

          聲明:轉(zhuǎn)載請說明出處

          掃描下方二維碼關(guān)注【集智書童】公眾號,獲取更多實(shí)踐項(xiàng)目源碼和論文解讀,非常期待你我的相遇,讓我們以夢為馬,砥礪前行!

          4e04f70b17cfa49b993eaa3a1e4feecf.webp
          瀏覽 2206
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷综合在线 | 伊人av大香蕉 | 中国一集大毛片 | av手机天堂网 | 中文字幕在线观看就是爽 |