YOLO1至YOLOV3方法講解

motivation

  • 目前的目標檢測算法主要是分爲兩個分支,分別爲two-stage 和 one-stage。其中,two-stage的目標檢測方法是根據classifier分類器演化而來的,主要是經過不一樣的region proposals方法進行ROI的提取,而後在利用不一樣的網絡對提取出的BBoxes進行迴歸定位和分類,而後通過後處理例如NMS非極大值抑制方法進行BBox的去重。因爲Two-stage方法步驟複雜,並且方法中的每一個獨立的部分都要被單獨的訓練,致使這類方法速度上慢以及很難進行優化。(可是,我我的的理解,雖然這個方法中涉及到不少獨立的部分,可是對每個獨立的部分進行優化均可以,能夠入手的點比較多)git

  • 本文主要是提出了一個單一的、總體的神經網絡,將目標檢測問題從新構形成一個迴歸問題,直接對整張圖像的每個像素進行BBoxes的座標及它所屬類別的預測。這個one-stage的方法主要的特色就是速度快,基本上可以達到實時的標準,並且YOLO是對整張圖像進行分析推理,它不容易檢測出錯誤的背景,產生有關背景的錯誤。此外YOLO學到的是對象的高度歸納的特徵表示,因此它更容易推廣到其餘的數據集或者領域的目標檢測任務中去。並且YOLO將two-stage方法中分開的部分用一個單獨的卷積神經網絡進行代替,這個卷積神經網路同時進行特徵提取、bounding boxes的預測,NMS以及語義推理,github

background

  • 目前,人類具備看一下圖像就知道圖像中有哪些物體,這些物體的位置大概在哪些位置的能力,這種能力是咱們天生就有的,潛意識就執行的能力,這種能力使得咱們能夠對本身看到的景象進行實時的判斷,使得咱們能夠行走,駕駛等等。可是,這種能力計算機不具有,若是想要計算機具備與人相似的能力就要藉助目標檢測方法來實現。用於物體檢測的快速精確算法將容許計算機在沒有專用傳感器的狀況下駕駛汽車,使輔助設備可以向人類用戶傳達實時場景信息,並釋放通用響應機器人系統的潛力。此外,目標檢測也是計算機視覺領域中的重要部分。web

  • 目前的目標檢測方法主要是由classifier演化而來的,爲了檢測對象,這些方法在測試圖片中在不一樣的位置以及不一樣大小的框來預測,而且對這些框用分類器進行類別的預測,這種方法的其中一個表明方法就是DMP(deformable parts models ),它使用滑動窗口方法sliding window approach來對整張圖片以均勻間隔排列的位置運行分類器。DPM方法的各個部分是分離的,好比提取靜態特徵static features、分類區域、對於高分語氣預測bounding boxes等等。YOLO不一樣與靜態特徵提取,他的網絡在線訓練特徵,而且根據檢測任務進行特徵的優化,這樣會使得檢測更加迅速、精準。對於DPM方法的加速經過對HOG計算、use cascades以及應用GPU,它目前也只可以達到30Hz速度。算法

  • R-CNN方法使用region proposal methods來生成圖片中可能存在的bounding boxes,而後在這些proposed boxes的位置運行classifier。在對這些框進行分類以後,經過post-processiong後處理來進行檢測框的去重以及從新在場景中基於其餘對象對boxes進行打分。這個複雜的流程速度慢,並且也很難優化。這種方法因爲是針對於局部的區域進行分析,因此它產生的背景錯誤檢測比YOLO產生的要多,可是YOLO產生的定位錯誤比這種方法要多,相對於two-stage的方法,YOLO的精確度仍是要差一點的。R-CNN使用 selective searches(SS)的region proposal方法來進行圖像中目標的查找。SS方法生成圖像中可能存在的bounding boxes,而後一個卷積神經網絡進行特徵的提取,SVM進行boxes的打分,a lnear model adjusts the bounding boxes線性模型進行bounding boxes的調整,而後non-max suppression(NMS,非極大值抑制)進行檢測的去重,這個複雜檢測步驟的每個階段都要被精準的的獨立調試,而且致使系統很慢,花費大約40s來預測一張圖像。主要算法架構參照圖1.windows

 

@圖1|center|500*400

圖1網絡

 

  • Fast R-CNN是在R-CNN的基礎之上進行改進的,主要是去除了在region proposals後的warped region,warped region主要是使提取到的區域進行變造成相同大小的圖像區域,在後來加上了ROI pooling層來將提取到的區域特徵變形或者說重構成相同的特徵大小,並且後來對每一個ROI regions經過參數共享的兩個網絡,來進行softmax分類和bbox的迴歸。這個算法架構將特徵變性替代圖像變形,來使得可以一塊兒處理不一樣大小規模的ROI區域,Fast R-CNN是經過特徵提取的卷積神經網絡以後的Roi pooling層來解決這個問題的。此外,這個方法的另外一個亮點是,它將R-CNN中對於每一個ROI進行單獨的分類和進行後處理改爲了可以共享參數的兩個Softmax分類以及bbox迴歸分支,共享計算資源,這樣大大減小了網絡的參數,加快了網絡的處理速度。具體的算法流程參照圖2.架構

 

@圖2|center|500*400

圖2app

 

  • Faster R-CNN是在Fast R-CNN的基礎之上進行改進的算法,一樣是R-CNN的變種之一。它主要是利用Region Proposal Network(RPN)網絡來替代以前的SS方法,經過RPN網絡來注意到圖像中的對象從而進行區域的提取。主要發的流程是,輸入一張圖像,而後對這張圖像進行特徵提取產生feature maps,而後將feature maps輸入到RPN網絡中去產生多個ROIs,而後將提取出的Rois與特徵圖進行整合,經過Roi pooling 以後進行分類及bboxes的迴歸。

 

@圖3|center|500*400

圖3

 

  • 可是R-CNN及其變體,雖然速度和精度兩方面都在不停的改進,可是速度方面仍是不可以達到實時效果的標準。

  • Depp MultiBox,它也是訓練一個網絡來記性ROIs的預測,可是貌似他只能進行單個(單類)目標的檢測,它仍然是一個複雜目標檢測方法的一部分而已。(有待補充)

  • OverFeat 方法主要是訓練一個卷積神經網絡來進行目標定位以及使localizer適用於執行檢測任務。它可以高效地進行滑動窗口檢測,可是任然是一個互斥(不想交)的系統,OverFeat優化了定位,沒有優化檢測的性能,如DPM同樣它也只是看到了局部的信息,不可以向YOLO同樣進行全局的語義推理,所以須要重要的後處理過程來減小重複檢測。(待補充)

  • MutiGrasp是YOLO網格grid劃分方法的基礎,可是MultiGrasp方法比目標檢測任務簡單的多,它只須要預測只包含一個目標的圖像的圖像位置。它不須要預測目標的大小,位置、邊界或者類別,它只需找到一個合適的區域便可。然而YOLO須要對於多種類別預測在一張圖像中的多個目標的類別機率和bounding boxes。

