天天看點

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

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

算法基本思想

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

網絡結構

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

上圖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表示置信度。

下圖為具體網絡結果圖。

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

輸入映射到輸出

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

不考慮神經網絡結構細節的話,總的來說,對于一個輸入圖像,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種對象)。

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

邊界框預測(Bounding Box Prediction)

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

在COCO資料集上,9個聚類如下表所示,注這裡需要說明:特征圖越大,感受野越小。對小目标越敏感,是以選用小的anchor box。特征圖越小,感受野越大。對大目标越敏感,是以選用大的anchor box。

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

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

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

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,紅框是對象中心點所在的網格。

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

預測框的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。

如下圖所示:

全網嘔血整理:關于YOLO v3原理分析
  • λ為權重參數, 用于控制檢測框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)。

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

為了更友善了解,我們選用上面的汽車圖像。首先,我們使用門檻值進行過濾一部分錨框。模型有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個類檢測機率。

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

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

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

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

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

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

Loss Function

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

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

yolov3網絡硬核講解(視訊)

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

真實值是如何編碼

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

預測錨框的設計

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

錨框與目标框做iou

全網嘔血整理:關于YOLO v3原理分析
全網嘔血整理:關于YOLO v3原理分析
全網嘔血整理:關于YOLO v3原理分析
本文分享自華為雲社群《YOLOV3 原理分析(全網資料整理)》,原文作者:lutianfei 。

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