這篇綜述是我統計信號處理的做業,在這裏分享一下,將介紹計算機視覺中的目標檢測任務,論述自深度學習以來目標檢測的常見方法,着重講yolo算法,而且將yolo算法與其餘的one-stage以及two-stage方法進行比較。git
目標檢測在現實中的應用很普遍,咱們須要檢測數字圖像中的物體位置以及類別,它須要咱們構建一個模型,模型的輸入一張圖片,模型的輸出須要圈出圖片中全部物體的位置以及物體所屬的類別,見圖1。在深度學習浪潮到來以前,目標檢測精度的進步十分緩慢,靠傳統依靠手工特徵的方法來提升精度已經是至關困難的事。而ImageNet分類大賽出現的卷積神經網絡(CNN)——AlexNet[1]所展示的強大性能,吸引着學者們將CNN遷移到了其餘的任務,這也包括着目標檢測任務,近年來,出現了不少目標檢測的方法,這裏將介紹YOLO[2]-[4],RCNN[5]-[7],SSD[8],RetinaNet[9]系列的方法,其中YOLO,SSD,RetinaNet都是one-stage方法,原始RCNN事multi-stage方法,它的延伸FastRCNN以及FasterRCNN則是two-stage方法。RCNN系列方法是先生成候選框,而後根據候選框來進行座標迴歸預測,而YOLO,SSD,RetinaNet則是直接進行迴歸生成座標迴歸,沒有通過候選框這一步。
github
這一節將開始詳細地敘述YOLO三部曲,先介紹YOLOv1,更好更簡單地瞭解YOLO的原理和思想,而後分別介紹YOLOv2以及YOLOv3,看看這兩個模型是使用那些技巧來提高性能。算法
流程:首先YOLOv1會把圖像當作一個sxs的柵格,這裏的s是等於7,每一個柵格預測2個bounding boxes以及柵格含有對象的置信度,同時每一個柵格仍是預測柵格所屬的對象類別,而後經過一些處理方式獲得最後的結果,這個處理方式後面會講到。
npm
架構:而後,咱們來看看YOLOv1的架構,YOLOv1由24層卷積層,4個最大池化層和2個全鏈接層組成,常規操做,咱們關注最後的輸出是7x7x30,這裏是7x7表明輸入圖像的7x7柵格,一一對應,30的前十個表明2個bounding boxes的座標以及對象的置信度,後20個表明VOC數據集的20個類別。
網絡
標籤訂義:YOLOv1是一個監督式的網絡,有監督那就有標籤,來看看標籤是怎樣定義,首先看狗,它被一個框框起來了,這個框就是真實的標籤,框對應的中心在哪一個柵格,就表明當前柵格是狗所在的柵格,這個柵格里就會記錄狗的標籤信息,自行車和小車和狗相似。
架構
損失函數:首先,這個λ是bounding box座標損失的權重,外層求和是多少個柵格,內層求和是每一個柵格的B個Boxes,這個像一的符號,它表明當前box中是否含有真實標籤對象,座標預測咱們只計算有對象的柵格,其餘的柵格不進行計算,這個Ci表明當前柵格含有對象的機率,不光要計算含有對象的,也要計算沒有含有對象的,最後的類別,只計算含有對象的柵格,沒有包含對象的不考慮。根據這個損失進行反向傳播,一步步優化YOLOv1模型。
ide
交併比(IOU): 這是一個評價兩個bounding box相互重合程度的指標,這個指標等於兩個bounding box的交集面積除以它們並集的面積。當兩個bounding box沒有任何交集時,IoU爲0,即IoU的最小取值,當兩個bounding box徹底重合時,IoU爲1,即IoU的最大取值,因此IoU的取值範圍是[0,1]。
函數
推斷:給定一張圖,運行YOLO後,總共有98個bounding box輸出出來,能夠經過非極大值抑制算法獲得最後可靠的結果。大體分兩步,第一步根據閾值去除那些置信度低的bounding box,而後進入一個循環,首先挑選出最大置信度的bounding box做爲預測輸出,而後去除那些與這個最大置信度的bounding box的IoU超過0.5的bounding box,由於咱們能夠看到一個對象有不少bounding box,它們不少是相交的,這樣一個對象的bounding box就肯定好了,而後,咱們再進入循環,找出下一個對象的bounding box,最後直到沒有剩餘的bounding box,循環結束。性能
從三個方面開始介紹YOLOv2,Better,Faster,Stronger。
Better:批歸一化,高分辨分類器,錨盒,維度聚類,細粒度特徵以及多尺度訓練。學習
批歸一化[14](Batch Normalization)的效果則是將數據分佈映射到相對緊湊的分佈,讓網絡能夠更快以及更好地學習,避免過擬合,使用批歸一化這一操做提高了2%mAP。
YOLOv2採用了高分辨率的分類器,在YOLOv1中,將在imagenet預訓練好的網絡遷移到目標檢測網絡中,而訓練imagenet數據集的輸入的大小和目標檢測網絡的輸入尺寸是不一致的,這意味目標檢測網絡須要同時取學習目標檢測並且還要去適應新的分辨率輸入,因此YOLOv2使用目標檢測輸入的分辨率微調了分類網絡,而後遷移到目標檢測網絡中去,這樣,目標檢測網絡就能夠專攻學習目標檢測了,經過這一技巧,使mAP上升了4%。
在YOLOv1中,最後是使用全鏈接層來生成bounding box的座標,然而使用全鏈接的缺點在於丟失了特徵圖的空間信息,形成定位不許,做者借鑑了Faster Rcnn中錨框的思想,利用錨框直接在卷積特徵圖滑窗採樣,由於卷積不須要Reshape,因此很好的保留的空間信息,最終使特徵圖的每一個特徵點和原圖的每一個柵格一一對應。另外,與YOLOv1不一樣的是,YOLOv2是預測的是座標相對於柵格左頂點的偏移量,經過變換公式獲得最後的預測座標。既然錨框是手動精選的先驗框,設想可否一開始就選擇了更好的、更有表明性的先驗Boxes維度,那麼網絡就應該更容易學到準確的預測位置。因此做者經過K-means聚類算法將數據集中的ground truth進行了聚類。最後對模型複雜度和召回率的平衡,選擇5個聚類中心,挑選了5個最具表明性的bounding box。一塊兒提高了5%mAP。
細粒度特徵對於檢測小物體是有很大的影響,隨着圖像尺寸的一步步縮小,圖片中的某些小物體的特徵是會因爲特徵圖的不斷縮小而發生信息丟失,做者經過引入了一個Passthrough Layer,把淺層特徵圖鏈接到深層特徵圖,也就是圖中這個26x26x512的特徵圖經過隔行隔列採樣,變換成13x13x2048的特徵圖,而後和13x13x1024的特徵圖進行按通道concat,經過這一操做,可使mAP提高一個百分點。
而後使爲了讓YOLOv2對不一樣尺寸圖片的具備魯棒性,引入了多尺寸的訓練,每10batch,選擇新的圖像尺寸對網絡進行訓練,最後使精度提高了2個百分點。
經過一系列的改進,YOLOv2相比於YOLOv1,一會兒提升了15個點。
Faster:YOLOv2簡化了網絡,只使用了19卷積層和5個池化層(Darknet-19),不只經過一系列的改進使精度高了,速度方面依然比YOLOv1還要快。
Stronger:強大之處體如今YOLO9000,YOLO9000是在YOLOv2的基礎上提出的一種能夠檢測超過9000個類別的模型,其主要貢獻點在於提出了一種分類和檢測的聯合訓練策略。對於檢測數據集,能夠用來學習預測物體的邊界框、置信度以及爲物體分類,而對於分類數據集能夠僅用來學習分類,可是其能夠大大擴充模型所能檢測的物體種類。可是遇到的一個問題是兩個數據集的類別不是徹底互斥的,好比ImageNet光狗的品種就有100多種,它們與COCO數據集中狗的類別產生衝突,二者是包含關係,針對這一問題,做者提出了一種層級分類方法,主要思路是根據各個類別之間的從屬關係創建一種樹結構,也就是WordTree。
論文中給出了COCO數據集和ImageNet數據集聯合生成的樹結構,藍色的是COCO數據集的類別,橘色的是imageNet的類別,圖15給出一個例子,好比imagenet有這兩種不一樣類型的小獵狗,它們輸入小獵狗這一分支,也屬於獵狗分支,還屬於COCO數據集中狗這一分支,還屬於犬類這一分支。這就是wordtree的構造形式。
每一個節點的子節點都屬於同一子類,因此能夠對它們分類型進行softmax處理。這樣就解決了原始分類的衝突問題。在訓練時,若是是檢測樣本,按照YOLOv2的loss計算偏差,而對於分類樣本,只計算分類偏差。在預測時,YOLOv2給出的置信度是根結點的置信度 ,同時會給出邊界框位置以及一個樹狀機率圖。在這個機率圖中找到機率最高的路徑,當達到某一個閾值時中止,就用當前節點表示預測的類別。
YOLOv3給出的是一個科技報告,在保持實時性的基礎上,對YOLOv2進行了幾點改進,主要有三點:採用邏輯迴歸預測置信度和進行分類,從三個尺度上預測b-box的座標以及特徵提取器發生變化。
邏輯迴歸的使用:在YOLOv2中,每一個cell是直接經過網絡迴歸預測b-box座標和置信度的,YOLOv3則將置信度和座標分開預測,座標預測仍是經過網絡進行預測,而置信度則是單獨經過邏輯迴歸進行預測。在分類上,沒有使用softmax多分類,做者也指出softmax最終對性能也沒有提高,並且softmax假設是每一個box只有一個類,這對遷移到更大有多種類別標籤的數據集是沒有好處的,因此做者使用多個邏輯迴歸來預測分類,使用二元交叉熵計算分類損失。
特徵提取器:YOLOv3從新訓練了一個新的特徵提取器——DarkNet-53,使用了殘差網絡,相比最早進的特徵提取器,性能至關,但浮點數運算更少,速度更快,下采樣沒有使用池化操做,而是經過卷積步長來實現。圖18是DarkNet-53的結構圖。
多尺度預測座標:做者藉由FPN的思想,引用中間層的輸出與後層輸出進行融合,進行三個尺度預測,每一個尺度的每一個cell預測3個座標,以上面爲例,下采樣32倍,最後一塊兒的輸出是8x8x1024,經過卷積層和邏輯迴歸獲得8x8x255(255=3x(5+80),5是座標加置信度,80是coco類別),這就是第一個尺度的預測輸出,第二個尺度是8x8x1024經過上採樣與卷積經過縮放變成16x16x512,而後與上一個stage的16x16x512進行concat,而後經過類似的方式生成16x16x255,相似的操做獲得,獲得32x32x255。
R-CNN:將深度學習應用到目標檢測的開創性工做之一,處理過程如圖19所示,具體有四步,第一步是使用選擇性搜索對輸入圖像提取不一樣尺寸不一樣形狀大小的候選區域,第二步是選取一個預訓練好的深度學習分類模型,將輸出層截取掉,將候選區域形變爲網絡輸入須要的固定形狀,獲得每一個候選區域的特徵圖。第三步是將特徵圖與類別標籤聯合,經過多個SVM分類器來進行分類。第四步是將特徵圖與位置標籤聯合,經過線性迴歸模型預測真實邊界框。
FastRCNN:RCNN是很慢的,每一個候選區域都要經過前向傳播,許多候選區域是相互重疊的,FastRCNN仍是經過選擇性搜索獲得候選框,但FastRCNN是將輸入圖像直接經過預訓練模型,將候選框映射到特徵圖中進行提取感興趣區域,而後不一樣大小的區域經過RoI Pooling層獲得相同大小的特徵向量,最後經過兩個全鏈接層獲得類別和邊界框的預測。具體以下圖20所示。
FasterRCNN:FastRCNN須要經過選擇性搜索獲得許多候選框,才能獲得較準確的精度,FasterRCNN針對這一問題,提出將選擇性搜索替換成區域候選網絡(RPN),經過網絡自動學習提取好的候選區域,從而能夠減小候選區域的數目,提升速度並保證了精度。具體作法是將特徵提取的網絡輸出經過一個填充爲1的3x3的卷積層變換爲通道爲512的特徵圖,這樣特徵圖的每一個單元都有512維的特徵向量,以每一個單元爲中心,生成9個不一樣的錨盒(3個大小,3個不一樣高寬比)並標註它們,使用單元的特徵向量預測錨框的二元類別(foreground-background)以及位置座標,最後使用非極大值抑制去除類似重複的目標邊界框。RPN的大體流程如圖20所示。
SSD:SSD全稱是單發多框檢測,它的具體流程如圖21所示。首先仍是經過截斷全鏈接層的VGG網絡提取特徵,獲得Conv6特徵圖,其中VGG中間層Conv4_3的特徵圖後面會用到,而後將Conv特徵圖不斷地減半,獲得了5個不一樣大小的特徵圖,這樣,分別在Conv4_3的特徵圖以及這5個特徵圖生成錨盒,預測類別與邊界框,方法與FasterRCNN相似,對於寬高大的特徵圖,感覺野小,錨框多,適合檢測小的物體,而對於寬高小的特徵圖,感覺野大,錨框少,則適合檢測大的物體,因此SSD仍是一種多尺度的目標檢測網絡。
RetinaNet:上面介紹了one-stage的檢測器(SSD,YOLO)以及two-stage的檢測器(RCNN系列),但每每two-stage的檢測器性能要強於one-stage,但速度要慢,RetinaNet這篇文章就指出one-stage性能差的一個重要緣由是由b-box的foreground-background類別不平衡問題引發的。Two-stage方法會篩選b-box(RPN減小了background的數目)而且訓練過程會設置foreground-background的比例,類別不平衡的問題要輕許多,而one-stage的方法則是直接回歸最後的邊界框預測,對於一個二分類器來說,某一個類別數目過大,會致使分類器偏向數目大的類別(也就是忽略了重要有物體的foreground,偏向圖像的背景),這個問題會致使目標檢測的精度很低。針對這一問題,這篇文章提出了Focal Loss,經過簡單的loss函數改變,來解決類別不平衡的問題。公式如圖22所示。由標準的交叉熵損失修改而成。α_t和γ參數減小了好分類的樣本的損失,並讓分類器更集中解決更困難樣本。
目標檢測算法通常是在VOC[10]和COCO[11]數據集中進行測試的,下表1給出上述算法在這兩個數據集中的測試結果。限於篇幅,還有不少方法沒有講,特別是更先進的two-stage算法,同時期的two-stage 方法是要比one-stage方法在性能上是要強的,這裏只介紹最基本的two-stage方法。
對於目標檢測這一任務而言,若是更關注性能指標,則能夠參考two-stage系列的方法,而若是更關注實時性的要求,則能夠關注one-stage的方法,這篇報告特別講述了one-stage的YOLO算法,YOLO是以實時性爲基礎的快速目標檢測算法,這種方法很快,也有許多工做,面向GPU和CPU實時性的目標檢測算法都有人作出來,YOLO的含義也頗有意思,YOLO——you only look once,其實還有一種說法,you only live once,別猶豫了,用起來吧。
若有發現錯誤,還請指出,十分感謝!轉載請註明本文地址,謝謝!
[1] Krizhevsky A , Sutskever I , Hinton G . ImageNet Classification with Deep Convolutional Neural Networks[J]. Advances in neural information processing systems, 2012, 25(2).
[2] Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[J]. 2015.
[3] Redmon J , Farhadi A . [IEEE 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - Honolulu, HI (2017.7.21-2017.7.26)] 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - YOLO9000: Better, Faster, Stronger[C]// IEEE Conference on Computer Vision & Pattern Recognition. IEEE, 2017:6517-6525.
[4] Redmon, J., and Farhadi, A.: 2016, arXiv e-prints, arXiv:1612.08242.
[5] Girshick R , Donahue J , Darrell T , et al. Region-Based Convolutional Networks for Accurate Object Detection and Segmentation[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2015, 38(1):142-158.
[6] Girshick R . Fast R-CNN[J]. Computer Science, 2015.
[7] Ren S , He K , Girshick R , et al. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[J]. 2015.
[8] Liu W , Anguelov D , Erhan D , et al. SSD: Single Shot MultiBox Detector[J]. 2015.
[9] Lin T Y , Goyal P , Girshick R , et al. Focal Loss for Dense Object Detection[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017, PP(99):2999-3007.
[10] Everingham M , Eslami S M A , Van Gool L , et al. ThePascalVisual Object Classes Challenge: A Retrospective[J]. International Journal of Computer Vision, 2015, 111(1):98-136.
[11] Lin T Y , Maire M , Belongie S , et al. Microsoft COCO: Common Objects in Context[J]. 2014.
[12] http://cs231n.stanford.edu/slides/2018/cs231n_2018_lecture11.pdf
[13] http://www.javashuo.com/article/p-bwjysbwu-bw.html
[14] Ioffe S , Szegedy C . Batch normalization: accelerating deep network training by reducing internal covariate shift[C]// International Conference on International Conference on Machine Learning. JMLR.org, 2015.
[15] https://towardsdatascience.com/training-object-detection-yolov2-from-scratch-using-cyclic-learning-rates-b3364f7e4755
[16] http://ethereon.github.io/netscope/#/gist/d08a41711e48cf111e330827b1279c31