methods

  • YOLO致力於實現一個端到端的網絡,來達到實時標準的同時保持較高的準確度。

  • 首先,YOLO將輸入先劃分紅S*S的網格,若是某一個對象的中心落入到一個網格單元中,那麼這個網格單元grid cell就負責這個對象的檢測。每一個grid cell都須要預測B個bounding boxes以及這些bounding boxes的confidence score置信度。這些 confidence scores是model認爲這些box中包含object的可能性以及預測的box的準確度。

Alt text 即Alt text
其中,若是bbox中不包含對象,那麼confidence score爲0,反之,confidence score就等於the predicted box與the ground truth之間的IOU值。

  • 對每一個bounding boxes都要預測五個參數值:x,y,w,h,confidence score。其中(x,y)座標表示box的中心相對於網格單元邊界的座標。w,h爲相對於整張圖像的box的寬度與高度。最後the confidence在box中包含對象的時候表示預測的box與真實box之間的IOU。

  • 同時,也要對圖像中S*S個網格單元中的每一個grid cell預測一個集合大小爲C(數據中對象的類數)的類機率集合,無論bboxes的個數。這個class probabilities 是一個條件機率,即Alt text,表示在包含對象時目標屬於某類的機率。在測試階段將類機率與confidence score相乘,這樣就獲得了對於每一個bbox的目標類機率以及box預測位置的精準度的描述。 

    @|center

     

     

  • 對於Pascal VOC數據集(20類)來講,YOLO設S = 7,B = 2,C = 20,此時YOLO網絡到最後要預測一個Alt text,即要預測一個7*7*30的tensor。

 

@|center

 

 

  • 網絡的設計,主要是經過卷積層來提取圖像特徵,同時使用全鏈接層來預測bbox的類與座標。YOLO網絡主要借鑑了GoogleNet的思想,可是與GoogleNet的Inception modules不懂,網絡中使用1*1降維層(進行跨通道信息整合)加上3*3的卷積層來代替。YOLO網絡中有24個卷積層,兩個全鏈接層。Fast YOLO有9個卷積層,而且filters的數目更少,用來作快速檢測。具體的網絡結構以下圖所示。最後網絡輸出7*7*30大小的tensor。

 

@網絡結構|center

網絡結構

 

  • 將YOLO網絡的前20個卷積層在ImageNet 1000-class dataset上進行預訓練, 這個預訓練網絡出了20個卷積層還有一個average-pooling 層以及 a fully connected層。預訓練大概一週,top-5 accuracy在ImageNet 2012驗證集上達到88%。原文中的YOLO的實現是在Darknet框架下實現的。

  • 在預訓練的20個卷積層後面加上隨機初始化參數的四個卷積層和兩個全鏈接層用於目標檢測任務。因爲檢測任務須要比較細粒度的圖像信息,因此將網絡的分辨率從224*224調整到448*448.

  • 將預測的w,h相對於圖像的寬度和高度進行標準化,使其介於0和1之間。將bounding box的x,y座標參數化成相對於網格單元位置的偏離,因此他們也介於0和1之間。

  • 對於網絡的最後一層使用linear activation function線性激活函數,對於網絡中的其它層使用leaky rectified linear activation function:Alt text.

  • 對於損失函數,定位偏差和分類偏差的權重不該該相同。一樣,圖像中有不少網格單元不包含對象,他們的confidence score爲0,這樣那些包含對象的梯度佔據壓倒性的優點,致使模型不穩定,而且在很早就開始偏離訓練目的。爲了解決上面的那個問題,YOLO增長了bounding box座標預測偏差的權重,而且減小了不包含對象的confidence預測的權重,而且設定了兩個參數Alt text。並且平方和偏差將大box和小box的權重等同的對待。在big box中的偏差多是微小的,可是相對於small box可能致命的偏差損失。因此,咱們的loss應該可以體現出相同的偏差對於big box及small box的重要性不一樣。爲了解決這個問題,YOLO使用w,h的平方根偏差來減小這種差別性。在訓練階段,優化一下的損失函數,以下圖所示。

 

@loss function|center

loss function

 

 

@|center

 

 

  • YOLO這樣劃分網格的設計,使得每一個網格產生固定數量的bounding box,例如7*7網格,B=2時,共產生98個bounding boxes,這相對與SS方法產生2000多個這是很是少的,這也大大加快了網絡的處理速度。同時因爲是對圖像進行網格劃分,這樣就對bounding box 的位置進行了空間約束,可以很清楚的指導一個對象中心落入哪一個網格單元中,而且爲那個對象預測惟一的一box。可是一些小目標或者目標相鄰很近或者目標離多個網格邊界很近,這樣就會被多個網格單元進行定位,產生多個bounding box,這就須要使用Non-maximal suppression(NMS)來進行這些重複檢測的去重,NMS對於R-CNN或者DPM層架了大概2-3%的mAP。

experiments

  •  

    @在Pascal VOC不一樣算法對比|center

    在Pascal VOC不一樣算法對比

     

 

@|center

 

 

 

@|center

 

 

 

@偏差分析|center

偏差分析

 

 

@模型集成分析|center

模型集成分析

 

 

@具體類AP分析|center

具體類AP分析

 

 

@推廣到風格藝術數據集分析|center

推廣到風格藝術數據集分析

 

 

@效果|center|

效果


並且還有對於攝像頭實時監測的實驗,將YOLO與webcam相連,可以達到實時的性能效果,包括從相機中提取圖像與將圖像顯示出來的時間在內,這樣的系統就有些像追蹤系統,隨着攝像頭中目標的運動,監測結果也隨之變化。

 

conclusion

  • YOLO是一個統一的unified(標準的)實時目標檢測方法,它是一個單一的網絡(one-stage),因此它能夠根據檢測性能進行端到端的優化。

  • 以前的方法都是從新調整分類器來進行檢測,然而YOLO不一樣於以前的方法,它是將目標檢測做爲一個迴歸問題來構造空間上分離的BBoxes和相關類機率

  • YOLO做爲一個實時算法很是快,基礎模型能達到實時45幀每秒,fast YOLO能夠達到155幀每秒,同時可以達到其餘實時算法mAP的兩倍。

  • 相較於現有的目標檢測算法,YOLO會產生更多的定位偏差(localization errors),可是不太可能產生對於背景的誤報(圈出錯誤的背景)。

  • 因此YOLO學習了很是通常的表示。可是當從天然圖像推廣到其餘領域(藝術品、風格化圖像)時,YOLO方法優於其餘方法,靈活性比較強。

  • 因爲YOLO是對圖像進行網格劃分,對於每一個網格單元產生固定數量的bounding box,而且之預測一個類機率集合,這就樣的空間約束就限制了model可以夠預測的相鄰目標的數目。並且YOLO目前目標檢測的難題是如何預測成羣出現的小目標的問題(相鄰很近的多個小目標),好比一羣鳥。

  • 因爲model從數據中預測bounding box,它面臨對於新的、特殊的長寬比或者配置的目標的bounding box大小的歸納。

  • 並且,對於loss function, YOLO的損失偏差主要來自於定位偏差,應該解決對於不一樣大小bounding box的定位偏差的重要性的不一樣。(big box 與 small bo) 
    缺點:

  • 一、YOLO的物體檢測精度低於其餘state-of-the-art的物體檢測系統。

  • 二、YOLO容易產生物體的定位錯誤。

  • 三、YOLO對小物體的檢測效果很差(尤爲是密集的小物體,由於一個柵格只能預測2個物體)。

