YOLO系列介紹

語言: CN / TW / HK

YOLOV1

YOLO(You Only Look Once: Unified, Real-Time Object Detection)是Joseph Redmon和Ali Farhadi等於2015年首次提出,在2017年CVPR上,Joseph Redmon和Ali Farhadi又提出的YOLOV2,後又再次提出YOLOV3,它是一個標準的One-stage目標檢測算法。

相對於Faster RCNN系列和SSD系列,它能夠更好的貫徹採用直接回歸的方法獲取到當前需要檢測的目標以及目標類別問題的思想。YOLO算法的核心點在於輸入圖像,採用同時預測多個Bounding box的位置和類別的方法來檢測位置和類別的分類。它是一種更加徹底的端到端的目標檢測識別的方法。相比於Faster RCNN和SSD而言,能夠達到一個更快的檢測速度,但是相對於這兩個系列的算法而言,YOLO算法整體檢測的精度會低一些。

YOLO算法採用直接回歸功能的CNN來完成整個目標檢測的過程。這個過程不需要額外,設計複雜的過程。SSD算法在對目標檢測的過程中,一方面用到了Anchor機制,另一方面需要針對多個不同的feature map來進行預測。Faster RCNN算法需要通過一個RPN網絡來獲取到我們需要的候選Bounding box,再通過後續的預測模型來完成最終的預測結果。YOLO算法相比於這兩種算法而言,沒有Anchor機制,多尺度等等設計的過程。YOLO直接採用一個卷積網絡,最終通過直接回歸的方法,來獲取多個Bounding box的位置以及類別。直接選用整圖來進行模型的訓練並且能夠更好的區分目標和背景區域。

YOLOV1算法的核心思想就在於一方面它通過將圖像分成S*S的格子。對於每一個格子(區域)去負責預測相應的物體。即包含GT物體中心的格子,由它來預測相應的物體。在上圖中有一個帶紅點的格子,它包含了狗的一部分,因此我們就需要用這樣一個格子來檢測狗這種物體。又比如説包含了自行車的格子就用來預測自行車這種物體。

在實際使用的時候,每個格子都會預測B(超參值,通常為2)個檢測框Bounding box及每個檢測框的置信度(表明了當前的格子所包含物體的概率),對於每個檢測框,要預測C個類別概率(含有待檢測物體的可能性)。對於一個格子,它最終預測出來的向量的長度為5*B+C,這裏5包含了每一個Bounding box的(x,y,w,h,c),c是置信度,而整個圖所迴歸的向量長度為(5*B+C)*S*S。

Bounding box信息(x,y,w,h)為物體的中心位置相對格子位置的偏移及寬度和高度,這些值均被歸一化。換句話説,實際上我們預測的值是一個相對的值。置信度反映是否包含物體以及包含物體情況下位置的準確性,定義為

其中

YOLOV1的網絡結構圖

YOLO的網絡結構採用直接回歸的方式來獲取到圖片中所需要檢測到的圖片的位置和類別。從上圖中我們可以看到,它只包含了CNN的網絡結構,從最開始的原始的輸入圖像,經過多層卷積之後,最終通過一個FC層,最終輸出的向量為S*S*(B*5+C)的長度。對於YOLOV1來説,通常S會定義為7*7,B會定義為2,C定義為20,也就是20個類別。通過這樣一個迴歸,我們最終就能夠得到對於每一個格子,它所包含的Bounding box的置信度以及是否包含待檢測物體。如果包含待檢測物體,當前這樣一個物體,它的偏移量是多少以及它的長寬是多少,並且我們能夠得到相應概率的分佈。

通過對FC輸出向量的解碼,解碼之後就能夠得到

