2016-CVPR-YOLO

論文下載:http://arxiv.org/abs/1506.02640
代碼下載:https://github.com/pjreddie/darknet

此篇博客爲半原創,在翻譯論文的同時參考了網上的一些翻譯與理解,受益頗多,在此感謝其他博主。參考資料沒有列全,深感抱歉。文中如有錯誤,請積極指出,一起學習,共同進步。
物體檢測一系列方法:DPMR-CNNFast R-CNNFaster R-CNNYOLOSSDMask R-CNN等會陸續更新。

**Title:**You Only Look Once: Unified, Real-Time Object Detection
Writer: Joseph Redmon, Santosh Divvalay, Ross Girshick, Ali Farhadiy

關注RBG大神的相關論文。

Abstract

  1. 這篇文章提出了一個新的檢測方法:You Only Look Once(YOLO)
  2. 之前的物體檢測方法通常都轉變爲一個分類問題,比如R-CNN、Fast R-CNN等,YOLO將檢測轉變爲一個迴歸問題。(注意:分類問題的輸出變量是有限個離散值;迴歸問題用於預測輸入變量和輸出變量之間的關係,輸出變量是連續值,迴歸模型表示從輸入變量到輸出變量之間的函數。迴歸問題的學習等價於函數擬合:選擇一條函數曲線使其很好地擬合未知數據且很好地預測未知數據。 )

  3. YOLO從輸入的圖像,僅僅經過一個neural network(即將目標區域位置預測和目標類別預測整合於單個神經網絡模型),直接得到bounding boxes(包圍盒)以及每個bounding box所屬類別的概率。因爲整個檢測過程僅有一個網絡,所有YOLO可以直接end-to-end的優化。(**注意:**end-to-end,即輸入是原始數據,輸出是預測目標,只關心輸入和輸出,中間步驟不管。即原始數據輸入到CNN網絡中,直接輸出圖像中所有目標的位置和類別。原來的輸入端不是直接的原始數據,而是在原始數據中提取的特徵。)

  4. YOLO結構十分的快,標準的YOLO版本實時處理圖像45幀/秒,一個較小版本Fast YOLO,可以達到155幀/秒。它的mAP依然可以達到其他實時監測算法的兩倍。(**注意:**mean Average Precision,平均精確率,目標檢測中衡量識別精度的指標。過程:1.先把所有bounding box找出來,並加上confidence ;2.然後每一類根據confidence從大到小排列;3.每個confidence算出其recall和precision得到每一類的ap曲線 ;4.取mean。)

  5. 同時相比較於其他的state-of-art detection systems(先進的檢測系統),儘管YOLO有更多的localization errors(定位錯誤,即,座標錯誤),但是它有更少的false-positive。(**注意:**false-positive就是指誤報數,即將負類預測爲正類數。文章中提到的backgroud errors指的就是false-positive。)

  6. YOLO可以學習到物體更泛化的特徵,在將YOLO用到其他領域的圖像時(比如artwork),其檢測效果要優於DPM、R-CNN這類方法。(注意:關於DPM、R-CNN的論文也要精讀。)

1 Introduction

  • 設計理念來源:人類只要看一眼圖像,就能立刻知道圖像中的物體在哪裏,以及物體之間的相互作用。人類的視覺系統是快速和準確的,允許我們執行復雜的任務。因此YOLO借鑑了這種思想。
  • 現有檢測系統:將物體檢測問題轉變爲一個分類問題,採用一個分類器去評估一張圖像中,各個位置一定區域的window或者bounding box內,是否包含一個物體?包含了哪些物體?

    1. DPM:(Deformation Parts Models,可變形的零件模型?)採用的是sliding window(滑動窗)的方式去檢測。(**注意:**sliding window方式就是窮舉搜索(Exhaustive Search),選擇一個窗口掃描整張圖像,改變大小再掃描圖像。通過改變窗口大小來適應物體的不同尺寸。做法原始,耗時,雜亂。)

    2. R-CNN、Fast R-CNN:採用的是region proposals(候選框)的方法,先生成一些可能包含待檢測物體的potential bounding box,再通過一個分類器判斷每個bounding box裏是否包含物體,以及物體所屬類別的probablity或者confidence。這種方法的pipeline需要經過好幾個獨立的部分,所以檢測速度很慢,也難以去優化,因爲每個獨立的部分都需要單獨訓練。(**注意:**selective search選擇性搜索,用於目標檢測的區域推薦算法,根據顏色、紋理、大小和形狀的兼容性,計算相似區域的層次分組。採用圖像分割以及使用一種層次算法適應不同尺寸的圖像,多樣性(使用顏色、紋理、大小等多種策略對分割好的區域進行合併)、計算速度快。)

  • YOLO:將物體檢測問題轉變爲迴歸問題,end-to-end方法。直接從圖像像素(即輸入)到bounding box和probabilities(即輸出)。YOLO系統看了一眼圖像就能predict是否存在物體,他們在哪個位置,所以就叫做You Only Look Once(是不是很人類視覺系統很像?)。YOLO的idea十分簡單,如圖1:

    這裏寫圖片描述