YOLOV2

題目: YOLO9000: Better, Faster, Stronger 
出自:CVPR 2017 CVPR 2017 Best Paper Honorable Mention ; 時間:2017 ; 引用:1280 
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[J]. arXiv preprint, 2017. 
源碼網站: http://pjreddie.com/yolo9000/ 
arxiv: https://arxiv.org/abs/1612.08242 
code: http://pjreddie.com/darknet/yolo/ 
github(Chainer): https://github.com/leetenki/YOLOv2 
blog:https://blog.csdn.net/l7H9JA4/article/details/79955903 
blog: https://blog.csdn.net/u014380165/article/details/77961414 
blog: https://blog.csdn.net/Jesse_Mx/article/details/53925356 
blog: https://cloud.tencent.com/developer/article/1156245 
blog:https://blog.csdn.net/zijin0802034/article/details/77097894 ** 
github(Keras): https://github.com/allanzelener/YAD2K 
github(PyTorch): https://github.com/longcw/yolo2-pytorch 
github(Tensorflow): https://github.com/hizhangp/yolo_tensorflow 
github(Windows): https://github.com/AlexeyAB/darknet 
github: https://github.com/choasUp/caffe-yolo9000 
github: https://github.com/philipperemy/yolo-9000

motivation

  • 雖然YOLOV1的檢測速度很快,可是在檢測精度上卻不如R-CNN系列檢測方法,YOLOV1在物體定位方面(localization)不夠準確,而且召回率(recall,查全率)較低。YOLOV2提出了8種改進側率來提高YOLO模型的定位準確率和召回率,從而提升mAP,而且保持檢測速度。(這是YOLO模型的一大優點)。這篇文章主要是在YOLOV1的基礎上在精準度以及速度這兩個方面進行改進,從而提出了YOLOV2,在精準度方面提出8個tricks方法來進行改進,這些tricks方法主要是來源於以前工做中的一些方法,在速度方面主要提出了一個更精簡的網絡架構Darknet-19來減小網絡中的參數,提高速度,而且對YOLOV1的訓練分類器進行特徵提取的過程進行了改善,這樣也提高了網絡的精確度,而後在Darknet-19的基礎上構建了檢測網絡。

  • 在YOLOV2的基礎上提出了一種將檢測數據集與分類數據集進行聯合訓練(jointly train)的方法,使用這種聯合訓練方法在COCO檢測數據集和ImageNet分類數據集上聯合訓練出了YOLO9000模型,這個模型可以檢測超過9000類的物體。(弱監督檢測有關???)

  • 因此這篇文章包括兩個模型YOLOV2和YOLO9000,兩個模型的主題結構是一致的,只不過YOLO9000是在YOLOV2的基礎上提出來的。

  • YOLOV2相比於YOLOV1作了不少方面的改進,這也使得YOLOV2的mAP顯著提高,而且保持YOLOV2的速度依然很快,保持了做爲One-Stage方法的優點,YOLOV2和Fatser R-CNN,SSD等模型的對好比圖1所示。

 

@|center|500*500

 

 

  • 除了修改網絡的tricks,YOLOV2的兩個亮點以下:

    • YOLOV2致力於進行精度和速度之間的平衡(tradeoff between speed and accuracy),它提出了一個新的multi-scale training method (多尺度訓練模型),這樣使得相同的YOLOv2模型可以在不一樣大小的圖像(不一樣尺度的)上運行。(能夠輸入不一樣分辨率的圖像)

    • YOLOV2 提出了一個新的方法來在 目標檢測和分類任務上進行jointly train(聯合訓練),從而使得YOLO9000可以同時在COCO檢測數據集與ImageNet分類數據集上訓練,所以能夠對那些沒有標註的目標分類進行檢測。(弱監督檢測?)

background

  • 因爲目標檢測中神經網絡的引入,two-stage方法與One-stage方法中都使用了神經網絡來進行目標檢測,特別是One-stage方法(YOLO、SSD)致力於使用單個獨立的神經網絡就可以完成目標檢測端到端的任務,從而目標檢測在速度以及準確度上有大了顯著提高,可以在保證精準度的同時達到實時的標準。

  • 可是,目前目標檢測任務的一個限制就是數據集過小,相比於其餘任務,例如分類、打標籤,目標檢測的數據集是有限的,分類是數百萬的數據集,然而目標檢測最多才數十萬的數據集。這是由於,相比於分類任務的標註工做,目標檢測的標註工做很複雜、很昂貴耗時的,致使目標檢測數據與分類任務的數據大小之間整整差了幾個數量級。

  • YOLOv2提出了一個新的方法來解決現有的大量的分類數據集,而且利用分類數據集來擴展目前檢測系統的範圍。主要經過目標分類的層級視圖(hierarchical view)來將不一樣的數據集整合到一塊兒。

  • 提出了一個joint training algorithm(聯合訓練算法),來共同地在檢測和分類數據集上進行目標檢測器(object detector)的訓練。在檢測數據集上學習精準的定位,同時在分類數據集上增長他的詞彙量和魯棒性。 本文,首先對基礎的YOLOv1方法進行改進,產生YOLOv2方法,一個精準並實時的檢測器。以後,在YOLOV2的基礎上,利用數據集整合方法以及聯合訓練算法在超過9000類的ImageNet分類數據以及COCO檢測數據上進行訓練,訓練出YOLO9000模型。

methods

YOLO2這篇論文主要是從Better、Faster、Stronger這個三個方面的改善來進行論述的,提出了YOLOV2,並在YOLOV2訓練的基礎上聯合訓練獲得了YOLO9000模型。下面分別就Better、Faster與Stronger這三個方面來說述在這篇文章中的改進。

Better

首先,利用8個tricks來改善YOLO的精度,即提升YOLO的mAP與recall,其中大部分方法都可以顯著提高模型的精度,具體的改進側率如圖2所示。

 

@|center|700*400

 

 

1. Batch Normalization(BN, 批標準化)

Batch Normalization能夠提高模型收斂速度,並且能夠起到必定正則化效果,下降模型的過擬合。在YOLOv2中,每一個卷積層後面都添加了Batch Normalization層,而且再也不使用droput。使用Batch Normalization後,YOLOv2的mAP提高了2.4%。

