【YOLO系列】yolov3技術總結整理

原文鏈接:https://blog.csdn.net/qq_20657717/article/details/81669006

yolov3可去darknet官網下載,github上有caffe、keras、pytorch等版本。

基本思想

首先通過特徵提取網絡對輸入的圖像提取特徵,得到一定大小的feature map 比如 13X13,然後將輸入的圖像分爲13X13個grid cell,然後如果groundtruth中的某個物體的中心座標落到那個grid cell中就由該grid cell預測該物體,每個grid cell 都會預測固定數量的bounding box (v1 :2個,V2 :5個 ,V3 : 3個)這幾個bounding box的初始size是不一樣的),那麼這幾個bounding box中最終是由哪一個來預測該object?答案是:這幾個bounding box中只有和ground truth的IOU最大的bounding box纔是用來預測該物體。

Darknet-53特徵提取網絡

不同於Darknet-19,YOLO v3中使用了一個53層的卷積網絡,這個網絡由殘差單元疊加而成。根據作者的實驗,在分類準確度上跟效率的平衡上,這個模型比ResNet-101、ResNet-152和Darknet-19表現得更好。模型作爲圖像分類器進行預訓練,之後再針對檢測任務進行調整,Redmond發現在分類預訓練結束時使用更高分辨率的圖像能夠提升檢測表現。將分類網絡調整爲檢測網絡只需移除網絡的最後幾層,然後添加一個帶有B個過濾器的卷積層,以得到N*N*B的邊界框預測。一方面基本採用全卷積(YOLO v2中採用pooling層做feature map的sample,這裏都換成卷積層來做了),另一方面引入了residual結構(YOLO v2中還是類似VGG那樣直筒型的網絡結構,層數太多訓起來會有梯度問題,所以Darknet-19也就19層,因此得益於ResNet的residual結構,訓深層網絡難度大大減小,因此這裏可以將網絡做到53層,精度提升比較明顯)。

邊界框預測

YOLO v3使用邏輯迴歸預測每個邊界框的分數。 如果先驗邊界框與真實框的重疊度比之前的任何其他邊界框都要好,則該值應該爲1。 如果先驗邊界框不是最好的,但確實與真實對象的重疊超過某個閾值(這裏是0.5),那麼就忽略這次預測。YOLO v3只爲每個真實對象分配一個邊界框,如果先驗邊界框與真實對象不吻合,則不會產生座標或類別預測損失,只會產生物體預測損失。 
YOLO 模型的第一個迭代版本是直接預測描述一個邊界框的所有 4 個值。每個邊界框的 x 和 y 座標都是相對每個網格單元的左上角定義的,並且根據單元尺寸進行了歸一化,以便這些座標值的範圍在 0 到 1 之間。我們定義框寬度和高度的方式讓我們的模型預測的是平方根寬度和高度;通過平方根值的形式定義框的寬度和高度,大數值之間的差會沒有小數值之間的差那樣顯著(看看 的圖就能確定這一點)。Redmond 選擇這個形式是因爲「小偏差在大框中的重要性比在小框中小」,因此,當我們計算我們的損失函數時,我們希望將重點放在更準確地得到小框上面。邊界框的寬度和高度根據圖像的寬和高進行歸一化,因此取值也在 0 到 1 之間。訓練過程中使用 L2 損失。 
這種形式後來進行了修改,引入了邊界框先驗(bounding box prior)的概念。我們不再期望模型爲每張新圖像直接生成唯一的邊界框描述量,而是定義一個邊界框集合,其中的邊界框有不同的寬高比,這些寬高比嵌入了某些關於我們預計會檢測到的目標的形狀的先驗信息。Redmond 提供了一種用於發現最佳寬高比的方法,即在你的訓練數據集中的所有邊界框上執行 k-均值聚類(使用一個自定義的距離度量)。 
在下圖中,你可以看到針對中心黃色的網格單元的一個包含 5 個邊界框先驗(也被稱爲錨框(anchor boxes))的集合。通過這種形式,B 個邊界框中的每個都能明確地專門檢測特定尺寸和寬高比的目標。 


 
注:儘管圖中沒有給出,但我們的預測網格中的每個單元都有這些錨框。 
我們不再直接預測邊界框的尺寸,而是重新形式化了我們的任務,從而只需簡單預測與我們的邊界框先驗尺寸的偏移量,這樣我們就可以優化我們的預測邊界框尺寸了。這種處理方式能讓這一預測任務更容易學習。由於與原來的預測平方根寬度和高度相似的原因,我們將定義我們的任務來預測與我們的邊界框先驗的對數偏移量。

目標度(以及將被標註的目標分配給一個邊界框)

