全網嘔血整理:關於YOLO v3原理分析

摘要:YOLO系列的目標檢測算法可以說是目標檢測史上的宏篇鉅作,接下來我們來詳細介紹一下YOLO v3算法內容。

算法基本思想

首先通過特徵提取網絡對輸入特徵提取特徵,得到特定大小的特徵圖輸出。輸入圖像分成13×13的grid cell,接着如果真實框中某個object的中心座標落在某個grid cell中,那麼就由該grid cell來預測該object。每個object有固定數量的bounding box,YOLO v3中有三個bounding box,使用邏輯迴歸確定用來預測的迴歸框。

網絡結構

上圖DBL是Yolo v3的基本組件。Darknet的卷積層後接BatchNormalization(BN)和LeakyReLU。除最後一層卷積層外,在yolo v3中BN和LeakyReLU已經是卷積層不可分離的部分了,共同構成了最小組件。

主幹網絡中使用了5個resn結構。n代表數字,有res1,res2, … ,res8等等,表示這個res_block裏含有n個res_unit,這是Yolo v3的大組件。從Yolo v3開始借鑑了ResNet的殘差結構,使用這種結構可以讓網絡結構更深。對於res_block的解釋,可以在上圖網絡結果的右下角直觀看到,其基本組件也是DBL。

在預測支路上有張量拼接(concat)操作。其實現方法是將darknet中間層和中間層後某一層的上採樣進行拼接。值得注意的是,張量拼接和Res_unit結構的add的操作是不一樣的,張量拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。

Yolo_body一共有252層。23個Res_unit對應23個add層。BN層和LeakyReLU層數量都是72層,在網絡結構中的表現爲:每一層BN後面都會接一層LeakyReLU。上採樣和張量拼接操作各2個,5個零填充對應5個res_block。卷積層一共有75層,其中有72層後面都會接BatchNormalization和LeakyReLU構成的DBL。三個不同尺度的輸出對應三個卷積層,最後的卷積層的卷積核個數是255,針對COCO數據集的80類:3×(80+4+1)=255,3表示一個grid cell包含3個bounding box,4表示框的4個座標信息,1表示置信度。

下圖爲具體網絡結果圖。

輸入映射到輸出

不考慮神經網絡結構細節的話,總的來說,對於一個輸入圖像,YOLO3將其映射到3個尺度的輸出張量,代表圖像各個位置存在各種對象的概率。

我們看一下YOLO3共進行了多少個預測。對於一個416*416的輸入圖像,在每個尺度的特徵圖的每個網格設置3個先驗框,總共有 13*13*3 + 26*26*3 + 52*52*3 = 10647 個預測。每一個預測是一個(4+1+80)=85維向量,這個85維向量包含邊框座標(4個數值),邊框置信度(1個數值),對象類別的概率(對於COCO數據集,有80種對象)。

邊界框預測(Bounding Box Prediction)

Yolo v3關於bounding box的初始尺寸還是採用Yolo v2中的k-means聚類的方式來做,這種先驗知識對於bounding box的初始化幫助還是很大的,畢竟過多的bounding box雖然對於效果來說有保障,但是對於算法速度影響還是比較大的。

在COCO數據集上,9個聚類如下表所示,注這裏需要說明:特徵圖越大,感受野越小。對小目標越敏感,所以選用小的anchor box。特徵圖越小,感受野越大。對大目標越敏感,所以選用大的anchor box。

Yolo v3採用直接預測相對位置的方法。預測出b-box中心點相對於網格單元左上角的相對座標。直接預測出(tx,ty,tw,th,t0),然後通過以下座標偏移公式計算得到b-box的位置大小和confidence。

tx、ty、tw、th就是模型的預測輸出。cx和cy表示grid cell的座標,比如某層的feature map大小是13×13,那麼grid cell就有13×13個,第0行第1列的grid cell的座標cx就是0,cy就是1。pw和ph表示預測前bounding box的size。bx、by、bw和bh就是預測得到的bounding box的中心的座標和size。在訓練這幾個座標值的時候採用了sum of squared error loss(平方和距離誤差損失),因爲這種方式的誤差可以很快的計算出來。

注:這裏confidence = Pr(Object)*IoU 表示框中含有object的置信度和這個box預測的有多準。也就是說,如果這個框對應的是背景,那麼這個值應該是 0,如果這個框對應的是前景,那麼這個值應該是與對應前景 GT的IoU。

Yolo v3使用邏輯迴歸預測每個邊界框的分數。如果邊界框與真實框的重疊度比之前的任何其他邊界框都要好,則該值應該爲1。如果邊界框不是最好的,但確實與真實對象的重疊超過某個閾值(Yolo v3中這裏設定的閾值是0.5),那麼就忽略這次預測。Yolo v3只爲每個真實對象分配一個邊界框,如果邊界框與真實對象不吻合,則不會產生座標或類別預測損失,只會產生物體預測損失。

多尺度預測

在上面網絡結構圖中可以看出,Yolo v3設定的是每個網格單元預測3個box,所以每個box需要有(x, y, w, h, confidence)五個基本參數。Yolo v3輸出了3個不同尺度的feature map,如上圖所示的y1, y2, y3。y1,y2和y3的深度都是255,邊長的規律是13:26:52。

每個預測任務得到的特徵大小都爲N ×N ×[3∗(4+1+80)] ,N爲格子大小,3爲每個格子得到的邊界框數量, 4是邊界框座標數量,1是目標預測值,80是類別數量。對於COCO類別而言,有80個類別的概率,所以每個box應該對每個種類都輸出一個概率。所以3×(5 + 80) = 255。這個255就是這麼來的。

Yolo v3用上採樣的方法來實現這種多尺度的feature map。在Darknet-53得到的特徵圖的基礎上,經過六個DBL結構和最後一層卷積層得到第一個特徵圖譜,在這個特徵圖譜上做第一次預測。Y1支路上,從後向前的倒數第3個卷積層的輸出,經過一個DBL結構和一次(2,2)上採樣,將上採樣特徵與第2個Res8結構輸出的卷積特徵張量連接,經過六個DBL結構和最後一層卷積層得到第二個特徵圖譜,在這個特徵圖譜上做第二次預測。Y2支路上,從後向前倒數第3個卷積層的輸出,經過一個DBL結構和一次(2,2)上採樣,將上採樣特徵與第1個Res8結構輸出的卷積特徵張量連接,經過六個DBL結構和最後一層卷積層得到第三個特徵圖譜,在這個特徵圖譜上做第三次預測。

就整個網絡而言,Yolo v3多尺度預測輸出的feature map尺寸爲y1:(13×13),y2:(26×26),y3:(52×52)。網絡接收一張(416×416)的圖,經過5個步長爲2的卷積來進行降採樣(416 / 2ˆ5 = 13,y1輸出(13×13)。從y1的倒數第二層的卷積層上採樣(x2,up sampling)再與最後一個26×26大小的特徵圖張量連接,y2輸出(26×26)。從y2的倒數第二層的卷積層上採樣(x2,up sampling)再與最後一個52×52大小的特徵圖張量連接,y3輸出(52×52)

感受一下9種先驗框的尺寸,下圖中藍色框爲聚類得到的先驗框。黃色框式ground truth,紅框是對象中心點所在的網格。

預測框的3種情況

預測框一共分爲三種情況:正例(positive)、負例(negative)、忽略樣例(ignore)。

(1)正例:任取一個ground truth, 與上面計算的10647個框全部計算IOU, IOU最大的預測框, 即爲正例。並且一個預測框, 只能分配給一個ground truth。 例如第一個ground truth已經匹配了一個正例檢測框, 那麼下一個ground truth, 就在餘下的10646個檢測框中, 尋找IOU最大的檢測框作爲正例。ground truth的先後順序可忽略。正例產生置信度loss、檢測框loss、類別loss。預測框爲對應的ground truth box標籤(使用真實的x、y、w、h計算出); 類別標籤對應類別爲1, 其餘爲0; 置信度標籤爲1。

(2)忽略樣例:正例除外, 與任意一個ground truth的IOU大於閾值(論文中使用5), 則爲忽略樣例。忽略樣例不產生任何loss。

爲什麼會有忽略樣例?

由於Yolov3採用了多尺度檢測, 那麼再檢測時會有重複檢測現象. 比如有一個真實物體,在訓練時被分配到的檢測框是特徵圖1的第三個box,IOU達0.98,此時恰好特徵圖2的第一個box與該ground truth的IOU達0.95,也檢測到了該ground truth,如果此時給其置信度強行打0的標籤,網絡學習效果會不理想。

(3)負例:正例除外(與ground truth計算後IOU最大的檢測框,但是IOU小於閾值,仍爲正例), 與全部ground truth的IOU都小於閾值(0.5), 則爲負例。負例只有置信度產生loss, 置信度標籤爲0。

如下圖所示:

  • λ爲權重參數, 用於控制檢測框loss, obj與noobj的置信度loss, 以及類別
  • 對於正類而言, 1ijobj輸出爲1; 對於負例而言, 1ijnoobj輸出爲1; 對於忽略樣例而言, 全部爲0;
  • 類別採用交叉熵作爲損失函數。

類別預測

類別預測方面Yolo v2網絡中的Softmax分類器,認爲一個目標只屬於一個類別,通過輸出Score大小,使得每個框分配到Score最大的一個類別。但在一些複雜場景下,一個目標可能屬於多個類(有重疊的類別標籤),因此Yolo v3用多個獨立的Logistic分類器替代Softmax層解決多標籤分類問題,且準確率不會下降。

舉例說明,原來分類網絡中的softmax層都是假設一張圖像或一個object只屬於一個類別,但是在一些複雜場景下,一個object可能屬於多個類,比如你的類別中有woman和person這兩個類,那麼如果一張圖像中有一個woman,那麼你檢測的結果中類別標籤就要同時有woman和person兩個類,這就是多標籤分類,需要用Logistic分類器來對每個類別做二分類。Logistic分類器主要用到sigmoid函數,該函數可以將輸入約束在0到1的範圍內,因此當一張圖像經過特徵提取後的某一類輸出經過sigmoid函數約束後如果大於0.5,就表示該邊界框負責的目標屬於該類。

物體分數和類置信度

物體分數:表示一個邊界框包含一個物體的概率,對於紅色框和其周圍的框幾乎都爲1,但邊角的框可能幾乎都爲0。物體分數也通過一個sigmoid函數,表示概率值。

類置信度:表示檢測到的物體屬於一個具體類的概率值,以前的YOLO版本使用softmax將類分數轉化爲類概率。在YOLOv3中作者決定使用sigmoid函數取代,原因是softmax假設類之間都是互斥的,例如屬於“Person”就不能表示屬於“Woman”,然而很多情況是這個物體既是“Person”也是“Woman”。

輸出處理

我們的網絡生成10647個錨框,而圖像中只有一個狗,怎麼將10647個框減少爲1個呢?首先,我們通過物體分數過濾一些錨框,例如低於閾值(假設0.5)的錨框直接捨去;然後,使用NMS(非極大值抑制)解決多個錨框檢測一個物體的問題(例如紅色框的3個錨框檢測一個框或者連續的cell檢測相同的物體,產生冗餘),NMS用於去除多個檢測框。

具體使用以下步驟:拋棄分數低的框(意味着框對於檢測一個類信心不大);當多個框重合度高且都檢測同一個物體時只選擇一個框(NMS)。

爲了更方便理解,我們選用上面的汽車圖像。首先,我們使用閾值進行過濾一部分錨框。模型有19*19*3*85個數,每個盒子由85個數字描述。將(19,19,3,85)分割爲下面的形狀:

box_confidence:(19,19,3,1)表示19*19個cell,每個cell的 3個框,每個框有物體的置信度概率;

boxes:(19,19,3,4)表示每個cell 的3個框,每個框的表示;

box_class_probs:(19,19,3,80)表示每個cell的3個框,每個框80個類檢測概率。

每個錨框我們計算下面的元素級乘法並且得到錨框包含一個物體類的概率,如下圖:

即使通過類分數閾值過濾一部分錨框,還剩下很多重合的框。第二個過程叫NMS,裏面有個IoU,如下圖所示。

實現非極大值抑制,關鍵在於:選擇一個最高分數的框;計算它和其他框的重合度,去除重合度超過IoU閾值的框;回到步驟1迭代直到沒有比當前所選框低的框。

Loss Function

在Yolo v3的論文裏沒有明確提出所用的損失函數,確切地說,Yolo系列論文裏面只有Yolo v1明確提了損失函數的公式。在Yolo v1中使用了一種叫sum-square error的損失計算方法,只是簡單的差方相加。我們知道,在目標檢測任務裏,有幾個關鍵信息是需要確定的:(x,y),(w,h),class,confidence 。根據關鍵信息的特點可以分爲上述四類,損失函數應該由各自特點確定。最後加到一起就可以組成最終的loss function了,也就是一個loss function搞定端到端的訓練。

yolov3網絡硬核講解(視頻)

視頻地址:https://www.bilibili.com/video/BV12y4y1v7L6?from=search&seid=442233808730191461

真實值是如何編碼

預測錨框的設計

錨框與目標框做iou

本文分享自華爲雲社區《YOLOV3 原理分析(全網資料整理)》,原文作者:lutianfei 。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章