1. 程式人生 > >深度學習目標檢測之YOLO系列

深度學習目標檢測之YOLO系列

近年來目標檢測流行的演算法主要分為兩類:1、R-CNN系列的two-stage演算法(R-CNN、Fast R-CNN、Faster R-CNN),需要先使用啟發式方法selective search或者CNN網路RPN產生候選區域,然後在候選區域上進行分類和迴歸,準確度高但速度慢。2、YOLO,SSD這類one-stage演算法,僅僅使用一個CNN網路直接預測不同目標的類別和位置,速度快但準確性要低一些。

一、You Only Look Once: Unified, Real-Time Object Detection

YOLO將物體檢測當做一個迴歸問題來處理,使用整張影象作為CNN的輸入,直接在輸出層迴歸bbox的位置及其所屬的類別。YOLO檢測物體的速度很快,base YOLO執行在Titan X GPU 上能達到45 FPS,Fast YOLO在保持mAP是之前的其他實時物體檢測器兩倍的同時,速度可達155 FPS。YOLO對密集的小物體檢測效果不好,且在物體定位時更容易出錯,但在背景上預測出不存在的物體(false positive)的情況會少一些,這是因為YOLO在訓練和測試時都能看到整張影象,可以很好的利用上下文的資訊;YOLO比DPM、R-CNN更能學到物體的泛化特徵,這使得YOLO可以從真實影象領域遷移到其他領域,如藝術等。

將輸入圖片劃分成S*S個grid,如果某個物體的中心落在一個grid cell中,則這個cell就負責檢測這個物體。每個cell預測B個bbox及其置信值confidence scores,這個值表示bbox中是否含有物體以及座標有多準:\mathrm{confidence=Pr(Object)*IoU_{pred}^{truth}},如果有物體落在cell中,則第一項取1,反之取0;第二項是預測的bbox與GT box之間的IOU值。

每個bbox由5個預測值組成:x, y, w, h, confidence,座標(x, y)表示bbox中點在cell中的相對位置。每個cell還要預測C個類別條件概率 \mathrm{Pr(Class_{i}|Object)},即在一個cell包含一個物體的前提下,它屬於某個類別的概率。只為每個cell預測一組(C個)類概率,而不考慮框B的數量。

測試時每個cell預測的類別資訊和bbox預測的置信資訊相乘,可得到每個bbox的class-specific confidence score:

        \mathrm{Pr(Class_{i}|Object)*Pr(Object)*IoU_{pred}^{truth}=Pr(Class_{i})*IoU_{pred}^{truth}}

為了評估YOLO在資料集PASCAL VOC上的表現,結構參考GoogLeNet,包括24個卷積層+2個全連線層;使用簡單的1*1降維卷積層+3*3卷積層代替inception模組。令S=7,B=2,C=20,最終的輸出是一個7*7*(2*5+20)的tensor。

首先使用ImageNet 1000-class資料集預訓練卷積層:前20個卷積層+average-pooling層+1個fc層,將預訓練好的卷積層+4個卷積層+2個fc層(w隨機初始化)用於檢測,並將輸入影象的解析度由224*224提升到448*448以獲取更精細的結果。將x, y, w, h的預測結果都歸一化到0和1之間,啟用函式使用Leaky ReLU,避免ReLU梯度消失的問題。

        \phi (x)=\left\{\begin{matrix} x & \mathrm{if}\; x>0\\ 0.1x & \mathrm{otherwise} \end{matrix}\right.

損失函式的設計是讓(x, y, w, h)、confidence、class這三個方面達到很好的平衡,簡單的採用sum-squared error loss作為損失函式會有一些不足:位置誤差和分類誤差的重要性顯然不應對等;一幅圖片中許多grid不包含任何物體,它們對梯度更新的貢獻將遠大於含有物體的少量grid,這會導致網路不穩定甚至發散。為了解決這些問題,增加位置誤差的權重 \lambda _{\mathrm{coord}}=5 減少不含物體的bbox置信損失權重 \lambda _{\mathrm{noobj}}=0.5;使用bbox寬高的平方根代替寬高,使小bbox發生偏移時的損失比大bbox要大。

YOLO的損失函式定義如下,1_{i}^{obj}表示物體是否出現在第i個cell中,1_{ij}^{obj}表示第i個cell中第j個bbox是否負責這個物體。只有當某個grid中含有物體時才對分類錯誤進行懲罰;只有當某個bbox對某個GT box負責時,才會對位置誤差進行懲罰(cell中與真實值的IoU最大的predictor)。

        \lambda _{\mathrm{coord}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{obj}[(x_{i}-\hat{x}_{i})^{2}+(y_{i}-\hat{y}_{i})^{2}]\\\\+\lambda _{\mathrm{coord}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{obj}[(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}})^{2}+(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}})^{2}]\\\\+\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{obj}(C_{i}-\hat{C}_{i})^{2}+\lambda _{\mathrm{noobj}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}1_{ij}^{noobj}(C_{i}-\hat{C}_{i})^{2}\\\\+\sum_{i=0}^{S^{2}}1_{i}^{obj}\sum_{c\in \mathrm{classes}}(p_{i}(c)-\hat{p}_{i}(c))^{2}