這樣兩幅圖,對於第一幅圖雖然每個格子預測了很多Bounding box,但是我們只選擇IoU最高的Bounding box作為物體檢測的輸出。也就是説對於每個格子,我們最終只預測當中的一個物體,實際上這也是YOLO算法的一個缺陷。圖像中可能會包含多個小的目標,此時由於每個格子只預測一個物體,如果一個格子同時出現多個物體的時候,對於小目標預測效果就會變得非常差。這也是YOLOV1算法主要的一個缺陷。通過NMS來進行Bounding box的合併、篩選和過濾之後,我們就能得到最終的檢測結果。

YOLO算法強調網絡使用小卷積,即:1*1和3*3(GoogleNet),能夠一方面減少計算量,另一方面減少模型的大小。網絡相比VGG16而言,速度會更快,但準確度稍差。

  • YOLOV1損失函數

包含了三種Loss,座標誤差 、IoU誤差和分類誤差。這裏每一種Loss也對應到了每一個網格所預測的信息對應的三種Loss。其中座標誤差對應到了S*S*(B*5+C)中的B,也就是Bounding box預測的信息之間的偏差。IoU的Loss對應到了座標的誤差。分類誤差對應到了當前的格子所包含的groud true(gt,物體類別)所產生的誤差。

通過對這三種誤差的結合,最終通過加權方式進行權重考量來得到最終的loss,通過均方和誤差的方式來進行最終的考量用於後續的網絡模型的訓練。

  • YOLOV1網絡訓練

對於YOLOV1的具體使用的時候會用到下面一些技巧

首先在網絡進行目標檢測的時候,會採用預訓練模型來對模型的參數進行初步的訓練,對模型參數進行初始化。這裏採用ImageNet 1000類來對模型進行預訓練。對於分類任務和迴歸任務而言,會存在最後幾重的差異。對於分類任務ImageNet 1000類的FC層的輸出應該是1000,而YOLOV1的FC層最終輸出為S*S*(B*5+C)這樣一個值,因此我們在使用預訓練模型的時候會去掉後面的幾個FC層。

這裏實際上採用了預訓練模型前20個卷積層,並且用這前20個卷積層來初始化YOLO,用於後續的目標檢測任務的訓練,如VOC20數據集。由於ImageNet數據的輸入圖像為224*224,在YOLOV1中會將圖像resize到448*448。對於預訓練模型,如果我們僅僅是使用了它的卷積層,而卷積層對於feature map的大小實際上是不敏感的,它僅僅關注卷積核的參數(大小和通道數)。但是如果我們複用了FC層,FC層的參數量和我們輸入的圖像或者feature map的大小是相關的,如果圖像的大小發生了變化,會影響到FC層的輸入,此時FC層就沒辦法採用預訓練模型來進行訓練了。這裏由於我們在YOLO預訓練的時候只採用了前20個卷積層,去掉了FC層,此時就可以改變圖像的大小,並且能夠保證預訓練模型能繼續使用。

在訓練B個Bounding box的時候,它的GT(真值)的設置是相同的。

  • YOLOV1網絡存在的問題

相對於SSD算法和Faster RCNN算法的效果有一定的差距,

  1. 在進行YOLO最後檢測的時候,輸入尺寸固定,沒有采用多尺度的特徵的輸入。這是相對SSD算法對6個尺度來進行Prio box的提取以及最終的預測。而YOLO算法是一個完整的卷積網絡,沒有提取多尺度的feature map。因此YOLOV1算法在特徵提取的時候通過多個下采樣層學到的最終物體的特徵並不精細,因此也會影響到檢測的效果。
  2. YOLOV1在進行小目標檢測的時候效果差。在同一個格子中包含多個目標時,僅預測一個目標(IoU最高),會忽略掉其他目標,此時就必然會有漏檢的情況產生。
  3. 在YOLOV1的損失函數中關於IoU的loss,實際上並沒有去區分大物體的IoU和小物體IoU的誤差對於網絡訓練loss貢獻值的影響。這裏它們的貢獻值基本上是接近的,實際上對於小物體而言,小物體的IoU的誤差會對網絡優化造成更大的影響,進而降低物體檢測定位的準確性。因此YOLOV1算法在loss設計上也沒有特別多的技巧,這也是後續YOLO算法的改進點。
  4. 如果同一個物體出現新的不常見的長寬比和一些其他情況的時候,YOLOV1算法的泛化能力也較差。
  • YOLOV1網絡性能