將圖像輸入一個單獨的CNN網絡,就會predict出boundingboxes,以及這些bounding boxes所屬類別的概率。YOLO用一整幅圖像來訓練,同時可以直接優化detection performance(檢測性能)。

  • YOLO優點:

    1. YOLO檢測系統非常快。因爲將檢測架構設計成一個迴歸問題,不需要複雜的pipeline。在Titan X(頂級顯卡配置)上,不需要經過批處理,標準版本的YOLO系統可以每秒處理45幀圖像;Fast YOLO可以處理150幀圖像。這就意味着YOLO可以以小於25ms延遲的處理速度,實時地處理視頻。同時,YOLO實時監測的mAP是其他實時監測系統的兩倍。

    2. YOLO在做predict的時候,使用的是全局圖像。與sliding window和region proposals這類方法不同,YOLO一次看一整張圖像,所以它可以將物體整體的class information和appearance information 進行encoding。目前最好的是Fast R-CNN,較容易誤將圖像中的background patches看成是物體,因爲它看的範圍比較小。YOLO的background errors比Fast R-CNN少一半多。

    3. YOLO學到物體更泛化的特徵表示。當在自然場景圖像上訓練YOLO,再在artwork圖像上去測試YOLO時,YOLO的表現甩DPM、R-CNN好幾條街。YOLO模型更能適應新的領域。(注意:結構上的主要特點就是unified detection,使得模型的運行速度快,可以直接學習圖像的全局信息,且可以end-to-end訓練)
  • 但相比R-CNN系列物體檢測方法,YOLO具有以下缺點:

    1. 識別物體位置精準性差。
    2. 召回率低。

2 Unified Detection

  • YOLO將對象檢測的單獨部分統一爲一個neural network,使用來自整個圖像的特徵來預測每個邊界框,並且同時predict圖像的所有邊框,這意味着它在全局範圍內對完整的圖像和圖像中的對象產生了影響。YOLO設計實現end-to-end訓練和實時速度,同時保持較高的平均精度。

  • YOLO檢測系統,先將輸入圖像分成S x S個grid(柵格),如果一個物體的中心掉落在一個grid cell內,這個grid cell就負責檢測這個物體。

  • 每一個grid cell預測B個bounding boxes和它們的confidence scores。這些confidence scores反映了這個模型是否包含物體,以及是這個物體的可能性是多少。confidence的計算公式爲:

    Pr(object)IOUtruthpred

    如果這個cell中不存在object,則score就爲0;否則score就爲predicted box與ground truth之間的IOU。(**注意:**IOU,intersectionover union,就是模型的預測窗口和目標窗口的重疊率,是DetectionResult與GroundTruth的交集比上它們的並集。)
  • 每一個bounding box包含5個predictions:x, y, w, h, confidence。(x, y)表示bounding box的中心與grid cell邊界的相對值;width、height則是相對於整幅圖像的預測值;confidence就是IoU值。

  • 每一個grid cell還要預測C個conditional class probabilities(條件類別概率,針對grid cell):Pr(Classi|Object) 。這些概率被限制在一個object的grid cell上,不管grid cell 中包含多少個bounding boxes,每個grid cell只預測每個類別的條件概率。

  • 在測試階段,將每個grid cell的conditional class probabilities與每個box的confidence predictions相乘:

    Pr(Classi|Object)Pr(Object)IOUtruthpred=Pr(Classi)IOUtruthpred

    上面得到每個bounding box的class-specific confidence score。這樣就把bounding box中預測的類別概率與bounding box中的object很好的契合,都進行了encoding。