YOLO中每個grid預測多個bbox,在訓練時希望每個物體由一個bbox predictor來負責預測(預測>的IoU最大)。

YOLO的缺點:

(1)YOLO對相互靠的很近的物體、很小的群體檢測效果不好,這是因為一個grid中只預測了兩個bbox且只屬於一類。

(2)YOLO依賴於物體識別標註資料,對於非常規的形狀/比例,或者同一物體出現新的不常見的長寬比時,檢測效果不理想,泛化能力弱。

(3)與基於候選區域的方法相比,YOLO的定位誤差大、召回率較低。

(4)YOLO採用了多個下采樣層,網路學到的物體特徵並不精細,會影響檢測效果。

(5)YOLO損失函式中大物體和小物體的IoU誤差對loss貢獻值接近(雖然採用寬高的平方根方式,但沒有徹底解決問題),小物體很小的IoU誤差也會對網路優化造成很大的影響,從而降低了物體檢測的定位準確性。

二、YOLO9000: Better, Faster, Stronger

YOLO9000是將YOLO改進得到YOLOv2後,使用資料集組合方法和聯合訓練演算法得到的實時目標檢測器,可以檢測超過9000中不同的目標類別。YOLOv2相比YOLO的改進之處有:

Better

(1)Batch Normalization:批量標準化使得收斂性顯著提高的同時消除了對其他形式正則化的需求。在YOLO所有卷積層上使用BN可獲得超過2%的mAP提升,還可以從模型中移除dropout而不會導致過擬合。

(2)High Resolution Classifier:所有先進的檢測方法都使用在ImageNet上預訓練的分類器,從AlexNet開始大多數分類器對小於256*256的輸入影象進行操作,YOLO以224*224的解析度訓練分類器網路,並將解析度提高到448進行檢測,這意味著網路必須同時切換到學習目標檢測和調整到新的輸入解析度。對於YOLOv2首先對分類網路(自定義的darknet)在ImageNet上以448*448的解析度進行10個epochs的微調,使得網路有時間調整filters以更好地處理高解析度的輸入,然後在檢測時微調所得到的網路,這種高解析度分類網路可使mAP增加近4%。

(3)Convolutional With Anchor Boxes:相比YOLO直接使用卷積特徵提取器的fc層來預測bbox座標,Faster R-CNN使用手動提取的先驗框預測bbox,RPN只用卷積層預測anchor boxes的偏移和置信度,預測偏移而不是座標簡化了問題,並使網路更容易學習。

作者移除了YOLO中的全連線層,並使用anchor boxes預測bbox。首先去掉一個池化層使卷積層輸出更高的解析度,將網路輸入縮小為416*416而不是448*448,可得到大小為奇數13*13的、有中心點的特徵圖,這是因為大物體傾向於佔據影象的中心,所以在中心有一個單一的位置可以很好的預測目標。

使用anchor boxes會使準確性略微下降、但召回率增加:69.5mAP, recall 81% → 69.2mAP, recall 88%,召回率增加意味著模型有更多的改進空間。YOLO中每張影象只能預測7*7*2=98個bbox,使用anchor boxes後每個cell預測9個錨框共13*13*9=1521個bbox。