在該模型的第一個版本中,「目標度(objectness)」分數 pobj 的訓練目標是近似求取被預測框和基本真值標籤之間的交併比(IoU)。當我們在訓練過程中計算損失時,我們會將目標與有最高 IoU 分數的邊界框預測(在同一個網格單元上)進行匹配。對於未匹配的框,我們會包含進我們的損失函數的唯一描述量是 pobj。 
YOLOv2 加入了邊界框先驗之後,我們只需簡單地將被標註出的目標分配給與該被標註目標有最高 IoU 分數的錨框(在同一個網格單元上)即可。 
在第三個版本中,Redmond 重新定義了「目標度」目標分數 pobj,每個給定目標有最高 IoU 分數的邊界框取值 1,其它所有框都爲 0。但是,在計算損失時,我們將不會包含有較高 IoU 分數(超過某個閾值),但不是最高分數的邊界框。簡單來說,只是因爲一個優良預測不是最佳預測就懲罰它是不合理的。

類別預測

爲了實現多標籤分類,模型不再使用softmax函數作爲最終的分類器,分類損失採用binary cross-entropy損失函數替換Softmax損失函數(Softmax會選擇分數最高的類別判定爲當前框所屬的類別,而現實中一個目標可能屬於多個類別標籤),由於每個點所對應的 bounding box 少並且差異大,每個 bounding 與 ground truth 的 matching 策略變成了 1 對 1。原來分類網絡中的softmax層都是假設一張圖像或一個object只屬於一個類別,但是在一些複雜場景下,一個object可能屬於多個類,比如你的類別中有woman和person這兩個類,那麼如果一張圖像中有一個woman,那麼你檢測的結果中類別標籤就要同時有woman和person兩個類,這就是多標籤分類,需要用邏輯迴歸層來對每個類別做二分類。邏輯迴歸層主要用到sigmoid函數,該函數可以將輸入約束在0到1的範圍內,因此當一張圖像經過特徵提取後的某一類輸出經過sigmoid函數約束後如果大於0.5,就表示屬於該類,當預測的目標類別很複雜的時候,採用 logistic regression 進行分類是更有效的,比如在 Open Images Dataset 數據集進行分類。

多尺度預測

不同於之前的YOLO,YOLO v3從三種不同尺度的特徵圖譜上進行預測任務。在Darknet-53得到的特徵圖的基礎上,經過7個卷積得到第一個特徵圖譜,在這個特徵圖譜上做第一次預測。然後從後向前獲得倒數第3個卷積層的輸出,進行一次卷積一次x2上採樣,將上採樣特徵與第43個卷積特徵連接,經過7個卷積得到第二個特徵圖譜,在這個特徵圖譜上做第二次預測。然後從後向前獲得倒數第3個卷積層的輸出,進行一次卷積一次x2上採樣,將上採樣特徵與第26個卷積特徵連接,經過7個卷積得到第三個特徵圖譜,在這個特徵圖譜上做第三次預測。每個預測任務得到的特徵大小都爲N ×N ×[3∗(4+1+80)] ,N爲格子大小,3爲每個格子得到的邊界框數量, 4是邊界框座標數量,1是目標預測值,80是類別數量該網絡在第一個檢測層之前對輸入圖像執行下采樣,檢測層使用步幅爲 32 的層的特徵圖執行檢測。隨後在執行因子爲 2 的上採樣後,並與前一個層的特徵圖(特徵圖大小相同)拼接。另一個檢測在步幅爲 16 的層中執行。重複同樣的上採樣步驟,最後一個檢測在步幅爲 8 的層中執行。在每個尺度上,每個單元使用3個錨點預測3個邊界框,錨點的總數爲9(不同尺度的錨點不同)。對於大小爲 416 x 416 的圖像,YOLO 預測 ((52 x 52) + (26 x 26) + 13 x 13)) x 3 = 10647 個邊界框。但是,我們的示例中只有一個對象——一隻狗。那麼我們怎麼才能將檢測次數從 10647 減少到 1 呢?

目標置信度閾值:首先,我們根據它們的 objectness 分數過濾邊界框。通常,分數低於閾值的邊界框會被忽略。我們的預測張量包含有關 B x 10647 邊界框的信息。對於有低於一個閾值的 objectness 分數的每個邊界框,我們將其每個屬性的值(表示該邊界框的一整行)都設爲零。

非極大值抑制:非極大值抑制(NMS)可解決對同一個圖像的多次檢測的問題。從高層面看,這個技術會檢查高度重疊的邊界框並抑制(即丟棄)除最高置信度預測外的所有預測。我們會爲每一類都單獨執行非極大抑制。同樣,這裏的目標是移除冗餘的預測,所以如果有兩個重疊度很高的邊界框分別描述的是不同類別的目標(比如一個框描述人,一個框描述車),那麼我們就不必擔心。但是,如果兩個重疊度很高的邊界框都在描述人,那麼很有可能這兩個預測描述的是同一個人。