這裏寫圖片描述

  • 上圖解釋,將YOLO用於PASCAL VOC數據集時:
    • 本文使用的S=7,即將一張圖像分成7x7=49個grid cells
    • 每一個grid cell預測B=2個bounding boxes(每個bounding box都有5個值,(x, y, w, h, confidence))
    • 同時,PASCAL數據集中有20個類別,則,C=20
    • 因此,最後的prediction是7x7x30的tensor
    • 卷積層負責提取特徵,全連接層負責預測。

2.1 Design

  • YOLO仍用CNN實現,在PASCAL VOC檢測數據集上進行評估。最初的卷積層從圖像中提取特徵,全連接層預測輸出概率和座標。YOLO的CNN結構取自兩篇論文:GoogLeNetNetwork in Network(要去讀!)。YOLO有24個卷積層,隨後是2個全連接層。不像GoogLeNet中使用的inception modules,YOLO採用了Network in NetWork中的結構,在3x3卷積層之後,跟着一個1x1的層。網絡結構如下圖所示:
    這裏寫圖片描述
    (**注意:**GoogLeNet提出了Inception module的概念,旨在強化基本特徵提取模塊的功能,一般的卷積層只是一味增加捲積層的深度,但是在單層上卷積核只有一種,比如對於VGG,單層卷積層只有3X3大小的,這樣特徵提取的功能可能就比較弱。GoogLeNet想的就是能不能增加單層卷積層的寬度,即在單層卷積層上使用不同尺度的卷積核,GoogLenet構建了Inception module這個基本單元,基本的Inceptionmodule中有1x1卷積核,3x3卷積核,5x5卷積核還有一個3x3下采樣)
    (**注意:**Network in Network,提出兩個重要觀點:

    1. 1×1卷積的使用

文中提出使用mlpconv網絡層替代傳統的convolution層。mlp層實際上是卷積加傳統的mlp(多層感知器),因爲convolution是線性的,而mlp是非線性的,後者能夠得到更高的抽象,泛化能力更強。在跨通道(cross channel,cross feature map)情況下,mlpconv等價於卷積層+1×1卷積層,所以此時mlpconv層也叫cccp層(cascaded cross channel parametric pooling)。

  1. CNN網絡中不使用FC層(全連接層)

文中提出使用Global AveragePooling取代最後的全連接層,因爲全連接層參數多且易過擬合。做法即移除全連接層,在最後一層(文中使用mlpconv),後面加一層AveragePooling層。
以上兩點,之所以重要,在於,其在較大程度上減少了參數個數,確能夠得到一個較好的結果。而參數規模的減少,不僅有利用網絡層數的加深(由於參數過多,網絡規模過大,GPU顯存等不夠用而限制網絡層數的增加,從而限制模型的泛化能力),而且在訓練時間上也得到改進。)

  • 這個YOLO在ImageNet classification任務上進行pretrain(以一半的圖像尺寸:224x224),然後再將圖像尺寸變爲448x448,用於detection。YOLO一共使用了24個Convolution Layers,4個Maxpool Layers和2個Fully Connected Layers。Fast YOLO版本只有9個卷積層,filters也更少。最後輸出的Tensor爲7x7x30,7x7對應了49個grid cells,30對應了預測值,其中8維是迴歸的box座標,2維是bounding box的confidence,20維是類別。

2.2 Training

  • 預訓練分類網絡:YOLO在ImageNet 1000-class competition dataset上預訓練一個分類網絡。預訓練的網絡是上圖中網絡的前20層Convolution Layers,加上一個average-pooling layer,最後一個是Fully connected layer。(此時網絡是224*224)
  • 這個預訓練的網絡,本文訓練了大約1周時間,在ImageNet2012的validating dataset上的top-5精度爲88%,本文的training以及inference都是用Darknet(an open soure neural network in C and CUDA)卷積網絡框架完成的。
  • 兩個小細節:

    1. 訓練檢測網絡:轉換模型去執行檢測任務,Ren et al.(paper:Object Dectection Networks on Convolutional Feature Maps)指出了在預訓練的model上增加convolution layer以及connected layer可以改善模型性能。因此,在預訓練的基礎上,增加了4個卷積層和2個全連接層,這些新加的層的參數是隨機初始化的。檢測要求細粒度的視覺信息,所以將圖像的輸入分辨率從224x224調整至448x448。
    2. 最後輸出的爲class probabilities以及bounding box coordinates。但在輸出時,根據圖像的width、height將bounding box的width、height進行歸一化,將值歸一化到0~1的區間。同樣將bounding box中的座標(x, y)通過grid cells的offset歸一化到0~1之間。模型的最後一層,本文使用一個線性激活函數,其餘層都使用leaky rectified linear activation(滲漏整流線性單元):

