【轉】目標檢測之YOLO系列詳解


本文逐步介紹YOLO v1~v3的設計歷程。

目標檢測網絡之yolo-idea

YOLOv1基本思想

YOLO將輸入圖像分成SxS個格子,若某個物體 Ground truth 的中心位置的坐標落入到某個格子,那么這個格子就負責檢測出這個物體。

yolo-grid-predict

每個格子預測B個bounding box及其置信度(confidence score),以及C個類別概率。bbox信息(x,y,w,h)為物體的中心位置相對格子位置的偏移及寬度和高度,均被歸一化.置信度反映是否包含物體以及包含物體情況下位置的准確性,定義為\(Pr(Object)×IOU^{truth}_{pred}\),其中\(Pr(Object)∈{0,1}\)

網絡結構

YOLOv1網絡借鑒了GoogLeNet分類網絡結構。不同的是,YOLO未使用inception module,而是使用1x1卷積層(此處1x1卷積層的存在是為了跨通道信息整合)+3x3卷積層簡單替代。
YOLOv1網絡在最后使用全連接層進行類別輸出,因此全連接層的輸出維度是 \(S×S×(B×5+C)S×S×(B×5+C)\)
YOLOv1網絡比VGG16快(浮點數少於VGG的1/3),准確率稍差。

缺餡:

  • 輸入尺寸固定:由於輸出層為全連接層,因此在檢測時,YOLO訓練模型只支持與訓練圖像相同的輸入分辨率。其它分辨率需要縮放成改分辨率.
  • 占比較小的目標檢測效果不好.雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多只預測出一個物體。當物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。

損失函數

YOLO全部使用了均方和誤差作為loss函數.由三部分組成:坐標誤差、IOU誤差和分類誤差。

\[loss=∑i=0s2coordErr+iouErr+clsErrloss=∑i=0s2coordErr+iouErr+clsErr \]

簡單相加時還要考慮每種loss的貢獻率,YOLO給coordErr設置權重\(λ_{coord=5}\).在計算IOU誤差時,包含物體的格子與不包含物體的格子,二者的IOU誤差對網絡loss的貢獻值是不同的。若采用相同的權值,那么不包含物體的格子的confidence值近似為0,變相放大了包含物體的格子的confidence誤差在計算網絡參數梯度時的影響。為解決這個問題,YOLO 使用\(λ_{noobj}=0.5\)修正iouErr。(此處的‘包含’是指存在一個物體,它的中心坐標落入到格子內)。對於相等的誤差值,大物體誤差對檢測的影響應小於小物體誤差對檢測的影響。這是因為,相同的位置偏差占大物體的比例遠小於同等偏差占小物體的比例。YOLO將物體大小的信息項(w和h)進行求平方根來改進這個問題,但並不能完全解決這個問題。

綜上,YOLO在訓練過程中Loss計算如下式所示:

yolo-loss

其中有寶蓋帽子符號\((\hat{x},\hat{y},\hat{w},\hat{h},\hat{C},\hat{p})\)為預測值,無帽子的為訓練標記值。\(\mathbb 1_{ij}^{obj}\)表示物體落入格子i的第j個bbox內.如果某個單元格中沒有目標,則不對分類誤差進行反向傳播;B個bbox中與GT具有最高IoU的一個進行坐標誤差的反向傳播,其余不進行.

訓練過程

1)預訓練。使用 ImageNet 1000 類數據訓練YOLO網絡的前20個卷積層+1個average池化層+1個全連接層。訓練圖像分辨率resize到224x224。

2)用步驟1)得到的前20個卷積層網絡參數來初始化YOLO模型前20個卷積層的網絡參數,然后用 VOC 20 類標注數據進行YOLO模型訓練。檢測通常需要有細密紋理的視覺信息,所以為提高圖像精度,在訓練檢測模型時,將輸入圖像分辨率從224 × 224 resize到448x448。

訓練時B個bbox的ground truth設置成相同的.

與 Fast-R-CNN 對比

YOLO與Fast R-CNN相比有較大的定位誤差,與基於region proposal的方法相比具有較低的召回率。但是,YOLO在定位識別背景時准確率更高,而 Fast-R-CNN 的假陽性很高。基於此作者設計了 Fast-R-CNN + YOLO 檢測識別模式,即先用R-CNN提取得到一組bounding box,然后用YOLO處理圖像也得到一組bounding box。對比這兩組bounding box是否基本一致,如果一致就用YOLO計算得到的概率對目標分類,最終的bouding box的區域選取二者的相交區域。這種組合方式將准確率提高了3個百分點。