2. High Resolution Classifier

目前大部分檢測模型都會先在ImageNet分類數據集上訓練模型的主體部分(CNN特徵提取器),因爲以前ImageNet分類模型基本採用大小爲224x224的圖片做爲輸入,分辨率相對較低,不利於檢測模型。原來的YOLO網絡在預訓練的時候採用的是224*224的輸入(這是由於通常預訓練的分類模型都是在ImageNet數據集上進行的),而後在detection的時候採用448*448的輸入,這會致使從分類模型切換到檢測模型的時候,模型還要適應圖像分辨率的改變。而YOLOv2則將預訓練分紅兩步:先用224*224的輸入從頭開始訓練網絡,大概160個epoch(表示將全部訓練數據循環跑160次),而後再將輸入調整到448*448,再訓練10個epoch。注意這兩步都是在ImageNet數據集上操做。最後再在檢測的數據集上fine-tuning,也就是detection的時候用448*448的圖像做爲輸入就能夠順利過渡了。做者的實驗代表這樣能夠提升幾乎4%的MAP。

3. Convolutionlal With Anchor Boxes

在YOLOv1中,輸入圖片最終被劃分爲7x7網格,每一個網格單元預測兩個bounding box。YOLOV1最後採用的是全鏈接層直接對bounding box進行預測,其中邊界框的寬與高是相對整張圖片大小的,而因爲各個圖片中存在不一樣尺度和長寬比(scales and ratios)的物體,YOLOV1在訓練過程當中學習適應不一樣物體的形狀是比較困難的,這也致使YOLOV1在精肯定位方面表現較差。 
YOLOV2借鑑了Faster R-CNN中的RPN網絡的先驗框(anchor boxes, prior boxes, SSD也採用了先驗框)策略。anchor是RNP網絡中的一個關鍵步驟,說的是在卷積特徵圖上進行滑窗操做,每個中心能夠預測9種不一樣大小的建議框。RPN對CNN特徵提取器獲得的特徵圖(feature map)進行卷積來預測每一個位置的邊界框以及置信度(是否含有物體),而且各個位置設置不一樣尺度和比例的先驗框,因此RPN預測的是邊界框相對於先驗框的offsets值(實際上是transform值,詳細見Faster R_CNN論文),採用先驗框使得模型更容易學習。見下圖

 

@|center|500*400

 

 

因此YOLOv2移除了YOLOv1中的全鏈接層而採用了卷積和anchor boxes來預測邊界框。爲了使檢測所用的特徵圖分辨率更高,移除最後的一個pool層。在檢測模型中,經過縮減網絡,YOLOv2不是採481*418圖片做爲輸入,而是採用416*416大小。由於YOLOv2模型下采樣的總步長爲32,對於416*416大小的圖片,最終獲得的特徵圖大小爲13*13,維度是奇數,這樣特徵圖剛好只有一箇中心位置。對於一些大物體,它們中心點每每落入圖片中心位置,此時使用特徵圖的一箇中心點去預測這些物體的邊界框相對容易些。因此在YOLOv2設計中要保證最終的特徵圖有奇數個位置。 
相對於YOLOV1,每一個grid cell之預測2個bounding boxes,每一個bounding box包含5個值:(x, y, w, h, c),前4個值是邊界框位置與大小,最後一個值是置信度(confidence scores,包含兩部分:含有物體的機率以及預測框與ground truth的IOU)。可是每一個cell只預測一套分類機率值(class predictions,實際上是置信度下的條件機率值),供2個boxes共享。 
YOLOv2使用了anchor boxes以後,每一個位置的各個anchor box都單獨預測一套分類機率值,這和SSD比較相似(但SSD沒有預測置信度,而是把background做爲一個類別來處理)。使用anchor boxes以後,YOLOv2的mAP有稍微降低(這裏降低的緣由,我猜測是YOLOv2雖然使用了anchor boxes,可是依然採用YOLOv1的訓練方法)。YOLOv1只能預測98個(7x7x2)邊界框,而YOLOv2使用anchor boxes以後能夠預測上千個(13x13x num_anchors)邊界框。因此使用anchor boxes以後,YOLOv2的召回率大大提高,由原來的81%升至88%。

 

@預測tensor圖|center

預測tensor圖

 

4. Dimension Clusters

在Faster R-CNN和SSD中,先驗框的維度(長和寬)都是手動設定的,帶有必定的主觀性。若是一開始選取的先驗框維度比較合適,那麼模型更容易學習,從而作出更好的預測。所以,YOLOv2採用k-means聚類方法對訓練集中的邊界框作了聚類分析。由於設置先驗框的主要目的是爲了使得預測框與ground truth的IOU更好,另外做者發現若是採用標準的k-means(即用歐式距離來衡量差別),在box的尺寸比較大的時候其偏差也更大,而咱們但願的是偏差和box的尺寸沒有太大關係。因此聚類分析時選用box與聚類中心box之間的IOU值做爲距離指標:

 

@|center

 


如下爲,爲在VOC和COCO數據集上的聚類分析結果,隨着聚類中心數目的增長,平均IOU值(各個邊界框與聚類中心的IOU的平均值)是增長的,可是綜合考慮模型複雜度和召回率,做者最終選取5個聚類中心做爲先驗框,其相對於圖片的大小如右邊圖所示。對於兩個數據集,5個先驗框的width和height以下所示(來源:YOLO源碼的cfg文件):

 

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

可是這裏先驗框的大小具體指什麼做者並無說明,但確定不是像素點,從代碼實現上看,應該是相對於預測的特徵圖大小(13*13)。對比兩個數據集,也能夠看到COCO數據集上的物體相對小點。這個策略做者並無單獨作實驗,可是做者對比了採用聚類分析獲得的先驗框與手動設置的先驗框在平均IOU上的差別,發現前者的平均IOU值更高,所以模型更容易訓練學習。如圖所示:

@|center|600*500

 

 

5. Direct location prediction

前面講到,YOLOV2借鑑Faster R-CNN中的RPN網絡使用anchor boxes來預測邊界框相對於先驗框的offsets,邊界框的實際中心位置(x,y),須要根據預測的座標偏移值Alt text,先驗框的尺度Alt text 
以及中心座標Alt text(特徵圖每一個位置的中心點)來計算:

 

@|center

 


可是,上面的公式是無約束的,預測的邊界框很容易向任何方向偏移,如當 Alt text時邊界框將享有偏移先驗框的一個寬度大小,可是當 Alt text時,邊界框將向作偏移先驗框的一個寬度大小,所以每一個位置預測的邊界框能夠落在圖片的任何位置,這致使了模型的不穩定性,在訓練時須要很長時間來預測出正確的offsets。  
(可是我以爲的上面的那個公式有點問題,應該把減號改爲加號),由於這個公式是從Faster R-CNN中推導出來的,可見下圖所示。

 

 

@Fatser -R-CNN中的公式|center

Fatser -R-CNN中的公式


在這裏做者並無採用直接預測offset的方法,仍是沿用了YOLO算法中直接預測相對於grid cell的座標位置的方式。  
前面提到網絡在最後一個卷積層輸出13*13大小的feature map,而後每一個cell預測5個bounding box,而後每一個bounding box預測5個值:tx,ty,tw,th和to(這裏的to相似YOLOv1中的confidence)。看下圖,tx和ty通過sigmoid函數處理後範圍在0到1之間,這樣的歸一化處理也使得模型訓練更加穩定;cx和cy表示一個cell和圖像左上角的橫縱距離;pw和ph表示bounding box的寬高,這樣bx和by就是cx和cy這個cell附近的anchor來預測tx和ty獲得的結果。具體的計算公式,以下圖所示:

 

 

@YOLOV2邊界框預測公式|center

YOLOV2邊界框預測公式

 

其中,Alt text爲cell的左上角座標,如圖5所示,在計算時每一個cell的尺度爲1,因此當前cell的左上角座標爲(1, 1)。因爲sigmoid函數的處理,邊界框的中心位置會約束在當前cell內部,防止偏移過多。而Alt textAlt text是先驗框的寬度與長度,前面說過它們的值也是相對於特徵圖大小的,在特徵圖中每一個cell的長和寬均爲1。這裏及特徵圖的大小爲Alt text(在文中是(13,13)),這樣咱們能夠將邊界框相對於整張圖片的位置和大小計算出來(4個值均在0和1之間):

 

@|center

 

 

若是再將上面的4個值分別乘以圖片的寬度和長度(像素點值)就能夠獲得邊界框的最終位置和大小了。這就是YOLOv2邊界框的整個解碼過程。約束了邊界框的位置預測值使得模型更容易穩定訓練,結合聚類分析獲得先驗框與這種預測方法,YOLOv2的mAP值提高了約5%。 
若是對上面的公式不理解,能夠看下圖,首先是cx和cy,表示grid cell與圖像左上角的橫縱座標距離,黑色虛線框是bounding box,藍色矩形框就是預測的結果。

 

@|center

 

 

6. Fine-Grained Features(passthrough)

YOLOv2的輸入圖片大小爲416*416,通過5次maxpooling以後獲得13*13大小的特徵圖,並以此特徵圖採用卷積作預測。13*13大小的特徵圖對檢測大物體是足夠了,可是對於小物體還須要更精細的特徵圖(Fine-Grained Features)。所以SSD使用了多尺度的特徵圖來分別檢測不一樣大小的物體,前面更精細的特徵圖能夠用來預測小物體。YOLOv2提出了一種passthrough層來利用更精細的特徵圖。YOLOv2所利用的Fine-Grained Features是26*26大小的特徵圖(最後一個maxpooling層的輸入),對於Darknet-19模型來講就是大小爲26*26*512的特徵圖。passthrough層與ResNet網絡的shortcut相似,之前面更高分辨率的特徵圖爲輸入,而後將其鏈接到後面的低分辨率特徵圖上。前面的特徵圖維度是後面的特徵圖的2倍,passthrough層抽取前面層的每一個2*2的局部區域,而後將其轉化爲channel維度,對於26*26*512的特徵圖,經passthrough層處理以後就變成了13*13*2048的新特徵圖(特徵圖大小下降4倍,而channles增長4倍,圖6爲一個實例),這樣就能夠與後面的13*13*1024特徵圖鏈接在一塊兒造成13*13*3072的特徵圖,而後在此特徵圖基礎上卷積作預測。在YOLO的C源碼中,passthrough層稱爲reorg layer。在TensorFlow中,可使用tf.extract_image_patches或者tf.space_to_depth來實現passthrough層:

out = tf.extract_image_patches(in, [ 1, stride, stride, 1], [1, stride, stride, 1], [1,1,1,1], padding="VALID")
// or use tf.space_to_depth
out = tf.space_to_depth(in, 2)

 

@|center

 

 

另外,做者在後期的實現中借鑑了ResNet網絡,不是直接對高分辨特徵圖處理,而是增長了一箇中間卷積層,先採用64個1*1卷積核進行卷積,而後再進行passthrough處理,這樣26*26*512的特徵圖獲得13*13*256的特徵圖。這算是實現上的一個小細節。使用Fine-Grained Features以後YOLOv2的性能有1%的提高。 

7. Multi-Scale Training(多尺度訓練)

因爲YOLOv2模型中只有卷積層和池化層,因此YOLOv2的輸入能夠不限於416*416大小的圖片。爲了加強模型的魯棒性,YOLOv2採用了多尺度輸入訓練策略,具體來講就是在訓練過程當中每間隔必定的iterations以後改變模型的輸入圖片大小。因爲YOLOv2的下采樣總步長爲32,輸入圖片大小選擇一系列爲32倍數的值:輸入圖片最小爲320*320,此時對應的特徵圖大小爲10*10(不是奇數了,確實有點尷尬),而輸入圖片最大爲608*608,對應的特徵圖大小爲19*19,在訓練過程,每隔10個iterations隨機選擇一種輸入圖片大小,而後只須要修改對最後檢測層的處理就能夠從新訓練。

 

@|center

 


採用Multi-Scale Training策略,使得YOLOV2能夠適應不一樣大小的圖片,對不一樣分辨率的圖像進行檢測,而且預測出很好的結果。在測試時,YOLOV2能夠採用不一樣大小的圖片做爲輸入,在VOC 2007數據集上的效果以下圖所示。能夠看到採用較小分辨率時,YOLOv2的mAP值略低,可是速度更快,而採用高分辨輸入時,mAP值更高,可是速度略有降低,對於544*544,mAP高達78.6%。注意,這只是測試時輸入圖片大小不一樣,而實際上用的是同一個模型(採用Multi-Scale Training訓練)。

 

 

@|center

 

 

8. Further Experiments

做者在VOC2012上對YOLOv2進行訓練,下圖是和其餘方法的對比。YOLOv2精度達到了73.4%,而且速度更快。同時YOLOV2也在COCO上作了測試(IOU=0.5),也和Faster R-CNN、SSD做了成績對比。總的來講,比上不足,比下有餘。

 

@|center

 

 

 

@|center

 

 

總的看下這些技巧對mAP的貢獻:

 

@|center

 


High Resolution Classifier的提高很是明顯(近4%),另外經過結合dimension prior+localtion prediction這兩種方式引入anchor也能帶來近5%mAP的提高。

 

Faster