ϕ(x)={x,0.1x,if x>0otherwise
  • 損失函數方面:損失函數的設計目標就是往座標(x,y,w,h), confidence, classification這三個方面達到很好的平衡。

    1. 本文使用的是sum-squared error(和方誤差,容易優化)來作爲優化目標。但是它將localization error(10維)與classification error(20維)認爲同等地位去衡量優化,如果二者權值一致,會使得模型不穩定,訓練發散。因爲許多grid cells不包含物體,使得這些cells的confidence score爲0,這些不包含物體的grid cells的梯度更新,將會以壓倒性的優勢,覆蓋掉包含物體的grid cells進行的梯度更新。爲了解決這個問題, 本文將localization error以及classification error的loss重新用權重衡量,以平衡上述的失衡問題。簡單的說,就是增加bounding box coordinate的loss和減少不包含物體的grid cells的confidence的loss,設置兩個參數:λcoord=5 (更重視10維的位置預測)和λnoobj=0.5 (減少不包含物體的confidence loss)。而對於包含物體的box的confidence loss的權值還是原來的1。
    2. Sum-squared error同樣在不同大小的bounding box之間存在誤差,它將large box和small box的loss同等對待。因爲相較於large box與groundtruth的偏離,small box偏離一點,結果差別就很大,而large box偏離大一點,對結果的影響較小。 爲了解決這個問題,用了一個很巧妙的trick,即最後並不是直接輸出bounding box的width、height,而是w,h的平方根。如下圖(平方根函數圖像)所示,當bounding box的width、height越小時,發生偏移後,其反映在Y軸上的變化越大。這樣就正確反映了large box與small box對於偏移的敏感性不同。(注意:即增大small box的敏感度,減少large box的敏感度。)
      這裏寫圖片描述
    3. 在YOLO中,每個grid cell 預測多個bounding boxes,但在訓練中,希望每個object(grond true box)只有一個bounding box專門負責(一個object,一個bbox)。具體做法是與object(ground true box)的IoU最大的bounding box負責該object的預測。這種做法稱爲bounding box predictor的specialization(專職化)。隨着訓練的進行,每一個predictor對特定訓練時,需要優化的目標函數(loss function)如下:
      這裏寫圖片描述

注意:

  • 上式中loss function在只有當grid cell中存在object時,纔會對classification error進行懲罰。(條件概率)

  • 上式中loss function也只有在當box predictor對groundtruth box負責的時候,纔會對bounding box coordinate error進行懲罰。(即predictor預測IoU最大的物體)

  • 訓練中,一共進行了135輪迭代,驗證數據集來自PASCAL VOC 2007和2012。測試2012時也包含了2007年數據。訓練中,bachthsize(批尺寸)爲64,momentum(梯度下降法中一種常用的加速技術)爲0.9,decay(權值衰減,防止過擬合)爲0.0005。Learning rate的設置:

    • 在第一輪epoch中,learning rate逐漸從10-3增加到10-2。如果訓練時從一個較大的learning rate開始,通常因爲不穩定的梯度,而使得模型發散。
    • 之後,保持learning rate爲10-2直到epoch=75
    • 再接下來的30輪epoch,learning rate爲10-4

    注意:衝量是梯度下降中一種常用的加速技術。對於深度網絡中,參數衆多,參數值初始位置隨機,同樣大小的學習率,對於某些參數可能合適,對另外一些參數可能偏小(學習過程緩慢),對另外一些參數可能太大(無法收斂,甚至發散),而學習率一般而言對所有參數都是固定的,所以無法同時滿足所有參數的要求。通過引入Momentum可以讓那些因學習率太大而來回擺動的參數,梯度能前後抵消,從而阻止發散。)

  • 防止過擬合(原因:數據太少+模型太複雜):使用了dropout和data augmentation技術:

  • Dropout: 在第一層全連接層後面增加了一個dropout layer,其rate=0.5,以防止層之間的co-adaptation。