升級版 YOLO v2

為提高物體定位精准性和召回率,YOLO作者提出了 《YOLO9000: Better, Faster, Stronger》 (Joseph Redmon, Ali Farhadi, CVPR 2017, Best Paper Honorable Mention),相比v1提高了訓練圖像的分辨率;引入了faster rcnn中anchor box的思想,對網絡結構的設計進行了改進,輸出層使用卷積層替代YOLO的全連接層,聯合使用coco物體檢測標注數據和imagenet物體分類標注數據訓練物體檢測模型。相比YOLO,YOLO9000在識別種類、精度、速度、和定位准確性等方面都有大大提升。

YOLOv2 改進之處

YOLO與Fast R-CNN相比有較大的定位誤差,與基於region proposal的方法相比具有較低的召回率。因此YOLO v2主要改進是提高召回率和定位能力。下面是改進之處:

Batch Normalization: v1中也大量用了Batch Normalization,同時在定位層后邊用了dropout,v2中取消了dropout,在卷積層全部使用Batch Normalization。

高分辨率分類器:v1中使用224 × 224訓練分類器網絡,擴大到448用於檢測網絡。v2將ImageNet以448×448 的分辨率微調最初的分類網絡,迭代10 epochs。

Anchor Boxes:v1中直接在卷積層之后使用全連接層預測bbox的坐標。v2借鑒Faster R-CNN的思想預測bbox的偏移.移除了全連接層,並且刪掉了一個pooling層使特征的分辨率更大一些.另外調整了網絡的輸入(448->416)以使得位置坐標是奇數只有一個中心點(yolo使用pooling來下采樣,有5個size=2,stride=2的max pooling,而卷積層沒有降低大小,因此最后的特征是\(416/(2^5)=13\)).v1中每張圖片預測7x7x2=98個box,而v2加上Anchor Boxes能預測超過1000個.檢測結果從69.5mAP,81% recall變為69.2 mAP,88% recall.

YOLO v2對Faster R-CNN的手選先驗框方法做了改進,采樣k-means在訓練集bbox上進行聚類產生合適的先驗框.由於使用歐氏距離會使較大的bbox比小的bbox產生更大的誤差,而IOU與bbox尺寸無關,因此使用IOU參與距離計算,使得通過這些anchor boxes獲得好的IOU分值。距離公式:

\[D(box,centroid)=1−IOU(box,centroid) \]

使用聚類進行選擇的優勢是達到相同的IOU結果時所需的anchor box數量更少,使得模型的表示能力更強,任務更容易學習.k-means算法代碼實現參考:k_means_yolo.py.算法過程是:將每個bbox的寬和高相對整張圖片的比例(wr,hr)進行聚類,得到k個anchor box,由於darknet代碼需要配置文件中region層的anchors參數是絕對值大小,因此需要將這個比例值乘上卷積層的輸出特征的大小.如輸入是416x416,那么最后卷積層的特征是13x13.

