目標檢測網路之 YOLOv3

bbzz2發表於2018-10-17

 

yolo-idea

yolo-idea

 

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

YOLOv1基本思想

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

yolo-grid-predict

yolo-grid-predict

 

每個格子預測B個bounding box及其置信度(confidence score),以及C個類別概率。bbox資訊(x,y,w,h)為物體的中心位置相對格子位置的偏移及寬度和高度,均被歸一化.置信度反映是否包含物體以及包含物體情況下位置的準確性,定義為Pr(Object)×IOUtruthpred,其中Pr(Object)∈{0,1}Pr(Object)×IOUpredtruth,其中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λcoord=5.在計算IOU誤差時,包含物體的格子與不包含物體的格子,二者的IOU誤差對網路loss的貢獻值是不同的。若採用相同的權值,那麼不包含物體的格子的confidence值近似為0,變相放大了包含物體的格子的confidence誤差在計算網路引數梯度時的影響。為解決這個問題,YOLO 使用λnoobj=0.5λnoobj=0.5修正iouErr。(此處的‘包含’是指存在一個物體,它的中心座標落入到格子內)。對於相等的誤差值,大物體誤差對檢測的影響應小於小物體誤差對檢測的影響。這是因為,相同的位置偏差佔大物體的比例遠小於同等偏差佔小物體的比例。YOLO將物體大小的資訊項(w和h)進行求平方根來改進這個問題,但並不能完全解決這個問題。

 

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

yolo-loss

yolo-loss

 

其中有寶蓋帽子符號(x^,y^,w^,h^,C^,p^x^,y^,w^,h^,C^,p^)為預測值,無帽子的為訓練標記值。1objij1ijobj表示物體落入格子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)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

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

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

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

darknet-53 compare

 

網路結構如下:

YOLOv3-arch

YOLOv3-arch

 

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

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

 

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪Gxˆ=Pwtx(P)+PxGyˆ=Phty(P)+PyGwˆ=Pwetw(P)Ghˆ=Pheth(P){Gx^=Pwtx(P)+PxGy^=Phty(P)+PyGw^=Pwetw(P)Gh^=Pheth(P)

 

仍採用之前的logistic方式:

 

bxbybwbh=σ(tx)+cx=σ(ty)+cy=pwetw=pheth(1)(2)(3)(4)(1)bx=σ(tx)+cx(2)by=σ(ty)+cy(3)bw=pwetw(4)bh=pheth

 

其中cx,cycx,cy是網格的座標偏移量,pw,phpw,ph是預設的anchor box的邊長.最終得到的邊框座標值是bx,y,w,hbx,y,w,h,而網路學習目標是tx,y,w,htx,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

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 

相關文章