(4)Dimension Clusters:當錨盒與YOLO一起使用時有兩個問題。首先錨盒的維度是手動挑選的先驗,雖然在訓練過程中網路也會學習調整至準確的bbox,但如果一開始就選擇了更好的先驗,就容易學到更好的預測。

在訓練集bbox上執行k-means聚類,若使用歐氏距離會導致大box比小box產生更多的誤差。因此作者使用與box尺寸無關的距離度量 \mathrm{d(box,centroid)=1-IoU(box, centroid)},超引數k取5作為模型複雜性和高召回率之間的折中。聚類與手動挑選的錨盒明顯不同,短、寬的box更少而高、窄的bbox更多。

(5)Direct location prediction:YOLO使用錨盒的第二個問題是模型不穩定,尤其是在早期的迭代過程中。大部分的不穩定因素來自預測box的位置(x, y)。RPN中預測值 t_{x}t_{y} 和(x, y)中心座標計算為:

        x=(t_{x}*w_{a})-x_{a}

        y=(t_{y}*h_{a})-y_{a}

例如當預測 t_{x}=1 時,就將box右移錨盒寬度的距離,當 t_{x}=-1 時,就左移相同的距離。這個公式是不受限制的,不論在哪個位置進行預測,任何錨盒都可以在影象任一點結束,隨機初始化的模型需要訓練很長時間才能足夠穩定的預測合理的偏移。因此作者不預測偏移,而是按照YOLO的方法預測相對於grid cell的位置座標,使用sigmoid函式限制預測值在0到1之間。特徵圖(13*13)的每個cell預測5個bbox(聚類得到),每個bbox預測5個值 t_{x},t_{y},t_{w},t_{h},t_{o},其中 t_{o} 是置信度。如果cell距離影象左上角的偏移為 (c_{x},c_{y}),且其先驗bbox的寬高為 p_{w},p_{h},則預測公式為:

        b_{x}=\sigma (t_{x})+c_{x}

        b_{y}=\sigma (t_{y})+c_{y}

        b_{w}=p_{w}e^{t_{w}}

        b_{h}=p_{h}e^{t_{h}}

        \mathrm{Pr(object)*IoU(b,object)}=\sigma (t_{o})

由於限制位置預測引數更容易學習,使網路更穩定,使用維度聚類和直接預測邊界框中心位置的方式比使用錨盒的方式提高近5%的mAP。

(6)Fine-Grained Features(細粒度特徵):類似殘差網路,將高解析度特徵與低解析度特徵結合,可增加1%的mAP。passthrough layer即特徵重排,不涉及到引數學習,前面26*26*512的特徵圖使用按行和按列隔行取樣的方法,可以得到4個新的特徵圖13*13*512,然後進行concat得到13*13*2048的特徵圖,將其拼接到後面的層,相當於特徵融合,有利於檢測小目標。

(7)Muti-Scale Training:由於不含fc層,YOLOv2可以訓練任意尺寸的輸入圖片。作者在若干個迭代後會調整網路,每10個epochs隨機選擇新的圖片尺寸,由於YOLO的降取樣引數為32,所以隨機的尺寸也選擇32的倍數如{320, 352, ..., 608},即最小320*320,最大608*608,然後按照輸入尺寸調整網路進行訓練。

這種機制使得同一個網路可以更好的預測不同尺寸的圖片,在小圖片上執行更快,在大圖片上精度更高。

Faster

(1)Darknet-19:YOLOv2的base net,包括19個卷積層和5個最大池化層。類似VGG多使用3*3的filter,並在池化後double通道數量;參考NIN使用全域性平均池化,並把1*1的卷積核置於3*3卷積核之間,用於壓縮特徵。Darknet-19前向傳播一次只需要55.8億次運算(VGG16為306.9億),在ImageNet上top-1達72.9%、top-5達91.2%的準確率。

(2)Training for classification

作者使用Darknet-19在標準ImageNet 1000類的分類資料集上SGD訓練160個epochs,設定初始學習率0.1,冪為4的多項式速率衰減,0.0005的權重衰減和0.9的動量。訓練時使用常用的資料增強方式如隨機裁剪、旋轉、色調、飽和度及曝光移位等。在使用224*224圖片初始訓練後,使用448*448的圖片微調網路,初始學習率為10^-3訓練10個epochs,高解析度網路使top-1提高到76.5%,top-5提高到93.3%。

(3)Train for detection

作者去掉分類網路最後一個卷積層,並增加3個3*3*1024的卷積層,每個層後接1*1的卷積層,輸出維度是檢測所需數量。對於VOC資料集預測5種boxes大小,每個box包含5個座標值和20個類別,共5*(5+20)=125個輸出維度。新增passthrough layer從3*3*512的卷積層連線到倒數第二個卷積層,使模型有了細粒度特徵。作者的檢測模型以0.001的初試學習率訓練160個epochs,其他超引數設定和資料增強方式同上,在第60和90個epoch時學習率都要除以10。

Stronger

作者提出了一個聯合訓練分類和檢測資料的機制,訓練時混合分類和檢測資料集的圖片,當網路的輸入為檢測圖片時,使用完整的YOLOv2損失函式進行反向傳播;輸入為分類圖片時,只計算損失函式的分類部分。

這種方法的問題在於檢測資料集只有常用的目標和標籤,如“狗”或“船”,而分類資料集會有更廣更深的標籤範圍,如狗的各種品種。如果想在兩個資料集上訓練,需要使用一個連貫的方式來合併這些標籤,並且這些標籤之間不是互斥的,不適用softmax等常規分類方法。作者使用多標籤模型組合不假定互斥的資料集,忽略了關於資料的所有已知的結構,例如所有COCO的類別是互斥的。

Hierarchical classification

ImageNet的標籤是從WordNet中提取的,這是一個構建概念及其相互關係的語言資料庫,結構是有向圖而不是樹。為了簡化問題作者參考ImageNet構建分層樹:檢查ImageNet中的visual nouns,檢視它們在WordNet圖上到根節點的路徑,即physical object。許多同義詞在圖上只有一條路徑,所以先將所有這些路徑新增到樹中,然後遍歷餘下的concept,儘可能少的新增到樹中,如果一個concept到根節點有不同的路徑,選擇最短的一條。

最終得到一個visual concepts的分層模型WordTree,為了使用它進行分類,預測每個節點的條件概率以得到同義詞集合中每個同義詞下義詞的概率,例如在terrier節點預測Pr(Norfolk terrier|terrier), Pr(Yorkshire terrier|terrier), ... 一個特定節點的絕對概率,為沿著樹到達根節點的路徑再乘以條件概率(即該節點到根節點的所有條件概率之積),例如想知道一張圖片是否是Norfolk terrier,計算:

Pr(Norfolk terrier)=Pr(Norfolk terrier|terrier)*Pr(terrier|hunting dog)*...*Pr(mammal|animal)*Pr(animal|physical object)

為了分類假定影象包含一個目標:Pr(physical object)=1。作者在使用1000類ImageNet構建的WordTree上訓練Darknet-19模型,為了建立WordTree1k,新增中間層所需的節點將標籤數從1000擴充套件到1369。訓練時將真實標籤向上層層傳播,若影象被標記為Norfolk terrier,則它也被標記為dog和mammal等。為了計算條件概率,模型預測一個1369維的向量,並計算同concept下義詞的softmax分類。

儘管增加了369個額外的concept,且預測了一個樹結構,但準確率僅少量下降。這種分類方法在新的未知的目標類別上效能會gracefully降低,例如網路看到一隻狗的圖片,但不確定它是什麼型別的狗,網路仍會高度自信的預測為狗,但在下義詞擴充套件之間有低的置信度。

Joint classification and detection

作者使用WordTree組合資料集訓練分類和檢測聯合模型。為了訓練一個大規模的檢測器,使用COCO檢測資料集和完整ImageNet版本中的前9000個類建立組合資料集,還要能夠新增ImageNet未包含的類。這個資料集相應的WordTree有9418個類別,通過下采樣COCO使得ImageNet和COCO的比例僅大於4:1。作者使用YOLOv2架構在聯合資料集上訓練YOLO9000,只用3個prior而不是5個限制輸出大小。YOLO9000使用了諸多工程Trick,雖然在演算法理論上並沒有明確的突破,但效果和實用性有很大的提升。

三、YOLOv3: An Incremental Improvement

待續

參考資料