上圖是不同尺度訓練的精度與其他網絡的精度對比,我們不難發現YOLOV1在相同的數據集中,他的mAP(精度)下降了很多。但是在檢測速度上,如果只考慮相同尺度的條件下(448*448),YOLO算法能夠達到45FPS,相對於Faster RCNN而言,檢測速度是非常快的。相比於SSD500(即圖像尺寸500*500)的速度也是非常快的,相比於SSD300(圖像尺寸300*300)的速度是非常接近的。也就是説YOLOV1在較大尺寸上的圖像檢測速度能夠保持跟SSD較小圖像檢測速度相同的檢測速度。

YOLOV2

基於YOLOV1存在的問題,作者在2017年提出了YOLOV2的算法,並基於YOLOV2提出了YOLO9000這樣兩種模型。YOLOV2相對於YOLOV1改進的幾個核心的點在於

  1. 引入了Anchor box的思想,改進直接回歸這樣一種比較粗糙的方式
  2. 在輸出層使用卷積層替代YOLOV1的全連接層(FC層),能夠帶來一個比較直觀的好處就是能夠減少對於輸入圖像尺寸的敏感程度。因為FC層的參數量同圖像大小是息息相關的,而卷積層同圖像大小是不存在關聯的。
  3. 對於YOLO9000而言,在最終訓練的時候,實際上是採用了ImageNet物體分類以及coco物體檢測這樣的兩種數據集來對模型進行訓練。用檢測中的數據集中的數據來學習物體的準確的位置信息。用分類數據集來學習分類的信息。通過這種多任務來提高最終網絡的魯棒性。
  4. 相比於YOLOV1而言,YOLOV2不僅在識別物體的種類上,以及精度、速度、和物體的定位上都得到了大大的提升。

YOLOV2算法成為了當時最具有代表性的目標檢測算法的一種,YOLOV2/YOLO9000的改進之處:

在上圖中,我們可以看到主幹網絡採用了DarkNet的網絡結構,在YOLOV1算法中,作者採用了GoogleNet這樣一種架構來作為主幹網絡,它的性能要優於VGGNet的。DarkNet類似於VGGNet,採用了小的3*3的卷積核,在每次池化之後,整個通道的數量都會增加一倍,並且在網絡結構中採用Batch Normalization來進行歸一化處理,進而讓整個訓練過程變得更加的穩定,收斂速度變得更快,達到模型規範化的效果。

由於使用卷積層來代替FC層,因此輸入的圖像尺寸就可以發生變化,因而整個網絡的參數同feature map的大小是無關的。因此我們可以改變圖像的尺寸來進行多尺度的訓練。對於分類模型採用了高分辨率的分類器。

YOLOV1算法只採用了一個維度上的特徵,因此它學到的特徵因此相對來説不會太精細,而YOLOV2採用了一個跳連的結構,換句話説在最終的預測的階段,實際上採用了不同粒度上的特徵,通過對不同粒度上特徵的融合,來提高最終檢測的性能。在最終預測的時候同樣採用了Anchor的機制,Anchor機制也是Faster RCNN或者SSD算法一個非常核心重要的元素,這個元素能夠帶來模型在性能上的提升。

  • Batch Normalization
  1. V1中也大量用了BN,但是在定位層FC層採用了dropout來防止過擬合。
  2. V2中取消了dropout,在整個網絡結構中均採用BN來進行模型的規範化,模型更加穩定,收斂速度更快,
  • 高分辨率分類器
  1. V1中使用224*224的預訓練模型,但是實際上採用了448*448的圖像來用於網絡檢測。這個過程實際上會存在一定的偏差,必然帶來分佈上的差異,
  2. V2直接採用448*448的分辨率微調最初的分類網絡。保證了分類和檢測這樣的兩個模型在分佈上的一致性。
  • Anchor Boxes
  1. 在預測Bounding box的偏移,使用卷積代替FC。我們知道在V1中FC層輸出的向量的大小為S*S*(B*5+C),而V2中直接採用卷積來代替的話,卷積之後的feature map的大小為S*S,(B*5+C)則對應了通道的數量,此時同樣能夠達到V1的FC層相同的效果。
  2. 在V2中輸入的圖像尺寸為416*416,而不是448*448,主要原因就在於圖片中的物體傾向於出現在圖片的中心位置,特別是比較大的物體,因此就需要有一個單獨位於物體中心的位置用來預測這個物體。而YOLO通過卷積層之後,會進行32倍的下采樣。對於416*416的圖像,下采樣32倍之後就會得到一個13*13的feature map。對於448*448的圖像進行32倍下采樣之後得到一個14*14的feature map,此時就不存在這樣一個網格位於圖像的正中心。為了保證feature map必然會存在一個網格位於圖像的正中心,此時我們只需要將經過下采樣之後的feature map的大小定義為13*13,就能保證一定會存在中心的一個Cell,能夠預測位於中心的物體。因此我們要保證最終得到的feature map的大小為13*13,反推過來,進行32倍的上採樣,就能夠得到輸入的尺寸為416。這也是為了後面產生的卷積圖的寬高比為奇數,就能產生一箇中心的Cell。主要原因是作者通過觀察發現大物體通常佔據圖像的中間位置,就需要一個位於中間的Cell來預測位於中間的物體的位置。如果不採用奇數的長寬的話,就需要用到中間的4個Cell來預測中間的物體。通過奇數輸出的技巧就能夠提高總體的效率。
  3. V2加入了Anchor機制之後,對於每一個Cell,會預測多個建議框。相比於之前的網絡僅僅預測B個(B通常為2)建議框而言,採用Anchor Box之後,結果的召回率得到了顯著的提升。但是mAP卻有了一點點的下降。在作者看來準確率只有小幅度的下降,但是召回率提高了非常大,這也反映了Anchor Box確實能夠在一定程度上帶來整個模型性能上的提升。當然我們也需要去進一步優化準確度下降的缺陷,在V2中採用了max pooling的方法來進行下采樣。
  4. 加入了Anchor機制之後,整個Bounding box的預測數量超過了1000個。比如説經過下采樣之後的feature map為13*13的話,每個Anchor需要預測9個Bounding box的話,那麼整個feature map需要預測13*13*9=1521個Bounding box。相比於之前的7*7*2=98個而言,整體需要預測的框的數量就得到了提高。進而也會帶來模型在性能上的提高。但是作者在使用Anchor Box之後也遇到了兩個問題,一個是對於Anchor Box而言,它的寬高維度往往是精選先驗框,雖然在訓練的過程中網絡也會調整Box的寬高維度,最終得到準確的Bounding box的位置,但是作者希望在最開始選擇的時候就選擇那些最具代表性的先驗的Bounding box的維度,這樣就能夠通過網絡更容易的學習到準確的預測的位置。因此作者採用了K-means方法來對Bounding box進行迴歸,自動找到那些更好的Bounding box的寬高維度比。在使用K-means方法來對Bounding box聚類的時候,同樣作者也遇到了一個問題,就是傳統的K-means方法來進行Bounding box聚類的時候,主要採用歐式距離的方法來度量兩個Bounding box之間的相似度,這樣也就意味着較大的Bounding box會比較小的Bounding box產生更多的誤差,因此作者在訓練的時候就採用了IoU得分作為距離的度量。此時所得到的誤差也就和Bounding box的尺寸無關了。經過聚類之後,作者也確定了預測的Anchor Box數量為5的時候比較合適。作者最終選擇了5種大小的Bounding box的維度來進行定位預測。在這樣一個聚類的結果中,作者也發現扁長的框較少,而瘦高的框會較多一點,這實際上也符合了行人的特徵。有關K-means聚類的內容可以參考聚類