細粒度特征(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以適應不同尺度大小的目標.YOLOv2使用了一種不同的方法,簡單添加一個 pass through layer,把淺層特征圖(26x26)連接到深層特征圖(連接到新加入的三個卷積核尺寸為3 * 3的卷積層最后一層的輸入)。 通過疊加淺層特征圖相鄰特征到不同通道(而非空間位置),類似於Resnet中的identity mapping。這個方法把26x26x512的特征圖疊加成13x13x2048的特征圖,與原生的深層特征圖相連接,使模型有了細粒度特征。此方法使得模型的性能獲得了1%的提升。

Multi-Scale Training: 和YOLOv1訓練時網絡輸入的圖像尺寸固定不變不同,YOLOv2(在cfg文件中random=1時)每隔幾次迭代后就會微調網絡的輸入尺寸。訓練時每迭代10次,就會隨機選擇新的輸入圖像尺寸。因為YOLOv2的網絡使用的downsamples倍率為32,所以使用32的倍數調整輸入圖像尺寸{320,352,…,608}。訓練使用的最小的圖像尺寸為320 x 320,最大的圖像尺寸為608 x 608。 這使得網絡可以適應多種不同尺度的輸入.

YOLOv2網絡結構

YOLOv2對v1的基礎網絡做了更改.

分類網絡

YOLOv2提出了一種新的分類模型Darknet-19.借鑒了很多其它網絡的設計概念.主要使用3x3卷積並在pooling之后channel數加倍(VGG);global average pooling替代全連接做預測分類,並在3x3卷積之間使用1x1卷積壓縮特征表示(Network in Network);使用 batch normalization 來提高穩定性,加速收斂,對模型正則化.
Darknet-19的結構如下表:

Darknet-19-arch

包含 19 conv + 5 maxpooling.

訓練:使用Darknet框架在ImageNet 1000類上訓練160 epochs,學習率初始為0.1,以4級多項式衰減.weight decay=0.0005 , momentum=0.9.使用標准的數據增廣方法:random crops, rotations, (hue, saturation), exposure shifts.

之后將輸入從224放大至448,學習率調整為0.001,迭代10 epochs.結果達到top-1 accuracy 76.5% , top-5 accuracy 93.3%.

檢測網絡

在分類網絡中移除最后一個1x1的層,在最后添加3個3x3x1024的卷積層,再接上輸出是類別個數的1x1卷積.
對於輸入圖像尺寸為Si x Si,最終3x3卷積層輸出的feature map是Oi x Oi(Oi=Si/(2^5)),對應輸入圖像的Oi x Oi個柵格,每個柵格預測#anchors種boxes大小,每個box包含4個坐標值,1個置信度和#classes個條件類別概率,所以輸出維度是Oi x Oi x #anchors x (5 + #classes)

添加跨層跳躍連接(借鑒ResNet等思想),融合粗細粒度的特征:將前面最后一個3x3x512卷積的特征圖,對於416x416的輸入,該層輸出26x26x512,直接連接到最后新加的三個3x3卷積層的最后一個的前邊.將26x26x512變形為13x13x1024與后邊的13x13x1024特征按channel堆起來得到13x13x3072.從yolo-voc.cfg文件可以看到,第25層為route層,逆向9層拿到第16層26 * 26 * 512的輸出,並由第26層的reorg層把26 * 26 * 512 變形為13 * 13 * 2048,再有第27層的route層連接24層和26層的輸出,堆疊為13 * 13 * 3072,由最后一個卷積核為3 * 3的卷積層進行跨通道的信息融合並把通道降維為1024。

訓練:作者在VOC07+12以及COCO2014數據集上迭代了160 epochs,初始學習率0.001,在60和90 epochs分別減小為0.1倍.
Darknet訓練VOC的參數如下:

learning_rate=0.0001
batch=64
max_batches = 45000 # 最大迭代batch數
policy=steps # 學習率衰減策略
steps=100,25000,35000 # 訓練到這些batch次數時learning_rate按scale縮放
scales=10,.1,.1 # 與steps對應

網絡結構如下(輸入416,5個類別,5個anchor box; 此結構信息由Darknet框架啟動時輸出):

YOLO v2-network

YOLO9000

提出了一種聯合訓練方法,能夠容許同時使用目標檢測數據集和分類數據集。使用有標記的檢測數據集精確定位,使用分類數據增加類別和魯棒性。

YOLOv3

YOLOv3在Pascal Titan X上處理608x608圖像速度達到20FPS,在 COCO test-dev 上 mAP@0.5 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網絡)的結果相近,並且速度快4倍.

YOLO v3的模型比之前的模型復雜了不少,可以通過改變模型結構的大小來權衡速度與精度。

速度對比如下:

YOLOv3 compare

改進之處

  • 多尺度預測 (類FPN)
  • 更好的基礎分類網絡(類ResNet)和分類器

分類器-類別預測
YOLOv3不使用Softmax對每個框進行分類,主要考慮因素有兩個:

  1. Softmax使得每個框分配一個類別(score最大的一個),而對於Open Images這種數據集,目標可能有重疊的類別標簽,因此Softmax不適用於多標簽分類。
  2. Softmax可被獨立的多個logistic分類器替代,且准確率不會下降。
    分類損失采用binary cross-entropy loss.

多尺度預測
每種尺度預測3個box, anchor的設計方式仍然使用聚類,得到9個聚類中心,將其按照大小均分給3中尺度.

  • 尺度1: 在基礎網絡之后添加一些卷積層再輸出box信息.
  • 尺度2: 從尺度1中的倒數第二層的卷積層上采樣(x2)再與最后一個16x16大小的特征圖相加,再次通過多個卷積后輸出box信息.相比尺度1變大兩倍.
  • 尺度3: 與尺度2類似,使用了32x32大小的特征圖.

