1. 程式人生 > >YOLO以及YOLOv2綜述以及對比

YOLO以及YOLOv2綜述以及對比

YOLO及YOLOv2綜述

最近在閱讀yolo系列的文章,以下將對yolo以及yolov2做個綜述

YOLO

YOLO核心思想:從R-CNN到Fast R-CNN一直採用的思路是***proposal+分類*** (proposal 提供位置資訊, 分類提供類別資訊)精度已經很高,但是速度還不行。 YOLO提供了另一種更為直接的思路: 直接在輸出層迴歸bounding box的位置和bounding box所屬的類別(整張圖作為網路的輸入,把 Object Detection 的問題轉化成一個 Regression 問題)。

先複習一下faster-rcnn中的***proposal+分類***的過程:

faster rcnn基本結構
首先是常規的conv layers操作:conv+relu+pooling層,生成的feature maps是共享的,一路經過RPN生成proposal,一路到ROIPooling層,結合proposal進入全連線層。全連線層有兩路輸出,一個為bbox的第二次迴歸結果,一個是被預測的bbox中物體的分類。faster-rcnn的網路結構

YOLO的主要特點

  • 速度快
  • 使用全圖作為環境資訊,把背景錯認為物體的錯誤比較少。
  • 泛化能力強

大致流程

  • Resize成448*448,圖片分割成7*7的cell

  • CNN提取特徵和預測: 卷積負責提取特徵,全連線層負責預測。(和faster-rcnn有些不同:RPN中卷積層後輸出anchor,每個anchor都有4個用於迴歸的變換量

  • bbox的座標:xywh

  • 是否有物體的confidence

  • 預測物體的概率

  • 篩除bbox(nms)

網路結構

借鑑了GoogleNet,用了24個卷積層和2個全連線層
(模型中採用1x1的卷積層減少運算量)
模型最後輸出7x7x30的張量,可以看到輸出的channel為30。在一個cell中,前20是類別概率值,然後是兩個邊界框的confidence,最後八個是兩個邊界框的(x,y,w,h)。由此可以看出,一個cell預測兩個bbox,一個預測值包含confidence和(x,y,w,h)。這兩個predictor只能預測同一個目標。所以,一個cell無法預測多個目標。

  • 為何一個cell不能預測多個目標呢:

    兩個predictor不知道自己該負責那個目標。

  • 為何要有兩個predictor呢:

    在訓練的時候會線上地計算每個predictor預測的bounding box和ground truth的IOU,計算出來的IOU大的那個predictor負責預測這個物體,另外一個則不預測。這樣做的話,實際上有兩個predictor來一起進行預測,然後網路會線上選擇預測得好的那個predictor(也就是IOU大)來進行預測。

訓練過程:

預訓練分類網路: 使用模型中前20個conv+maxpooling+fc 在這裡輸入是224×224
訓練檢測網路: 4個conv+2個fc ;由於檢查需要細粒度的視覺資訊,所以輸入resize成448×448

  • 一個模型被分成了7×7個網格(cell),物體的中心落入了哪個cell,哪個cell就對這個物體做出預測。最後輸出7×7×30,其中每個1×1×30都對於一個cell的輸出結果。30為channel輸出通道在這裡插入圖片描述
    首先計算confidence:
    confidence
    當物體的中心落入cell,Pr(Object)=1,confidence變成1xIOU,當物體中心沒有落入cell,Pr(Object)=0,confidence=0。
    bbox預測:
    x,y表示bbox中心到cell左上角座標的偏移量,w,h則是相對於整張圖片的寬高進行歸一化。x,y,w,h的區間在[0,1].通常回歸問題都要做歸一化,否則可能導致各個輸出維度取值範圍差距很大,網路會關注較大的誤差。
    類別預測:

    對於物體中心落在的cell,計算概率。

訓練細節

  • 最後一層和其他層的啟用函式:
    在這裡插入圖片描述

  • 損失函式:
    在這裡插入圖片描述
    平方差損失函式很容易優化,但是不能把localization和classify等同對待,並且有部分網格不包含Object,它們的confidence為0(這一塊的平方差會非常大),這樣算出的loss會使模型不穩定。所以增加了權重,用於localization的xywh的權重置為5,沒有Object的bbox在計算confidence時,權重置為0.5。
    為了減小取值大的w和h的影響,採取了開方的辦法,這樣小數值的w和h開方之後,數值變化的幅度會增大,大數值的相對就會小一點。

  • 訓練引數:在VOC2007和VOC2012上訓練了135個epoch,batchsize=64,decay=0.0005. 關於學習率,如果在一開始使用高學習率,模型會不穩定,第一個epoch,lr=10-3,然後升至10-2,30個epoch後將至10-3,30epoch之後再將至10-4。為了避免過擬合,使用了dropout和資料增強。第一個全連線層之後使用dropout,rate=0.5。

測試過程:

每個網格預測的class資訊和bbox的confidence相乘,得到每個bounding box的class-specific confidence score。
在這裡插入圖片描述
得到每個bbox的class-specific confidence score以後,設定閾值,濾掉得分低的boxes,對保留的boxes進行NMS處理,就得到最終的檢測結果。
關於測試階段的confidence怎麼計算,有知乎大佬說:測試階段,網路只是輸出了confidece這個值,但它已經包含了 Pr(Object)×IOU,並不需要分別計算Pr(object)和IOU(也沒辦法算)。因為你在訓練階段你給confidence打label的時候,給的是Pr(Object)×IOU這個值,測試的時候,網路吐出來也是這個值。

侷限性

  • YOLO對邊界框預測施加了強烈的空間約束,因為每個網格單元格只能預測兩個框,並且只能有一個類。這種空間約束限制了我們的模型能夠預測的物體數量。我們的模型在處理以群體形式出現的小物體時遇到了困難,比如成群的鳥。
  • 由於我們的模型學會了從資料中預測邊界框,所以它很難推廣到新的或不常見的邊界框。
  • 損失函式對於小bbox和大bbox中的loss的處理是一樣的。大bbox裡的小錯誤通常是可以忽略的,但小bbox裡的小錯誤對IOU的影響要大得多。錯誤是因為不正確的localizations。

YOLOv2

為了增加localization的準確性,檢測的召回率,可檢測類別的數量和檢測的速度。該論文提出了一種聯合訓練演算法:檢測影象用於訓練localization,分類影象用於增加詞彙量和魯棒性。該論文首先介紹了YOLOv2,然後使用了ImageNet中的9000多個類和COCO的檢測資料進行模型訓練,得到的模型是YOLO9000。
YOLOv2沒有擴大模型的深度,也沒有做多模型融合來提高recall和localization,為了增加檢測速度,YOLO做了模型的精簡。

以上的舉措除了convolutional和anchor boxes之外都能使mAP顯著增加。在使用new network情況下,使用anchor boxes在不改變mAP的情況下增加了recall,同時減少了33%的計算量。

Better

  • Batch Normalization:YOLO那時候還沒有BN層,現在加上BN層可以起到正則化的作用。榮譽感模型中沒有出現過擬合,則可以刪去dropout。

  • High Resolution Classifier:從Alexnet開始,大多數的分類器輸入都是256×256,YOLO在訓練分類器時輸入為224×224,在檢測時輸入448×448,網路存在一個切換過程,在YOLOv2中,增加了用448×448來finetune分類器的過程(10epoch)。

  • Convolutional With Anchor Boxes:YOLO使用全連線層來預測bbox的座標資訊,faster-RCNN使用卷積層(上文有提到過)。該論文摒棄了全連線層,使用卷積層和anchor boxes來預測bbox。首先,模型去掉了一個Pooling層來獲得更高的解析度,同時縮小了輸入的解析度:416×416. 模型有32層,最後輸出為13×13。因為個數為奇數的特徵圖一定有一箇中心單元格,一般大的物體都傾向於佔據影象的中心,所以最後在中心有一個單獨的cell來預測這個物體。在YOLO中每個cell都預測兩個bbox,這兩個bbox都預測同一類物體。在YOLOv2中,使用了anchor boxes,每個cell的各個anchor都單獨預測一套分類概率值。

  • Dimension Cluster :為了預測anchor boxes,論文用了聚類的方法。在訓練集的bbox上使用K-means,來找到好的先驗。但是如果使用歐式距離(標準的K-means),大的bbox會比小的bbox出現更多的錯誤。最好的聚類是對IOU的聚類,所以對於聚類的“距離”計算,論文使用如下公式:在這裡插入圖片描述
    取不同的K值測試:在這裡插入圖片描述
    發現K=5時,對於recall和模型複雜度有最好的折中。在這裡插入圖片描述

  • Direct location prediction:在使用anchor boxes中會出現模型不穩定,尤其是在早期的迭代,不穩定的原因是對於box的location的預測。預測值是座標偏移值(tx,ty),先驗框尺寸(Wa,ha),中心座標(Xa,Ya)。bbox的實際中心座標為(X,Y)。則以下計算公式:
    在這裡插入圖片描述
    但是這種計算公式是無約束的,預測的bbox可以向任意方向偏移,如當 時邊界框將向右偏移先驗框的一個寬度大小,而當 時邊界框將向左偏移先驗框的一個寬度大小,因此每個位置預測的邊界框可以落在圖片任何位置,這導致模型的不穩定性,在訓練時需要很長時間來預測出正確的offsets。所以,YOLOv2棄用了這種預測方式,而是沿用YOLOv1的方法,是預測邊界框中心點相對於對應cell左上角位置的相對偏移值,為了將邊界框中心點約束在當前cell中,使用sigmoid函式處理偏移值,這樣預測的偏移值在(0,1)範圍內(每個cell的尺度看做1)。總結來看,根據邊界框預測的4個offsets(tx,ty,tw,th,to),可以按如下公式計算出邊界框實際位置和大小: 在這裡插入圖片描述
    (Cx,Cy)是cell的左上角座標,由於每個cell的尺度為1,而tx,ty經過sigmoid處理後的範圍為(0~1),故預測的bbox的中心只能在當前cell內移動。,(Pw,Ph)是先驗框具有的長度和寬度。它們的值也是相對於特徵圖大小的。這裡記特徵圖的大小為 (W,H)(論文中是13×13)。這樣可以將bbox相對於整張圖片的位置和大小計算出來(4個值均在0和1之間):在這裡插入圖片描述
    如果再將上面的4個值分別乘以圖片的寬度和長度(畫素點值)就可以得到bbox的最終位置和大小了。這就是YOLOv2邊界框的整個解碼過程。約束了邊界框的位置預測值使得模型更容易穩定訓練。在這裡插入圖片描述

  • Fine-Grained Features:對於較小的物體來說,需要更細粒度的特徵。為了採集到更細粒度的特徵,論文裡添加了一個passthrough層,這一層是26×26的特徵圖,也就是最後一個MaxPooling之前的特徵。這種操作和Resnet很像,它把前面高解析度的特徵和後面低解析度的特徵合併在一起,為了保持合併時shape的一致性,passthrough層將該特徵張量向後展開。26×26×512–>13×13×2048,這樣就能和下一層的低解析度的特徵連線。

  • Multi-Scale Training:YOLOv2的模型只使用了卷積層和池化層,他可以處理不同尺寸的輸入。我們希望YOLOv2可以在不同大小的影象上執行,所以我們不固定輸入影象的大小,每過幾個epoch就改變輸入尺寸。由於取樣係數是32,所以輸入的尺寸都是32的倍數:{320,……,608}。這樣可以使網路適應不同輸入維度的檢測。在較小尺寸的輸入下,執行的更快。在這裡插入圖片描述

Faster

  • Darknet-19:使用3×3的filter,每個Pooling層後將channel加倍,在network in network之後使用global average pooling,最後使用1×1的filter壓縮特徵。模型中使用了BN層。在最終的模型中,使用了19個卷積層和5個Pooling層在這裡插入圖片描述

  • Training for classification:使用標準的ImageNet1000,訓練160epoch,使用隨機梯度下降,初始學習率為0.1,多項式速率衰減為4,權重衰減為0.0005,動量為0.9。資料處理使用了標準的資料增強。再用448的size微調的時候,學習率為10-3,訓練10epoch.

  • Training for detection:刪除最後一個卷積層,增加3×3×1024個filters+1×1×檢測的類別數量的filters。VOC資料集,預測5 boxes×(5 coordinate+20classes),所以VOC資料集最後一層卷積層filters有125個。

Stronger

在訓練過程中,我們混合了檢測和分類資料集的影象。當我們的網路看到標記為檢測的影象時,我們可以基於完整的YOLOv2損失函式進行反向傳播。當它看到一個分類影象時,我們只從架構的特定分類部分反向傳播。
用於分類和檢測的資料集的粒度不相同。分類資料集粒度更細,比如一隻狗狗可以分為不同的品種,但是檢測的資料集對於狗狗的標籤並沒有這麼細。在softmax分類中,各個標籤是互相獨立的。這就會導致在檢測和分類中不同的標籤不一定是互相獨立的(分類中互相獨立的狗狗標籤在檢測中統一標為狗狗)。所以使用一種多標籤的model來混合資料集,假設一個圖片可以有多個分類資訊,並假定分類資訊必須是相互獨立的規則可以被忽略。
主要思路是根據WordNet中各個類別的從屬關係,建立樹形結構物——WordTree在這裡插入圖片描述
WordTree中的根節點為"physical object",每個節點的子節點都屬於同一子類,可以對它們進行softmax處理。在給出某個類別的預測概率時,需要找到其所在的位置,遍歷這個path,然後計算path上各個節點的概率之積。
在這裡插入圖片描述
在訓練時,如果是檢測樣本,按照YOLOv2的loss計算誤差,而對於分類樣本,只計算分類誤差。在預測時,YOLOv2給出的置信度就是 ,同時會給出邊界框位置以及一個樹狀概率圖。在這個概率圖中找到概率最高的路徑,當達到某一個閾值時停止,就用當前節點表示預測的類別。在這裡插入圖片描述
ImageNet的分類是對所有標籤做softmax,現在WordTree只需要對同一類近義詞做softmax,它能對於近義詞有更好的分辨性。當遇見未知的物體時,效能就會降低的很gracefully。當它無法細分到某一個label的時候,由於一個物體會有多標籤,它會分到一個比較粗略的標籤。

總結

  • YOLOv2比其他檢測系統在各種檢測資料集的速度更快。此外,它可以適應各種影象大小,以提供速度和精度之間的權衡。
  • YOLO9000是一個實時框架,通過合併優化檢測和分類,檢測超過9000個物件類別。它使用WordTree將來自不同來源的資料與模型相結合,在ImageNet和COCO上同步訓練。
  • ImageNet的WordTree表示為影象分類提供了更豐富、更詳細的輸出空間。使用層次分類的資料集組合將有助於分類和分割領域。
  • 像多尺度訓練這樣的訓練技巧可以提升模型訓練結果。