目標檢測演算法之YOLO

目標檢測演算法之YOLO

15 人贊了文章

原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不得轉載,不能用於商業目的。

一個小故事

先假設一個場景,幼兒園老師給小朋友們出了一個題目,看誰能最快的找出笑的最美的那張臉?各位SIGAIer也可以試驗下,和小朋友們比比測試下自己的辨識能力。

其中有A、B、C三個小朋友很快找出了那張笑的最開心的臉,緊接著其它小朋友也陸陸續續或快或慢的找到了。

這時候老師請了前三個最快找到的小朋友講授經驗:

  1. 獲得第三名的C小朋友說,我的方法很簡答,從左到右從上到下快速掃描,一個一個表情去判斷就能找出那個笑的最開心的表情。

  1. 獲得第二名的B的小盆友說,我會先確定幾個重點區域,如紅框所示區域(視覺一眼看過去上有差異),然後在對那個區域進行細緻判斷,確定那個笑的最開心的臉。

  1. 輪到獲得第一名的A的小盆友了說了,大家都想知道它為什麼那麼快?A小朋友賣了個關子,我既不會一個一個笑臉去一次判斷,也不會根據區域去判斷。我會快速對全圖進行一層層過濾,在腦海中形成一張小圖總共3x3張笑臉,很容易就找到最後那張笑的最開心的臉。聽過之後其它小朋友一臉疑惑……

上面的例子可能舉得有些牽強,下面會結合檢測的幾種經典的方法一一帶入:

C小朋友代表了基於掃描窗口的方法,比如很多基於HOG+SVM,VJ的方法,很勤奮但是太耿直;B小朋友稍微聰明了點,會根據經驗把可以區域挑選出來在進行判別,類似使用了SelectiveSearch[1]、EdgeBoxes[2]、Bing[3]等proposal的方法,大大縮小了搜索的空間;B和C小朋友雖然都順利達成了目標但是直接在原始圖片中進行分析始終是太耗費精力,而A小朋友的套路則要高明的多,他將圖片一層層在自己的腦海中進行融合縮小,最後在一張濃縮的小圖上快速定位了目標,我們今天要介紹的YOLO[4](You Only Look Once)和第一名A小朋友的思路有異曲同工之妙。

YOLO作為基於深度學習的第一個one-stage的方法做快可以在TitanX GPU上做到45幀每秒的檢測速度,輕量版的可以做到155幀每秒,快到沒朋友有沒有?相比於R-CNN[5]精確度也有非常大的提升53.5 VS 63.4 mAP,真是做到了多快好省!

下面我儘可能講清楚YOLO系列演算法的Insight,水平有限,請各位多多拍磚!

YOLO的動機

YOLO的作者認為,之前的檢測策略比較慢而且難以優化,比如R-CNN為首的候選框+預測位置、分類的這種策略。R-CNN首先產生一些潛在的region proposal,然後用分類器對每一個region進行分類並修正優化物體的邊界,最後銅鼓NMS合併消除重複檢測框,這個過程被業界稱為two-stage。YOLO作為one-stage的鼻祖,將目標檢測看作為單一的回歸問題,直接由圖像像素優化得到物體邊界位置和分類。

YOLOv1的實現細節

YOLOv1網路結構

模型靈感來自於GoogLeNet[6],用1x1 和3x3 卷積核代替inception modules. 激活函數用的是Leaky ReLU : f(x)=max(x,0.1x),在x小於0的時候,用了0.1x,避免使用ReLU

的時候有些單元永遠得不到激活(Dead ReLU Problem),在不增加計演算法複雜度的前提下提升了模型的擬合能力。

YOLOv1由24 層卷積層接2層全連接組成。用ImageNet數據集做預訓練(圖片尺寸224×224),做檢測模型優化時對輸入圖片尺寸放大了兩倍(圖片尺寸448×448)。通過改變訓練數據的飽和度,曝光度,色調,抖動進行數據增強。

模型輸出部分:

7×7×((4+1)×2+20),20是PASCAL VOC數據集是20類。是一個S × S × (B ? (coordinates(x,y) + width + height+ confidence) + C)大小的tensor。S×S是grid cells的個數;B是預測bounding box的個數(YOLOv1里是兩個);coordinates(x,y)表示BB的中心相對於grid cell邊界的位置,寬度和高度是相對於整個圖像預測的;confidence是對象置信度得分,表示一個對象在一個BB中的概率 Pr(object)*10U_{pred}^{truth} ,如果該cell里沒有物體, 那麼confidence 的值應該為零;C是類的個數,表示屬於特定類的檢測對象的概率,是一個條件概率( class_{i}|Object )。總的意思是,一張圖片均分成S×S個cells,每個cell只預測出兩個框,且僅預測一次類別;在預測階段,類別的概率為類別條件概率和單個盒子預測的置信度相乘:

損失函數設計

YOLOv1的損失函數設計簡單粗暴對所有的項統一用sum-squared error進行優化。

損失函數分析:

1. 1_{ij}^{obj} :判斷第i個cell里的第j個BBox是否負責預測這個物體:與GT的IOU最大的BBox負責預測

2. 1_{i}^{obj} :判斷是否有物體落在第i個cell中:如果cell中包含有物體的中心,就負責預測該類。

3. lambda_{noobj} =0.5, lambda_{class} =1,lambda_{obj}=1, lambda_{coord} =5:之所以lambda_{noobj}取0.5是因為背景框的數量要遠大於前景框,不加以限制,confidence的值將趨近於零;為什麼lambda_{coord}取5,作者說得很模糊,意思是如果坐標框的係數和類別一樣的話顯然是不合理的,所以加大了對框的懲罰,但YOLOv2和YOLOv3改用全卷積網路後這個參數就改為1了。

4. [(sqrt{w_{i}}-sqrt{ar{w}_{i}})^{2}+(sqrt{h_{i}}-sqrt{ar{h}_{i}})^{2}] 作者對寬高都進行開根是為了使用大小差別比較大的邊界框差別減小。例如,一個同樣將一個100x100的目標與一個10x10的目標都預測大了10個像素,預測框為110 x 110與20 x 20。顯然第一種情況我們還可以接受,但第二種情況相當於把邊界框預測大了1倍,但如果不使用根號函數,那麼損失相同,但把寬高都增加根號時:

顯然,對小框預測偏差10個像素帶來了更高的損失。通過增加根號,使得預測相同偏差與更小的框產生更大的損失。但根據YOLOv2的實驗證明,還有更好的方法解決這個問題。

YOLOv1的優點

  1. YOLO v1檢測物體非常快。

因為沒有複雜的檢測流程,YOLO將目標檢測重建為一個單一的回歸問題,從圖像像素直接到邊界框坐標和分類概率,而且只預測98個框,YOLO可以非常快的完成物體檢測任務。YOLO在Titan X 的 GPU 上能達到45 FPS。Fast YOLO檢測速度可以達到155 FPS。

2、YOLO可以很好的避免背景錯誤,其它物體檢測演算法使用了滑窗或region proposal,分類器只能得到圖像的局部信息。YOLO在訓練和測試時,由於最後進行回歸之前接了4096全連接,所以每一個Grid cell對應的預測結果都相當於使用了全圖的上下文信息,從而不容易在背景上預測出錯誤的物體信息。和Fast-R-CNN相比,YOLO的背景錯誤不到Fast-R-CNN的一半。

3、YOLO可以學到更泛化的特徵。

當YOLO在自然圖像上做訓練,在藝術作品上做測試時,YOLO表現的性能比DPM、R-CNN等之前的物體檢測系統要好很多。因為YOLO可以學習到高度泛化的特徵,從而遷移到其他領域。

YOLO v1的缺點

  1. 對鄰近物體檢測效果差,由於每個grid cell僅預測兩個框和一個分類,對於多物體的中心位置落入同一cell,YOLOv1力所不及。
  2. 用全連接的問題在於,雖然獲取了全局信息,但是比起1×1卷積來說也丟失了局部

細節信息;全連接帶來了參數量的巨增。

  1. 對不常見的長寬比物體泛化能力偏弱,這個問題主要是YOLO沒有Anchor的不同尺度框的設計,只能通過數據去驅動。
  2. 損失函數的設計問題,對坐標的回歸和分類的問題同時用MSE損失明顯不合理。
  3. 由於YOLOv1是直接預測的BBox位置,相較於預測物體的偏移量,模型會不太好穩定收斂。