參見網絡結構定義文件yolov3.cfg

基礎網絡 Darknet-53
仿ResNet, 與ResNet-101或ResNet-152准確率接近,但速度更快.對比如下:

darknet-53 compare

網絡結構如下:

YOLOv3-arch

YOLOv3在 mAP0.5mAP0.5 及小目標 APSAPS 上具有不錯的結果,但隨着IOU的增大,性能下降,說明YOLOv3不能很好地與ground truth切合.

邊框預測
作者嘗試了常規的預測方式(Faster R-CNN),然而並不奏效: x,y的偏移作為box的長寬的線性變換.

\[\begin{cases} \widehat{G_x}=P_wt_x(P)+P_x \\ \widehat{G_y}=P_ht_y(P)+P_y \\ \widehat{G_w}=P_we^{t_w(P)} \\ \widehat{G_h}=P_he^{t_h(P)} \end{cases} \]

仍采用之前的logistic方式:

\[\begin{align} b_x &= σ(t_x)+c_x \\ b_y &= σ(t_y)+c_y \\ b_w &= p_we^{t_w} \\ b_h &= p_he^{t_h} \end{align} \]

其中\(c_x,c_y\)是網格的坐標偏移量,\(p_w,p_h\)是預設的anchor box的邊長.最終得到的邊框坐標值是\(b_{x,y,w,h}\),而網絡學習目標是\(t_{x,y,w,h}\).

優缺點

優點

  • 快速,pipline簡單.
  • 背景誤檢率低。
  • 通用性強。YOLO對於藝術類作品中的物體檢測同樣適用。它對非自然圖像物體的檢測率遠遠高於DPM和RCNN系列檢測方法。

但相比RCNN系列物體檢測方法,YOLO具有以下缺點:

  • 識別物體位置精准性差。
  • 召回率低。在每個網格中預測固定數量的bbox這種約束方式減少了候選框的數量。

YOLO v.s. Faster R-CNN

  1. 統一網絡:
    YOLO沒有顯示求取region proposal的過程。Faster R-CNN中盡管RPN與fast rcnn共享卷積層,但是在模型訓練過程中,需要反復訓練RPN網絡和fast rcnn網絡.
    相對於R-CNN系列的"看兩眼"(候選框提取與分類,圖示如下),YOLO只需要Look Once.
  2. YOLO統一為一個回歸問題
    而R-CNN將檢測結果分為兩部分求解:物體類別(分類問題),物體位置即bounding box(回歸問題)。

R-CNN pipline


Darknet 框架

Darknet 由 C 語言和 CUDA 實現, 對GPU顯存利用效率較高(CPU速度差一些, 通過與SSD的Caffe程序對比發現存在CPU較慢,GPU較快的情況). Darknet 對第三方庫的依賴較少,且僅使用了少量GNU linux平台C接口,因此很容易移植到其它平台,如Windows或嵌入式設備.
參考Windows 版 Darknet (YOLOv2) 移植, 代碼在此.

region層:參數anchors指定kmeans計算出來的anchor box的長寬的絕對值(與網絡輸入大小相關),num參數為anchor box的數量,
另外還有bias_match,classes,coords等參數.在parser.c代碼中的parse_region函數中解析這些參數,並保存在region_layer.num參數保存在l.n變量中;anchors保存在l.biases數組中.region_layer的前向傳播中使用for(n = 0; n < l.n; ++n)這樣的語句,因此,如果在配置文件中anchors的數量大於num時,僅使用前num個,小於時內存越界.

region層的輸入和輸出大小與前一層(1x1 conv)的輸出大小和網絡的輸入大小相關.

Detection層: 坐標及類別結果輸出層.

yolo層: 指定anchors等信息, 計算loss等. YOLOv3使用三個yolo層作為輸出.

upsample層: 上采樣層, 進行2倍上采樣.

region層和Detection層均是YOLOv2模型所使用的層, upsample層和yolo層在YOLOv3中使用.

鑒於 Darknet 作者率性的代碼風格, 將它作為我們自己的開發框架並非是一個好的選擇. 可以在我們更為熟悉的Caffe等框架中復現YOLO網絡. 這里有一份Caffe版YOLOv3實現(僅部署,不能訓練), 另可參照其它框架的可訓練代碼.


參考

原文: https://www.cnblogs.com/makefile/p/YOLOv3.html © 康行天下



MARSGGBO原創





2019-4-29




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM