# YOLOv1-v4(上) ## 全名You Only Look Once **V1:** [You Only Look Once: Unified, Real-Time Object Detection](https://arxiv.org/abs/1506.02640) **V2:** [YOLO9000: Better, Faster, Stronger](https://arxiv.org/abs/1612.08242) **V3:** [YOLOv3: An Incremental Improvement](https://arxiv.org/abs/1804.02767) **V4** [YOLOv4: Optimal Speed and Accuracy of Object Detection](https://arxiv.org/abs/2004.10934) ## 整理的ppt簡報下載:[網址](https://drive.google.com/drive/folders/1TJMFrk1aMQanjHsX_rIu2RrfebnZ7iSt?usp=sharing) ###### tags: `papper` --- ![](https://i.imgur.com/C7URmpU.png) ## YOLOv1 ![](https://i.imgur.com/adGotck.jpg) 輸入影像大小為448x448, 變為7x7x1024張量(圖一中倒數第三個立方體), 最後經過兩層全連接層,輸出張量維度為7x7x30, 分類網絡最後的全連接層, 一般連接於一個一維向量, 向量的不同比特代表不同類別, 而這裡的輸出向量是一個三維的張量(7x7x30)。 backbone,Darknet的先鋒。用了一層Dropout。 除了最後一層的輸出使用了線性啟動函數, 其他層全部使用Leaky Relu啟動函數。 ![](https://i.imgur.com/WgisbGq.png) (1)7x7的含義 ![](https://i.imgur.com/aO9TaYE.png) 7x7是指圖片被分成了7x7個格子,如下所示: 在Yolo中,如果一個物體的中心點,落在了某個格子中,那麼這個格子將負責預測這個物體。 這句話怎麼理解,用上圖舉例,設左下角格子假設座標為[1,1],小狗所在的最小包圍矩形框的中心,落在了[2,3]這個格子中。 那麼7x7個格子中,[2,3]這個格子負責預測小狗,而那些沒有物體中心點落進來的格子,則不負責預測任何物體。 這個設定就好比該網絡在一開始,就將整個圖片上的預測任務進行了分工, (2)30的含義 剛才設定了49個檢測人員,檢測的內容,就是30 30是由[(4+1)x2+20]得到的。 其中4+1是矩形框的中心點座標x,y, 長寬w,h以及是否屬於被檢測物體的置信度c; 2是一個格子共回歸兩個矩形框,每個矩形框分別產生5個預測值(x,y,w,h,c); 20代表預測20個類別。 1. 每個方格(grid)產生2個預測框, 2. 2也是參數,可以調,但是一旦設定為2以後,那麼每個方格只產生兩個矩形框,最後選定置信度更大的矩形框作為輸出,也就是最終每個方格只輸出一個預測矩形框。 3. 每個方格只能預測一個物體。 雖然可以通過調整參數,產生不同的矩形框,但這只能提高矩形框的精度。 所以當有很多個物體的中心點落在了同一個格子裏,該格子只能預測一個物體。 也就是格子數為7x7時,該網絡最多預測49個物體。 --- ### LOSS ![](https://i.imgur.com/mX873It.png) 預測框的中心點[x,y]。 造成的損失是圖五中的第一行。 其中![](https://i.imgur.com/arTj7U6.png) 為控制函數,在標籤中包含物體的那些格點處,該值為1; 若格點不含有物體,該值為0。 也就是只對那些有真實物體所屬的格點進行損失計算,若該格點不包含物體,那麼預測數值不對損失函數造成影響。 [x,y]數值與標籤用簡單的平方和誤差。 預測框的寬高(w,h)。 造成的損失是圖五的第二行。![](https://i.imgur.com/qZdYY9n.png) 的含義一樣,也是使得只有真實物體所屬的格點才會造成損失。 這裡對(w,h)在損失函數中的處理分別取了根號,原因在於,如果不取根號,損失函數往往更傾向於調整尺寸比較大的預測框。 例如,20個點數點的偏差,對於800x600的預測框幾乎沒有影響,此時的IOU數值還是很大,但是對於30x40的預測框影響就很大。 取根號是為了盡可能的消除大尺寸框與小尺寸框之間的差异。 第三行與第四行,都是預測框的置信度C。 當該格點不含有物體時,該置信度的標籤為0; 若含有物體時,該置信度的標籤為預測框與真實物體框的IOU數值(IOU計算公式為:兩個框交集的面積除以並集的面積)。 第五行為物體類別概率P,對應的類別位置,該標籤數值為1,其餘位置為0,與分類網絡相同。 在論文中, ![](https://i.imgur.com/Y5oNb5q.png) 與![](https://i.imgur.com/9jaR33e.png) 的取值分別為5與0.5。 --- **回歸offset代替直接回歸座標** [x,y]不直接回歸中心點座標數值,而是回歸相對於格點左上角座標的位移值。 例如,第一個格點中物體座標為[2.3,3.6],另一個格點中的物體座標為[5.4,6.3],這四個數值讓神經網路暴力回歸,有一定難度。 所以這裡的offset是指,既然格點已知,那麼物體中心點的座標一定在格點正方形裏,相對於格點左上角的位移值一定在區間[0,1]中。讓神經網路去預測[0.3,0.6]與[0.4,0.3]會更加容易,在使用時,加上格點左上角座標[2.3]、[5.6]即可。 **同一格點的不同預測框有不同作用** 每個格點預測兩個或多個矩形框。 那麼在訓練時,見到一個真實物體,我們是希望兩個框都去逼近這個物體的真實矩形框,還是只用一個去逼近? 或許通常來想,讓兩個人一起去做同一件事,比一個人做一件事成功率要高,所以可能會讓兩個框都去逼近這個真實物體。 但是作者沒有這樣做,在損失函數計算中,只對和真實物體最接近的框計算損失,其餘框不進行修正。 這樣操作之後作者發現,一個格點的兩個框在尺寸、長寬比、或者某些類別上逐漸有所分工,總體的召回率有所提升。 **使用NMS** ![](https://i.imgur.com/H6cvXrN.png) * Run 1: 信心程度最高的BBox (紅色) 選入「確定是物件集合」 其他BBox會看這步驟選出最高的BBox進行IoU計算, 如果粉紅色的IoU為0.6大於我們設定的0.5, 所以將粉紅色的BBox信心度設置為0。 「確定是物件集合」= {紅色BBox } * Run 2: 不考慮信心度為0和已經在「確定是物件集合」的BBox,剩下來的物件選出最大信心的BBox,將此BBox(黃色)丟入「確定是物件集合」,剩下的BBox和Run2選出的最大信心的BBox計算IoU,其他BBox都大於0.5,所以其他的BBox信心度設置為0。 * 因為沒有物件信心度>0,所以結束NMS。 「確定是物件集合」= {紅色BBox; 黃色BBox}。 --- ![](https://i.imgur.com/wWWQ3Ag.png) 這樣也可以過濾掉一些大部分重疊的矩形框。 輸出檢測物體的置信度, 同時考慮了矩形框與類別,滿足閾值的輸出更加可信 --- # YOLOv2(YOLO9000) ![](https://i.imgur.com/SPvTSN3.png) Yolov2和Yolo9000算法內核相同,區別是訓練管道不同:Yolov2用coco數据集訓練後,可以識別80個種類。 而Yolo9000可以使用coco數据集+ ImageNet數据集聯合訓練,可以識別9000多個種類。 圖一為Yolo9000的檢測效果圖,可以看到圖片中的人,被分為了leader、American、skin-diver、athlete。 採用:歸一化、多尺度訓練,v2也嘗試借鑒了R-CNN體系中的anchor box **訓練過程** YOLO2的訓練主要包括三個階段。 第一階段就是先在ImageNet分類數据集上預訓練Darknet-19,此時模型輸入為224x224,共訓練160個epochs。 第二階段將網絡的輸入調整為448x448,繼續在ImageNet數据集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度為76.5%,而top-5準確度為93.3%。 第三個階段就是修改Darknet-19分類模型為檢測模型,移除最後一個卷積層、global avgpooling層以及softmax層,並且新增了三個3x3x1024卷積層,同時新增了一個passthrough層,最後使用1x1卷積層輸出預測結果,輸出的channels數為:num_ anchors x (5+num_classes)。 **Darknet19** ![](https://i.imgur.com/OYtxiSu.png) Darknet-19,該架構的網路參數較VGG-16更少 在ImageNet上,仍然可以達到top-1 72.9%以及top-5 91.2%的精度。 **passthrough層** 本質其實就是特徵重排,26x26x512的feature map分別按行和列隔點採樣,可以得到4幅13x13x512的特徵,把這4張特徵按channel串聯起來,就是最後的13x13x2048的feature map.還有就是,passthrough layer本身是不學習參數的,直接用前面的層的特徵重排后拼接到後面的層, 越在網路前面的層,感受野越小,有利於小目標的檢測。 **歸一化** 在Yolo的每個捲積層中加入BN之後,mAP提升了2% ![](https://i.imgur.com/B4GFkpf.png) Batch Normalization 的作法就是對每一個 mini-batch 都進行正規化到平均值為0、標準差為1的常態分佈,如此一來可以將分散的數據統一,有助於減緩梯度消失以及解決 Internal Covariate Shift 的問題,同時可以加速收斂,並且有正則化的效果 (可以不使用Dropout) **Anchor Box替換全連接層** * v2中移除兩層全連接層 * 網路預測Anchor框的偏差(offset),每個格點指定n個Anchor框。 在訓練時,最接近ground truth的框產生loss,其餘框不產生loss。 **Anchor寬高比** Faster R-CNN中的九個Anchor Box的寬高是事先設定好的比例大小,一共設定三個面積大小的矩形框,每個矩形框有三個寬高比:1:1,2:1,1:2,總共九個框。 v2中,Anchor Box的寬高不經過人為獲得, 而是將訓練數據集中的矩形框全部拿出來, 用kmeans聚類得到先驗框的寬和高。 例如使用5個Anchor Box, 那麼kmeans聚類的類別中心個數設置為5。(mAP上升) --- **多尺度訓練** v2中只有捲積層與池化層,所以對於網路的輸入大小,並沒有限制,整個網路的降採樣倍數為32,只要輸入的特徵圖尺寸為32的倍數即可,如果網路中有全連接層,就不是這樣了。 所以Yolo v2可以使用不同尺寸的輸入圖片訓練。 作者使用的訓練方法是, 在每10個batch之後,就將圖片resize成 {320, 352, ..., 608}中的一種。 不同的輸入, 最後產生的格點數不同,比如輸入圖片是320x320,那麼輸出格點是10x10,如果每個格點的先驗框個數設置為5,那麼總共輸出500個預測結果;如果輸入圖片大小是608x608,輸出格點就是19x19,共1805個預測結果。 **位置預測** ![](https://i.imgur.com/PYIgoyF.png) ![](https://i.imgur.com/KDAx2x1.png) * V2提出了預測的新公式, 直接對anchor box點的偏移位置進行預測 * 而sigma函數用來約束其可能的偏移範圍(相對於Grid Cell的坐標位置) * 通過預測tx和ty來得到bound box中心座標(bx, by)值 * cx和cy是當前網格左上角到圖像左上角的距離 * σ函數將約束在(0,1)範圍內,所以根據上面的計算公式, * 預測邊框的藍色中心點被約束在藍色背景的網格內。約束邊框位置使得模型更容易學習,且預測更為穩定 * 因為自然對數e表示「增長的極限」,所以在這邊以e為底以scale放大率為次方,計算出數值的自然放大倍率 **Dataset with WordTree** ![](https://i.imgur.com/5wld0et.png) 樹結構表示物體之間的從屬關係非常合適,第一個大類,物體,物體之下有動物、人工製品、自然物體等,動物中又有更具體的分類。 此時,在類別中,不對所有的類別進行softmax操作,而對同一層級的類別進行softmax: ![](https://i.imgur.com/k4hHN5y.png) 如圖中所示,同一顏色的位置,進行softmax操作,使得同一顏色中只有一個類別預測分值最大。 在預測時,從樹的根節點開始向下檢索,每次選取預測分值最高的子節點,直到所有選擇的節點預測分值連乘后小於某一閾值時停止。 在訓練時,如果標籤為人,那麼只對人這個節點以及其所有的父節點進行loss計算,而其子節點,男人、女人、小孩等,不進行loss計算。 問題:只有當父節點在檢測集中出現過,子節點的預測才會有效。 如果子節點是褲子、T恤、裙子等,而父節點衣服在檢測集中沒有出現過,那麼整條預測類別支路幾乎都是檢測失效的狀態。 --- --- # YOLOv3 ![](https://i.imgur.com/WJUPTh6.png) **Darknet-53** ![](https://i.imgur.com/NU8L4v6.png) **使用FPN** Yolo v3在3種不同的Scale上做預測 ![](https://i.imgur.com/usxhgNb.png) * 所以將Conv前一層的特徵,與conv後再經過上取樣的featue重新結合為一個新的feature * later connection(側向連結)中 做 element-wise 相加後,還會多做一個3 × 3 Conv layer,用來減少通道數、並進行跨channel的特徵融合 **回歸** 最後一個layer預測 bounding box, objectness和class predictions。 在COCO資料集上,每個scale上有3個框。因此,output tensor為N×N×[3×(4+1+C)], 即預測N * N grid cell、 3 bounding box、 4 bounding box offsets、 1 objectness、 C class predictions。 (C = 80) ![](https://i.imgur.com/VsTss3a.png) ![](https://i.imgur.com/aqfF6Kx.png) * 13 x 13層負責檢測較大的物體, * 52 x 52層檢測較小的物體, * 26 x 26層檢測中等物體。解析度越大檢測能力越強 * 這裡還使用k-means來尋找更好的bounding box * 錨框使用了(10×13), (16×30), (33×23), (30×61), (62×45), (59×119), (116×90), (156×198)和(373×326)。 **Yolo輸出的檢測結果** ![](https://i.imgur.com/3qmzWTK.png) ![](https://i.imgur.com/FXLyFdb.png) **binary cross-entropy** YOLOv3將 Softmax 改以 binary cross-entropy 的方式對Bbox上的多個標籤進行多分類預測 ![](https://i.imgur.com/LB1d8VF.png) **整體效果** ![](https://i.imgur.com/UMpJiac.png) --- ### YOLOv1-v3 ![](https://i.imgur.com/fmmDRxY.png) ![](https://i.imgur.com/SKAkTWl.png) --- 參考資料 https://zhuanlan.zhihu.com/p/70387154