YOLOv2的實現細節[7]

YOLOv2網路結構

相較於YOLOv1的改進:

  1. 保留v1數據增強的策略的同時,增加了圖片180°反轉和多尺度訓練。
  2. 添加了batch normalization,捨棄掉了dropout,提升模型泛化能力的同時使得模型更容易收斂。
  3. 首次提出darknet19,並用全卷積替代全連接,解決了v1全連接的問題,大大減少了參數規模。
  4. 不再像v1一樣,直接預測BBox的位置和大小,而是受faster r-cnn影響,有了anchor的概念,從而預測BBox相對於anchor boxes的偏移量。
  5. v2對Faster R-CNN的人為設定先驗框方法做了改進,採樣k-means在訓練集BBox上進行聚類產生合適的先驗框.由於使用歐氏距離會使較大的BBox比小的BBox產生更大的誤差,而IOU與BBox尺寸無關,因此使用IOU參與距離計算,使得通過這些sanchor boxes獲得好的IOU分值。改進的距離評估公式:

使用聚類方法進行選擇的優勢是達到相同的IOU結果時所需的anchor box數量更少,使得模型的表示能力更強,任務更容易學習。同時作者發現直接把faster-rcnn預測region proposal的策略應用於YOLO會出現模型在訓練初期不穩定。原因來自於預測region proposal的中心點相對於anchor boxes中心的偏移量較大,不好收斂,公式如下:

由公式可見,如果預測值=1,region proposal將要向右移一個anchor box的寬度。這個公式對於region proposal和anchor box之間不受限制的,所以隨機初始化模型需要很長時間才能穩定以預測合理的偏移。

作者對此公式做了改進:

由下圖可見,將預測值加以sigmoid運算,將region proposal的中心點牢牢地限定在了anchor box的中心點所在的cell里,很明顯這樣偏移量會好學了很多。

註: C_{x},C_{y} 是當前cell左上角的坐標, p_{w}、p_{h} 是anchor box的長寬, b_{w}、b_{h} 是region proposal的長寬。

輸出從v1的S × S × (B × (coordinates + width + height+ confidence )+ C),變為v2的S × S × B × (coordinates + width + height+ confidence + C)。此時S=13,B=5,且從v1的一個cell預測一個類變為了一個anchor box預測一類。這是為了解決臨近物體檢測效果不好問題。

損失函數改進,v1部分提到過,在處理大、小物體上,損失計算設計的不太好,所以v2不再簡單的對長寬加根號了,而是用 2-w_{ij}*h_{ij} 作為係數加大對小框的損失, w_{ij}和h_{ij} 是第i個cell的第j個BB所匹配到的ground truth的長和寬,它們都是相對於原圖的比例。如果ground truth比較小,它們相乘將趨近於0;如果比較大,則趨近於1。可以得出,小物體的懲罰比大物體重。

為了獲得更多小物體的信息,v2將第16層的feature map進行了下採樣(26->13),同時將channel升維(512->2048),並和第24層做了拼接(Concat),作為最終預測的feature map。

YOLOv3的實現細節[8]

YOLOv3網路結構

相較於前兩版的改進點:

  1. 提出了darknet53,由於加深了網路,應用resnet的思想,添加了residual block,降低了梯度消失的風險。不再使用pooling層,而是用步長為2的卷積層代替,避免了信息丟失,想進一步了解的同學可以拜讀一下這篇文章Springenberg J T, Dosovitskiy A, Brox T, et al. Striving for simplicity: The all convolutional net[J]. arXiv preprint arXiv:1412.6806, 2014.。
  2. 在檢測部分,作者參考了FPN(feature pyramid networks)的思想。用非線性插值方法上採樣了兩次,獲得了3個不同大小的feature maps。和v2相似,作者依然對ground truth 框的大小進行了聚類,不同的是,v3獲得的9個尺度的anchor boxes。每個feature map分配3個尺度的anchor boxes。由於深層、語義特徵豐富的負責預測大物體(分配大anchor);淺層、幾何特徵豐富的負責預測小物體(分配小anchor)。這次不僅框多了,而且更細緻了,對檢測小物體放了大招,所以就目前來說這種策略對檢測小物體已經做到頭了,想要再改進,可能要換思路了,如果一味地增大輸入尺寸顯然是不合理的。
  3. 用Sigmoid代替Softmax,這個改進主要是用於多標籤分類。Softmax輸出的結果有互斥性,只能預測一類,而如果一個物體有多個標籤(如:人和女人),那麼Softmax是做不到的。但是在真實的檢測場景中存在這樣的情況,所以作者使用了Sigmoid函數替代。

最後放一張圖,下個不負責任的結論:YOLOv3是集大成者

參考文獻

[1] Uijlings, J.R., van de Sande, K.E., Gevers, T., Smeulders, A.W.: Selective search for object recognition. IJCV (2013)

[2] C Lawrence Zitnick and Piotr Dollar. Edge boxes: ′ Locating object proposals from edges. In Computer Vision–ECCV 2014, pages 391–405. Springer, 2014.

[3] Ming-Ming Cheng, Ziming Zhang, Wen-Yan Lin, and Philip Torr. Bing: Binarized normed gradients for objectness estimation at 300fps. In Computer Vision and Pattern Recognition, pages 3286–3293, 2014.

[4] J. Redmon, S. Divvala, R. Girshick, and A. Farhadi. You only look once: Unified, real-time object detection. arXiv preprint arXiv:1506.02640, 2015. 5, 6

[5] R. Girshick, J. Donahue, T. Darrell, and J. Malik, 「Region-based convolutional networks for accurate object detection and segmentation,」 IEEE Trans. Pattern Anal. Mach. Intell., vol. 38, no. 1, pp. 142–158, Jan. 2016.

[6] Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, Andrew Rabinovich, Going Deeper with Convolutions, Arxiv Link: arxiv.org/abs/1409.4842.

[7] arxiv.org/pdf/1612.0824

[8] pjreddie.com/media/file

原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不得轉載,不能用於商業目的。

推薦閱讀

[1] 機器學習-波瀾壯闊40年 SIGAI 2018.4.13.

[2] 學好機器學習需要哪些數學知識?SIGAI 2018.4.17.

[3] 人臉識別演算法演化史 SIGAI 2018.4.20.

[4] 基於深度學習的目標檢測演算法綜述 SIGAI 2018.4.24.

[5] 卷積神經網路為什麼能夠稱霸計算機視覺領域? SIGAI 2018.4.26.

[6] 用一張圖理解SVM的脈絡 SIGAI 2018.4.28.

[7] 人臉檢測演算法綜述 SIGAI 2018.5.3.

[8] 理解神經網路的激活函數 SIGAI 2018.5.5.

[9] 深度卷積神經網路演化歷史及結構改進脈絡-40頁長文全面解讀 SIGAI 2018.5.8.

[10] 理解梯度下降法 SIGAI 2018.5.11

[11] 循環神經網路綜述—語音識別與自然語言處理的利器 SIGAI 2018.5.15

[12] 理解凸優化 SIGAI 2018.5.18

[13]【實驗】理解SVM的核函數和參數 SIGAI 2018.5.22

[14]【SIGAI綜述】 行人檢測演算法 SIGAI 2018.5.25

[15] 機器學習在自動駕駛中的應用—以百度阿波羅平台為例(上) SIGAI 2018.5.29

[16] 理解牛頓法 SIGAI 2018.5.31

[17] 【群話題精華】5月集錦—機器學習和深度學習中一些值得思考的問題 SIGAI 2018.6.1

[18] 大話Adaboost演算法 SIGAI 2018.6.1

[19] FlowNet到FlowNet2.0:基於卷積神經網路的光流預測演算法 SIGAI 2018.6.4

[20] 理解主成分分析法(PCA) SIGAI 2018.6.6

[21] 人體骨骼關鍵點檢測 SIGAI 2018.6.8

[22] 理解決策樹 SIGAI 2018.6.11

[23] 用一句話總結常用的機器學習演算法 SIGAI 2018.6.13


推薦閱讀:

TAG:深度學習DeepLearning | 演算法 | 計算機視覺 |