YOLO一貫是速度和精度並重,做者爲了改善檢測速度,也做了一些相關工做。 
大多數檢測網絡有賴於VGG-16做爲特徵提取部分,VGG-16的確是一個強大而準確的分類網絡,可是複雜度有些冗餘。224 * 224的圖片進行一次前向傳播,其卷積層就須要多達306.9億次浮點數運算。 
在YOLO v1中,做者採用的訓練網絡是基於GooleNet,這裏做者將GooleNet和VGG16作了簡單的對比,GooleNet在計算複雜度上要優於VGG16(8.25 billion operation VS 30.69 billion operation),可是前者在ImageNet上的top-5準確率要稍低於後者(88% VS 90%)。 
YOLOv2使用的是基於Googlenet的定製網絡,比VGG-16更快,一次前向傳播僅需85.2億次運算。但是它的精度要略低於VGG-16,單張224 * 224取前五個預測機率的對比成績爲88%和90%(低一點點也是能夠接受的),即做者採用了新的分類模型做爲基礎網絡,那就是Darknet-19。

New Network:Darknet-19

YOLOv2採用了一個新的基礎模型(特徵提取器),稱爲Darknet-19,包括19個卷積層和5個maxpooling層,在YOLO v1中採用的GooleNet,包含24個卷積層和2個全鏈接層,如圖4所示。Darknet-19與VGG16模型設計原則是一致的,主要採用3*3卷積,採用2*2的maxpooling層以後,特徵圖維度下降2倍,而同時將特徵圖的channles增長兩倍。與NIN(Network in Network)相似,Darknet-19最終採用global avg pooling作預測,而且在3*3卷積之間使用1*1卷積來壓縮特徵圖channles以下降模型計算量和參數。Darknet-19每一個卷積層後面一樣使用了batch norm層以加快收斂速度,下降模型過擬合。在ImageNet分類數據集上,Darknet-19的top-1準確度爲72.9%,top-5準確度爲91.2%,可是模型參數相對小一些。使用Darknet-19以後,YOLOv2的mAP值沒有顯著提高,可是計算量卻能夠減小約33%。

 

@|center|500*650

 

 

Training for classification and Training for detection