Yolo和SSD的主要思路是均勻地在圖片的不同位置進行密集抽樣,抽樣時可以採用不同尺度和長寬比,然後利用CNN提取特徵後直接進行分類與迴歸,整個過程只需要一步,所以其優勢是速度快,但是均勻的密集採樣的一個重要缺點是訓練比較困難,這主要是因爲正樣本與負樣本(背景)極其不均衡,導致模型準確度稍低。YOLO 和 SSD 的一大主要區別是 SSD 不會試圖爲 pobj 預測一個值。YOLO 模型是在存在一個目標時預測目標的概率,然後再預測每個類別的概率,而 SSD 模型則試圖直接預測一個類別存在於一個給定目標框中的概率。

batch: 每一次迭代送到網絡的圖片數量,也叫批數量。增大這個可以讓網絡在較少的迭代次數內完成一個epoch。在固定最大迭代次數的前提下,增加batch會延長訓練時間,但會更好的尋找到梯度下降的方向。如果你顯存夠大,可以適當增大這個值來提高內存利用率。這個值是需要大家不斷嘗試選取的,過小的話會讓訓練不夠收斂,過大會陷入局部最優。 
subdivision:這個參數很有意思的,它會讓你的每一個batch不是一下子都丟到網絡裏。而是分成subdivision對應數字的份數,一份一份的跑完後,在一起打包算作完成一次iteration。這樣會降低對顯存的佔用情況。如果設置這個參數爲1的話就是一次性把所有batch的圖片都丟到網絡裏,如果爲2的話就是一次丟一半。 
angle:圖片旋轉角度,這個用來增強訓練效果的。從本質上來說,就是通過旋轉圖片來變相的增加訓練樣本集。 
saturation,exposure,hue:飽和度,曝光度,色調,這些都是爲了增強訓練效果用的。 
learning_rate:學習率,訓練發散的話可以降低學習率。學習遇到瓶頸,loss不變的話也減低學習率。 
max_batches: 最大迭代次數。 
policy:學習策略,一般都是step這種步進式。 
step,scales:這兩個是組合一起的,舉個例子:learn_rate: 0.001, step:100,25000,35000 scales: 10, .1, .1 這組數據的意思就是在0-100次iteration期間learning rate爲原始0.001,在100-25000次iteration期間learning rate爲原始的10倍0.01,在25000-35000次iteration期間learning rate爲當前值的0.1倍,就是0.001, 在35000到最大iteration期間使用learning rate爲當前值的0.1倍,就是0.0001。隨着iteration增加,降低學習率可以是模型更有效的學習,也就是更好的降低train loss。 
最後一層卷積層中filters數值是 5×(類別數 + 5)。具體原因就不多說了,知道就好哈。 
region裏需要把classes改成你的類別數。 
最後一行的random,是一個開關。如果設置爲1的話,就是在訓練的時候每一batch圖片會隨便改成320-640(32整倍數)大小的圖片。目的和上面的色度,曝光度等一樣。如果設置爲0的話,所有圖片就只修改成默認的大小 416*416。

訓練log中各參數的意義

Region Avg IOU:平均的IOU,代表預測的bounding box和ground truth的交集與並集之比,期望該值趨近於1。

Class:是標註物體的概率,期望該值趨近於1.

Obj:期望該值趨近於1.

No Obj:期望該值越來越小但不爲零.

Avg Recall:期望該值趨近1

avg:平均損失,期望該值趨近於0

rate:當前學習率

注:如果是學習如何訓練,建議不要用VOC或者COCO,這兩個數據集複雜,類別較多,復現作者的效果需要一定的功力,迭代差不多5w次,就可以看到初步的效果。所以,不如挑個簡單數據集的或者手動標註個幾百張就可以進行訓練學習。

未來發展

mAP 會繼續提高。隨着模型訓練越來越高效,神經網絡層級的不斷加深,信息抽象能力的不斷提高,以及一些小的修修補補,未來的目標檢測應用mAP會不斷提升。 
實時檢測會成爲標配。目前所謂的“實時”,工業界是不認可的。爲什麼呢,因爲學術圈的人,驗證模型都是建立在 TitanX 或者 Tesla 這類強大的獨立顯卡上,而實際的潛在應用場景中,例如無人機/掃地/服務機器人/視頻監控等,是不會配備這些“重型裝備”的。所以,在嵌入式設備中,如 FPGA,輕量級 CPU 上,能達到的實時,纔是貨真價實的。 
模型小型化成爲重要分支。類似於 tiny YOLO 的模型分支會受到更多關注。模型的小型化是應用到嵌入式設備的重要前提。而物聯網機器人無人機等領域還是以嵌入式設備爲主的。模型剪枝/二值化/權值共享等手段會更廣泛的使用。 
垂直領域特定目標檢測對於不同場景不同需求可設計特定模型推廣應用。
 ———————————————— 


原文鏈接:https://blog.csdn.net/qq_20657717/article/details/81669006

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