注意:經過交叉驗證,隱含節點dropout率等於0.5的時候效率最好,原因是0.5時dropout隨機生成的網絡結構最多)

  • Data augementation: 引入了隨機縮放比例和翻譯的原始圖像大小的20%,還在HSV顏色空間中隨機調整圖像的曝光率和飽和度,達到1:5。

注意:數據增強是爲了獲取更多數據,常見做法:通過一定規則擴充數據。如在物體分類問題裏,物體在圖像中的位置、姿態、尺度,整體圖片敏感度等都不會影響分類結果。可以通過圖像平移、翻轉、縮放、切割等手段將數據成倍擴充。)

2.3 Inference

  • 在訓練好 YOLO 網絡模型後,在 PASCAL VOC 數據集上進行 inference,每一張圖像得到 98 個 bounding boxes,以及每個 bounding box 的所屬類別概率。
  • 當圖像中的物體較大,或者處於 grid cells 邊界的物體,可能在多個 cells 中被定位出來。可以用Non-Maximal Suppression(NMS,非極大值抑制) 進行去除重複檢測的物體,可以使最終的 mAP 提高2−3%,相比較於 NMS 對於 DPM、R-CNN 的提高,不算大。

(**注意:**NMS,針對某一類別,選擇概率最大的bounding box,然後計算它和其他bounding box的IoU值,如果IoU值大於0.5,說明重複率較大,該得分設爲0,如果不大於0.5,則不改;這樣一輪後,再選擇剩下的score裏面最大的那boundingbox,然後計算該bounding box和其它bounding box的IoU,重複以上過程直到最後。)

2.4 Limitations of YOLO

  1. YOLO對相互靠的很近的物體(挨在一起且中點都落在一個grid cell上的情況),還有很小的羣體檢測效果不好,因爲每個grid cell中只能預測兩個box,並且只屬於一類。
  2. 測試圖像中,當同一類物體出現新的、不常見的長寬比時,YOLO的泛化能力偏弱。
  3. Loss functions中對於small bounding boxes,以及large bounding boxes的誤差,均等對待。儘管已經用了平方根的方法優化了這個問題,但是這個問題還沒有很好的解決。
  4. YOLO中最主要的誤差仍是定位不準造成的誤差。

3 效果

  • 下表給出了YOLO與其他物體檢測方法,在檢測速度和準確性方面的比較結果(使用VOC2007數據集)
    這裏寫圖片描述
  • 論文中還給出了YOLO與Fast R-CNN在各方面的識別誤差比例,如下圖。YOLO對背景內容的誤判率(4.75%)比Fast R-CNN的誤判率(13.6%)低很多。但是YOLO的定位準確率較差,佔總誤差比例的19%,而Fast R-CNN僅爲8.6%。
    這裏寫圖片描述

4 改進YOLO v2

  • 爲提高物體定位精準性和召回率,作者又提出了YOLO9000,提高訓練圖像的分辨率,引入了Faster R-CNN中anchor box的思想,對各網絡結構及各層的設計進行了改進,輸出層使用卷積層替代YOLO的全連接層,聯合使用COCO物體檢測標註數據和ImageNet物體分類標註數據訓練檢測模型。相比YOLO,YOLO9000在識別種類、精度、速度和定位準確性等方面都有大大提升。
    這裏寫圖片描述
  • SSD: Single Shot MultiBox Detector,是採用單個深度神經網絡模型實現目標檢測和識別的方法,該方法綜合了Faster R-CNN的anchor box (候選窗口)和YOLO單個神經網絡檢測思路(end-to-end)。與YOLO不同的是,SSD在輸出層只用卷積層,而不是全連接層。

參考資料

內容主要參考如下博客:
論文閱讀:You Only Look Once: Unified, Real-Time Object Detection
http://blog.csdn.net/u010167269/article/details/52638771
YOLO(You Only Look Once)算法詳解
http://blog.csdn.net/u014380165/article/details/72616238
圖解YOLO
https://zhuanlan.zhihu.com/p/24916786?refer=xiaoleimlnote
YOLO詳解
https://zhuanlan.zhihu.com/p/25236464
開源代碼
https://pjreddie.com/darknet/yolo/

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