YOLOv2的訓練主要包括三個階段。第一階段就是先在ImageNet分類數據集上預訓練Darknet-19,此時模型輸入爲224*224,共訓練160個epochs。而後第二階段將網絡的輸入調整爲448*448,繼續在ImageNet數據集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度爲76.5%,而top-5準確度爲93.3%。第三個階段就是修改Darknet-19分類模型爲檢測模型,並在檢測數據集上繼續finetune網絡。網絡修改包括(網路結構可視化):移除最後一個卷積層、global avgpooling層以及softmax層,而且新增了三個3*3*2014卷積層,同時增長了一個passthrough層,最後使用1*1卷積層輸出預測結果,輸出的channels數爲:Alt text,和訓練採用的數據集有關係。因爲anchors數爲5,對於VOC數據集輸出的channels數就是125,而對於COCO數據集則爲425。這裏以VOC數據集爲例,最終的預測矩陣爲T(shape爲Alt text,能夠先將其reshape爲Alt text,其中Alt text爲邊界框的位置和大小,Alt textAlt text爲邊界框的置信度,而Alt text爲類別預測值。

 

@YOLOV2網絡模型|center

YOLOV2網絡模型

 

 

@|center

 

 

 

@|center

 

 

YOLOv2的網絡結構以及訓練參數咱們都知道了,可是貌似少了點東西。仔細一想,原來做者並無給出YOLOv2的訓練過程的兩個最重要方面,即先驗框匹配(樣本選擇)以及訓練的損失函數,難怪Ng說YOLO論文很難懂,沒有這兩方面的說明咱們確實不知道YOLOv2究竟是怎麼訓練起來的。不過默認按照YOLOv1的處理方式也是能夠處理,我看了YOLO在TensorFlow上的實現darkflow(見yolov2/train.py),發現它就是如此處理的:和YOLOv1同樣,對於訓練圖片中的ground truth,若其中心點落在某個cell內,那麼該cell內的5個先驗框所對應的邊界框負責預測它,具體是哪一個邊界框預測它,須要在訓練中肯定,即由那個與ground truth的IOU最大的邊界框預測它,而剩餘的4個邊界框不與該ground truth匹配。YOLOv2一樣須要假定每一個cell至多含有一個grounth truth,而在實際上基本不會出現多於1個的狀況。與ground truth匹配的先驗框計算座標偏差、置信度偏差(此時target爲1)以及分類偏差,而其它的邊界框只計算置信度偏差(此時target爲0)。YOLOv2和YOLOv1的損失函數同樣,爲均方差函數。可是我看了YOLOv2的源碼(訓練樣本處理與loss計算都包含在文件region_layer.c中,YOLO源碼沒有任何註釋,反正我看了是直搖頭),而且參考國外的blog以及allanzelener/YAD2K(Ng深度學習教程所參考的那個Keras實現)上的實現,發現YOLOv2的處理比原來的v1版本更加複雜。先給出loss計算公式:

 

@損失函數|center

損失函數

 

咱們來一點點解釋,首先W,H分別指的是特徵圖(13*13)的寬與高,而A指的是先驗框數目(這裏是5),各個

@|25*25

 

值是各個loss部分的權重係數。第一項loss是計算background的置信度偏差,可是哪些預測框來預測背景呢,須要先計算各個預測框和全部ground truth的IOU值,而且取最大值Max_IOU,若是該值小於必定的閾值(YOLOv2使用的是0.6),那麼這個預測框就標記爲background,須要計算noobj的置信度偏差。第二項是計算先驗框與預測寬的座標偏差,可是隻在前12800個iterations間計算,我以爲這項應該是在訓練前期使預測框快速學習到先驗框的形狀。第三大項計算與某個ground truth匹配的預測框各部分loss值,包括座標偏差、置信度偏差以及分類偏差。先說一下匹配原則,對於某個ground truth,首先要肯定其中心點要落在哪一個cell上,而後計算這個cell的5個先驗框與ground truth的IOU值(YOLOv2中bias_match=1),計算IOU值時不考慮座標,只考慮形狀,因此先將先驗框與ground truth的中心點都偏移到同一位置(原點),而後計算出對應的IOU值,IOU值最大的那個先驗框與ground truth匹配,對應的預測框用來預測這個ground truth。在計算obj置信度時,在YOLOv1中target=1,而YOLOv2增長了一個控制參數rescore,當其爲1時,target取預測框與ground truth的真實IOU值。對於那些沒有與ground truth匹配的先驗框(與預測框對應),除去那些Max_IOU低於閾值的,其它的就所有忽略,不計算任何偏差。這點在YOLOv3論文中也有相關說明:YOLO中一個ground truth只會與一個先驗框匹配(IOU值最好的),對於那些IOU值超過必定閾值的先驗框,其預測結果就忽略了。這和SSD與RPN網絡的處理方式有很大不一樣,由於它們能夠將一個ground truth分配給多個先驗框。儘管YOLOv2和YOLOv1計算loss處理上有不一樣,但都是採用均方差來計算loss。另外須要注意的一點是,在計算boxes的和偏差時,YOLOv1中採用的是平方根以下降boxes的大小對偏差的影響,而YOLOv2是直接計算,可是根據ground truth的大小對權重係數進行修正:l.coord_scale * (2 - truth.w*truth.h),這樣對於尺度較小的boxes其權重係數會更大一些,起到和YOLOv1計算平方根類似的效果(參考YOLO v2 損失函數源碼分析)。

 

最終的YOLOv2模型在速度上比YOLOv1還快(採用了計算量更少的Darknet-19模型),並且模型的準確度比YOLOv1有顯著提高,詳情見paper。

Stronger

Dataset combination with WordTree
Joint classification and detection

在這一步提出YOLO9000,YOLO9000是在YOLOv2的基礎上提出的一種能夠檢測超過9000個類別的模型,其主要貢獻點在於提出了一種分類和檢測的聯合訓練策略。衆多周知,檢測數據集的標註要比分類數據集打標籤繁瑣的多,因此ImageNet分類數據集比VOC等檢測數據集高出幾個數量級。在YOLO中,邊界框的預測其實並不依賴於物體的標籤,因此YOLO能夠實如今分類和檢測數據集上的聯合訓練。對於檢測數據集,能夠用來學習預測物體的邊界框、置信度以及爲物體分類,而對於分類數據集能夠僅用來學習分類,可是其能夠大大擴充模型所能檢測的物體種類。 
做者選擇在COCO和ImageNet數據集上進行聯合訓練,可是遇到的第一問題是二者的類別並非徹底互斥的,好比」Norfolk terrier」明顯屬於」dog」,因此做者提出了一種層級分類方法(Hierarchical classification),主要思路是根據各個類別之間的從屬關係(根據WordNet)創建一種樹結構WordTree,結合COCO和ImageNet創建的WordTree以下圖所示:

 

@|center

 


WordTree中的根節點爲」physical object」,每一個節點的子節點都屬於同一子類,能夠對它們進行softmax處理。在給出某個類別的預測機率時,須要找到其所在的位置,遍歷這個path,而後計算path上各個節點的機率之積。

 

 

@|center

 


在訓練時,若是是檢測樣本,按照YOLOv2的loss計算偏差,而對於分類樣本,只計算分類偏差。在預測時,YOLOv2給出的置信度就是 Alt text,同時會給出邊界框位置以及一個樹狀機率圖。在這個機率圖中找到機率最高的路徑,當達到某一個閾值時中止,就用當前節點表示預測的類別。

 

conclusion

經過聯合訓練策略,YOLO9000能夠快速檢測出超過9000個類別的物體,整體mAP值爲19,7%。我以爲這是做者在這篇論文做出的最大的貢獻,由於YOLOv2的改進策略亮點並非很突出,可是YOLO9000算是開創之舉。

YOLOV3

出自:arXiv 2018 時間:2018.08 引用:111 
Redmon J, Farhadi A. Yolov3: An incremental improvement[J]. arXiv preprint arXiv:1804.02767, 2018. 
論文連接:https://pjreddie.com/media/files/papers/YOLOv3.pdf 
YOLOv3論文地址:https://arxiv.org/abs/1804.02767 
blog: https://blog.csdn.net/u014380165/article/details/80202337 ** 
blog:http://www.javashuo.com/article/p-trjlevnl-br.html * 
blog :https://blog.csdn.net/wfei101/article/details/80011474 
源碼code:https://pjreddie.com/yolo/ 
blog: https://blog.paperspace.com/tag/series-yolo/,其中part1是介紹YOLO算法相關的基礎知識,part2到part5是介紹如何用PyTorch實現YOLO v3算法,很是推薦 
pytorch: YOLOv3實現 https://blog.csdn.net/l7H9JA4/article/details/80655711 
pytorch 代碼1:https://github.com/Codermay/PyTorch-YOLOv3 註釋:https://github.com/Codermay/eriklindernoren-PyTorch-YOLOv3-chinese-comment (訓練的損失函數有點問題) 
pytorch 代碼2:https://github.com/Codermay/yolov3-1 (闊以看看) 
pytorch實現:https://github.com/Codermay/pytorch-yolo-v3 能夠跑跑 
pytorch 靠譜實現:https://github.com/ultralytics/yolov3 ** 向老 
pytorch : https://github.com/DeNA/PyTorch_YOLOv3 新出的

motivation

  • 主要敘述了做者這一年來在YOLOV3上作的工做,算是一個技術報告類型的東西,做者主要介紹了YOLOV3的整個技術流程,而且借鑑別人工做的方法來進行算法精度和速度上的改進,而且與現有的方法進行對比。

  • 此外,介紹了做者嘗試的幾個沒有成功的改進。

background

YOLO算法的基本思想是:首先經過特徵提取網絡對輸入圖像提取特徵,獲得必定size的feature map,好比13*13,而後將輸入圖像分紅13*13個grid cell,接着若是ground truth中某個object的中心座標落在哪一個grid cell中,那麼就由該grid cell來預測該object,由於每一個grid cell都會預測固定數量的bounding box(YOLO v1中是2個,YOLO v2中是5個,YOLO v3中是3個,這幾個bounding box的初始size是不同的),那麼這幾個bounding box中最終是由哪個來預測該object?答案是:這幾個bounding box中只有和ground truth的IOU最大的bounding box纔是用來預測該object的。能夠看出預測獲得的輸出feature map有兩個維度是提取到的特徵的維度,好比13*13,還有一個維度(深度)是B*(5+C),注:YOLO v1中是(B*5+C),其中B表示每一個grid cell預測的bounding box的數量,好比YOLO v1中是2個,YOLO v2中是5個,YOLO v3中是3個,C表示bounding box的類別數(沒有背景類,因此對於VOC數據集是20),5表示4個座標信息和一個置信度(objectness score)。算法在速度和精度上的提高能夠看下圖。

 

@|center

 

 

methods

Bounding Box Prediction

bounding box的座標預測方式仍是延續了YOLO v2的作法,簡單講就是下面這個截圖的公式,tx、ty、tw、th就是模型的預測輸出。cx和cy表示grid cell的座標,好比某層的feature map大小是13*13,那麼grid cell就有13*13個,第0行第1列的grid cell的座標cx就是1,cy就是0。pw和ph表示預測前bounding box的size。bx、by。bw和bh就是預測獲得的bounding box的中心的座標和size。座標的損失採用的是平方偏差損失(sum of squared error loss)。

 

@|center

 

 

 

@|center

 


YOLOV3利用logistics regression爲每一個bounding box預測objectness score(Faster R-CNN 中的RPN)。若是預測的bounding box與ground truth重疊(overlaps: IOU??)的地方最多,則objectness score爲1;若是預測的bounding box不是最好的,可是和ground truth object的重疊也超過了一個閾值threshold,(遵循Faster R-CNN)則忽略這個bounding box(不獎勵也不懲罰的機制)。與Fatser R-CNN中不一樣的是,YOLOV3爲每一個ground truth只分配一個bounding box。若是這個bounding box沒有被分配給ground truth,則再算loss的時候不會計算這個bounding box的coordinate以及class predictions的loss,只計算objectness score loss。

 

Class Prediction

類別預測方面主要是將原來的單標籤分類改進爲多標籤分類,所以網絡結構上就將原來用於單標籤多分類的softmax層換成用於多標籤多分類的邏輯迴歸層。首先說明一下爲何要作這樣的修改,原來分類網絡中的softmax層都是假設一張圖像或一個object只屬於一個類別,可是在一些複雜場景下,一個object可能屬於多個類,好比你的類別中有woman和person這兩個類,那麼若是一張圖像中有一個woman,那麼你檢測的結果中類別標籤就要同時有woman和person兩個類,這就是多標籤分類,須要用邏輯迴歸層來對每一個類別作二分類。邏輯迴歸層主要用到sigmoid函數,該函數能夠將輸入約束在0到1的範圍內,所以當一張圖像通過特徵提取後的某一類輸出通過sigmoid函數約束後若是大於0.5,就表示屬於該類。

Predictions Across Scales

YOLO v3採用多個scale融合的方式作預測。原來的YOLO v2有一個層叫:passthrough layer,假設最後提取的feature map的size是13*13,那麼這個層的做用就是將前面一層的26*26的feature map和本層的13*13的feature map進行鏈接,有點像ResNet。當時這麼操做也是爲了增強YOLO算法對小目標檢測的精確度。這個思想在YOLO v3中獲得了進一步增強,在YOLO v3中採用相似FPN的upsample和融合作法(最後融合了3個scale,其餘兩個scale的大小分別是26*26和52*52),在多個scale的feature map上作檢測,對於小目標的檢測效果提高仍是比較明顯的。前面提到過在YOLO v3中每一個grid cell預測3個bounding box,看起來比YOLO v2中每一個grid cell預測5個bounding box要少,其實不是!由於YOLO v3採用了多個scale的特徵融合,因此boundign box的數量要比以前多不少,以輸入圖像爲416*416爲例:(13*13+26*26+52*52)*3和13*13*5相比哪一個更多應該很清晰了。

關於bounding box的初始尺寸仍是採用YOLO v2中的k-means聚類的方式來作,這種先驗知識對於bounding box的初始化幫助仍是很大的,畢竟過多的bounding box雖然對於效果來講有保障,可是對於算法速度影響仍是比較大的。做者在COCO數據集上獲得的9種聚類結果:(10*13); (16*30); (33*23); (30*61); (62*45); (59*119); (116*90); (156*198); (373*326),這應該是按照輸入圖像的尺寸是416*416計算獲得的。

 

@|center

 

 

Feature Extractor

網絡結構(Darknet-53)一方面基本採用全卷積(YOLO v2中採用pooling層作feature map的sample,這裏都換成卷積層來作了),另外一方面引入了residual結構(YOLO v2中仍是相似VGG那樣直筒型的網絡結構,層數太多訓起來會有梯度問題,因此Darknet-19也就19層,所以得益於ResNet的residual結構,訓深層網絡難度大大減少,所以這裏能夠將網絡作到53層,精度提高比較明顯)。Darknet-53只是特徵提取層,源碼中只使用了pooling層前面的卷積層來提取特徵,所以multi-scale的特徵融合和預測支路並無在該網絡結構中體現,具體信息可看源碼:https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg 
預測支路採用的也是全卷積的結構,其中最後一個卷積層的卷積核個數是255,是針對COCO數據集的80類:3*(80+4+1)=255,3表示一個grid cell包含3個bounding box,4表示框的4個座標信息,1表示objectness score。模型訓練方面仍是採用原來YOLO v2中的multi-scale training。

 

@YOLOV3所用的Darknet-53模型|center

YOLOV3所用的Darknet-53模型

 

 

@YOLOv3網絡結構示意圖(VOC數據集)|center

YOLOv3網絡結構示意圖(VOC數據集)

 

Training

模型訓練方面仍是對整張圖進行訓練,沒有進行難樣本挖掘等。而且仍是採用原來YOLO v2中的multi-scale training,許多data augmentation,batch normalization等。

experiments

YOLOv3與其它檢測模型的對好比下圖所示,能夠看到在速度上YOLOv3完勝其它方法,雖然AP值並非最好的(若是比較AP-0.5,YOLOv3優點更明顯)。

 

@|center

 


Table2是幾個網絡在ImageNet數據集上的性能和精度對比。能夠看出Darknet-53的性能仍是很是不錯的。

 

 

@|center

 


YOLO v3的實驗結果對比能夠看Table3。原來YOLO v2對於小目標的檢測效果是比較差的,經過引入多尺度特徵融合的方式,能夠看出YOLO v3的APS要比YOLO v2的APS高出很多。

 

 

@|center

 


最後這張圖很是有意思,直接用All the other slow ones來表明其餘算法,實實在在展示了本篇文章隨性的風格。

 

 

@|center

 

 

conclusion

YOLOv3發佈了,可是正如做者所說,這僅僅是他們近一年的一個工做報告(TECH REPORT),不算是一個完整的paper,由於他們其實是把其它論文的一些工做在YOLO上嘗試了一下。相比YOLOv2,我以爲YOLOv3最大的變化包括兩點:使用殘差模型和採用FPN架構。YOLOv3的特徵提取器是一個殘差模型,由於包含53個卷積層,因此稱爲Darknet-53,從網絡結構上看,相比Darknet-19網絡使用了殘差單元,因此能夠構建得更深。另一個點是採用FPN架構(Feature Pyramid Networks for Object Detection)來實現多尺度檢測。YOLOv3採用了3個尺度的特徵圖(當輸入爲416*416時):(13*13),(26*26),(52*52),VOC數據集上的YOLOv3網絡結構如圖15所示,其中紅色部分爲各個尺度特徵圖的檢測結果。YOLOv3每一個位置使用3個先驗框,因此使用k-means獲得9個先驗框,並將其劃分到3個尺度特徵圖上,尺度更大的特徵圖使用更小的先驗框,和SSD相似。 
從YOLO的三代變革中能夠看到,在目標檢測領域比較好的策略包含:設置先驗框,採用全卷積作預測(去除了pooling),採用殘差網絡,採用多尺度特徵圖作預測。一樣做者還作了一下幾種嘗試,可是效果很差:

  • Anchor box x; y offset predictions. We tried using the normal anchor box prediction mechanism where you predict the x; y offset as a multiple of the box width or height using a linear activation. We found this formulation decreased model stability and didn’t work very well.

  • Linear x; y predictions instead of logistic. We tried using a linear activation to directly predict the x; y offset instead of the logistic activation. This led to a couple point drop in mAP.

  • Focal loss. We tried using focal loss. It dropped our mAP about 2 points. YOLOv3 may already be robust to the problem focal loss is trying to solve because it has separate objectness predictions and conditional class predictions. Thus for most examples there is no loss from the class predictions? Or something? We aren’t totally sure.

相關文章
相關標籤/搜索