論文筆記:目標檢測算法(R-CNN,Fast R-CNN,Faster R-CNN,FPN,YOLOv1-v3)

R-CNN(Region-based CNN)

  1. motivation:以前的視覺任務大多數考慮使用SIFT和HOG特徵,而近年來CNN和ImageNet的出現使得圖像分類問題取得重大突破,那麼這方面的成功可否遷移到PASCAL VOC的目標檢測任務上呢?基於這個問題,論文提出了R-CNN。
  2. 基本步驟:如下圖所示,第一步輸入圖像。第二步使用生成region proposals的方法(有不少,論文使用的是seletivce search,ImageNet2013檢測任務的冠軍UVA也使用了該算法)提取約2000個候選區域。因爲CNN固定輸入大小因此第二步和第三步之間須要作一個warped region。第三步將2000個候選區域分別輸入到CNN(AlexNet)計算2000個特徵向量,第四步將各個特徵向量(4096維,相比於以前經常使用的方法UVA減少了2個量級,4k vs 360k)輸入到(類特定的)各個線性SVM中分類(好比VOC的20個類別就有20個SVM)。對於特定類的SVM,因爲有2000個候選區域,因此有2000個結果,使用非極大值抑制來得到得分較高的一些候選區。
  3. CNN的訓練:使用的CNN在ImageNet2012分類數據集上作了預訓練。微調時把最後的1000類改成N+1類,對於VOC而言N爲20,對於ImageNet2013檢測數據集而言N爲200,以IOU大於等於0.5爲正樣本,其它爲負樣本,學習率0.001,每次SGD迭代(128的batch size)中用了32個正窗口(因此類上)和96個背景窗口。
  4. SVM的訓練:以0.3做爲IOU閾值來選取正負樣本。因爲負樣本太多,採用hard negative mining的方法在負樣本中選取有表明性的負樣本。
  5. R-CNN BB:爲了提升定位表現,額外使用了一個bounding box regression。用第五個池化層的特徵輸入到SVM獲取得分,而後(根據最大IOU)構建候選區域和真實區域的數據集,訓練一個迴歸器,能夠對候選區域的位置修正。
  6. 結果比較之VOC:在VOC 2007上調參,在VOC 2010-12上進行預測。CNN在VOC 2012訓練集上作微調,SVM在VOC 2012的訓練驗證集上進行訓練。超越了其它算法。
  7. 結果比較之ImageNet2013:OverFeat是ImageNet2013定位任務的冠軍,對於檢測任務在賽後也得到了第一的成績(24.3%的mAP),是ImageNet2013檢測數據集(200類)上表現最好的檢測算法(當時),而R-CNN用在ImageNet2013的檢測數據集上得到了31.4%的mAP。

Fast R-CNN

  1. R-CNN的三個缺點:多階段(訓練CNN,訓練SVM,訓練bb迴歸器);訓練時空間和時間代價高(對於SVM和bb迴歸器須要把每張圖像的每一個候選區特徵經過CNN提取出來存到磁盤);預測階段很慢(由於要對每張圖像的每一個候選區域提取特徵)。
  2. SPPnet的改進:R-CNN預測慢是由於對於每一個候選區域要過一次CNN而不共享計算,而SPPnet則是使用共享計算來加速。以下第一個圖所示,SPP輸入整張圖,計算一個feature map,在feature map上找到候選區對應的一個子圖,而後對子圖作一個金字塔池化獲得一個固定長度的特徵向量(下圖中獲得的是4x4+2x2+1個特徵)。 儘管如此,SPPnet仍然有多階段以及特徵寫入磁盤的缺點,並且由於SPPnet的特徵是從conv5的feature map上池化而來的,因此只fine-tuning金字塔池化層以後的層(這限制了深層網絡的準確性)。
  3. motivation:Fast R-CNN修正了R-CNN和SPPnet(Spatial pyramid pooling)的缺點,提高了速度和準確率。它是一個單階段的算法,使用了multi-task loss,能夠對整個網絡進行更新,並且不須要把特徵存到磁盤上。
  4. 主要步驟:以下第二個圖所示,輸入爲一整張圖以及一系列的(selective search生成的)候選區域(映射到conv5的feature map上獲得ROI),ROI意爲Region of Interest。像SPPnet同樣對ROI進行池化,只不過這裏是單水平的金字塔池化(以下第一個圖是三水平),好比分紅7x7個子圖對每一個子圖取最大獲得長度爲49個ROI特徵。池化後通過FC,而後分紅兩個分支,一個分支用softmax作分類,一個分支用bb迴歸器作定位,使用multi-task loss進行訓練。
  5. mini-batch sampling:R-CNN和SPPnet在微調訓練時每一個batch是從128張圖像中分別取一個RoI。而Fast取N個圖像,每一個圖像取R/N個ROI(論文中使用N=2,R=128),這樣來自同一個圖像的ROI在前向和後向過程當中就能夠共享內存和計算,提升了效率。採樣時25%的ROI是從IOU爲0.5以上的侯選框選的,剩餘的ROI是從IOU爲[0.1, 0.5)中的侯選框選的。
  6. SGD超參:softamx和bb迴歸器的全鏈接層使用0均值,0.01和0.001的標準差的高斯分佈進行初始化。bias爲0。全部層的權重學習率爲1倍的全局學習率,偏置爲2倍的全局學習率,全局學習率爲0.001。對於VOC07或者、VOC12的訓練,30k次迭代,而後學習率減爲0.0001而後訓練另外10k次迭代。momentum爲0.9,weight decay爲0.0005。
  7. 截斷的SVD:將龐大的全鏈接層壓縮爲截斷的SVD能夠提升檢測速度。
  8. 應該微調哪些層:消融學習(ablation study)中,固定前面的卷積,只微調後面的全鏈接層(像SPPnet那樣)發現mAP降低,說明微調前面的卷積層是重要的。那麼是否是說全部的卷積層都應該被微調呢,不是, 經過實驗發現conv1對mAP影響不大,對於VGG16,發現只須要更新conv3_1以及之後的層。
  9. 其它實驗和討論:經過實驗,發現單尺度能夠得到和多尺度差很少的結果,因此論文的實驗都是使用單尺度。經過實驗,發現更多訓練數據能夠提升mAP。經過實驗,發現softmax比SVM好一點點,差距不大。經過實驗,發現隨着候選區數量的增長,mAP先增後降,說明不是越多越好。將Fast運行在COCO數據集上創建一個初步baseline。


Faster R-CNN

  1. motivation:Fast R-CNN的瓶頸在於生成候選區域(Selective Search的)的方法很是耗時,Faster提出把生成候選區域也放到卷積網絡來作(網絡稱爲RPN,Region Proposal Networks),將RPN和檢測網絡(Fast R-CNN)結合成一個網絡進行統一的訓練和檢測,這樣能夠共享卷積操做,減少計算時間。實驗也代表了Faster能夠提升檢測表現。
  2. 主要步驟:以下第一個圖所示,在原來網絡的最後一層卷積層加入一個RPN來生成ROI,而後根據feature map和ROI進行ROI池化,後面和Fast同樣再接全鏈接,softmax和迴歸器。
  3. RPN結構:設計以下第二個圖,RPN在最後一個卷積層上以nxn的窗口滑動進行卷積(論文中n爲3,所對應的感覺野是很大的),每一個窗口(一小塊3x3的區域)被映射成低維特徵(ZFnet-256d,VGG-512d),而後分爲兩路接兩個1x1卷積獲得分類層和迴歸層。其中k表示事先設計的k個anchor(論文中k爲9,3種scale和3種寬高比組合),分類層的2k個單元中的2表示是或不是,迴歸層的4k個單元中的4表示目標對應的座標位置。最後會根據這兩個層計算一個損失進行訓練。
  4. 訓練RPN:訓練時,和某個grouth truth的IoU值最高的anchor視爲正樣本,和任意ground truth的IoU超過0.7的anchor也視爲正樣本。和全部ground truth的IoU低於0.3的視爲負樣本,其它的忽略,超出原圖邊界的anchor也忽略(若是測試階段獲得這種anchor,則clip到邊界)。一個mini-batch(256)爲一張圖像的多個anchor,正負比例爲1比1。共享卷積層遵循R-CNN的實踐進行ImageNet分類的預訓練來對參數初始化,對ZFnet調整整個網絡,對VGG微調conv3_1以上的層。其它新增層(RPN)用(0,0.01)的高斯分佈初始化參數。前60k次mini-batch使用0.001的學習率,後20k次mini-batch使用0.0001的學習率,在VOC數據集上。momentum爲0.9,weight decay爲0.0005。
  5. RPN和檢測網絡(Fast R-CNN)的訓練:論文采用的是交替訓練的方式,第一步按上述步驟訓練RPN。第二步用RPN產生的候選區域訓練檢測網絡,檢測網絡也進行了預訓練,到這一步,兩者不共享前面的公共卷積層。第三步用檢測網絡的參數初始化RPN前面的公共卷積層,微調RPN,此時RPN和檢測網絡共享前面的卷積層。第四步,微調檢測網絡的後半部分(固定公共卷積層)。另外,RPN產生的區域可能高度重疊,根據RPN的分類分數,使用非極大值抑制(0.7的IOU閾值)來減少候選區域數量。


FPN(Feature Pyramid Networks)

  1. motivation:對不一樣尺度的物體進行識別是圖像任務的一項基本挑戰,以前的作法有以下圖(a)(b)(c)三種,這些作法都有各自的缺點,因而本文提出圖(d)中的作法,即FPN。
  2. 圖(a)特徵化的圖像金字塔:很自然的想法就是將圖像作成不一樣的scale,而後不一樣scale的圖像生成對應的不一樣scale的特徵,實際上全部在 ImageNet 和 COCO檢測任務上取得最好成績的方法都使用了這種方法進行了多尺度預測(好比像SPP那樣預測的時候對多個尺度進行空間金字塔池化)。然而要作這種多尺度訓練(很佔內存)是不可行的,若是要用也只是用在多尺度預測上,即便是用在預測上也會減慢不少時間,也形成了訓練和測試的不一致。
  3. 圖(b)單個特徵圖:因爲CNN對尺度改變的魯棒性(相對傳統的手工特徵),可使用單尺度圖像來進行訓練,爲了更快,最近的檢測系統都採用這種方法(SPP,Fast和Faster)。
  4. 圖(c)層次化的金字塔特徵:直接重用CNN中不一樣層上的多尺度特徵圖,SSD採用了相似的思想,爲了不利用過低層的特徵,SSD從偏後的層開始提取特徵。可是這樣丟失了利用高分辨率的底層特徵,而這樣的特徵對於預測小物體是很重要的。
  5. 圖(d)FPN:因而本文提出了FPN,它能夠和(b)(c)同樣快,可是更準確。具體以下第二個圖所示,高層feature map上採樣,而後和前層(作1x1卷積後的feature map)作element-wise。經過這種bottom-up與top-down結合的方法能夠得到較強的語義特徵,提升檢測的性能。
  6. 應用:論文把FPN應用到RPN,Fast和Faster上,提高了檢測效果。


Yolo(You Only Look Once)v1

  1. motivation:與R-CNN系列算法(產生候選區域,分類,迴歸修正)不一樣,yolo直接用一個單獨的卷積網絡輸入圖像,輸出bb(bounding box)和分類機率。
  2. 優勢:第一是更快(不須要像R-CNN系列那樣複雜的步驟)。第二是站在全局的角度(能夠看到整張圖像)去預測,能夠產生更小的背景偏差。第三是能學到泛化能力強的特徵(實驗代表)。
  3. 缺點:第一是施加了很強的空間限制,致使系統能預測的目標數量有限,並且對靠的很近的物體和很小的物體的檢測效果很差。第二是難以泛化到新的不常見的長寬比物體。第三是損失函數對小bb和大bb的偏差同等對待,小偏差對大bb來講沒什麼,可是對小bb來講影響很大,yolo的主要錯誤就是來源於定位錯誤。還有一點是準確率沒法達到state-of-art的水平。
  4. 主要思想:如下圖所示,將輸入圖像劃分爲SxS的格子,目標(物體)的中心落在哪一個格子內,就由哪一個格子負責。每一個格子檢測B個bb和C個類別的條件機率。每一個bb包含5個值(x, y, w, h, 置信度),其中x和y相對於格子歸一化到0到1,w和h相對於整張圖像歸一化爲0到1,置信度定義爲\(Pr(Object)*IOU_{pred}^{truth}\),咱們但願「若是沒有物體則置信度爲0,若是有物體,Pr爲1,置信度表示爲IOU"。C個類別的條件機率爲\(Pr(Class_i | Object)\)。測試階段用條件機率乘上置信度,獲得一個類相關的置信度。因此最後輸出層的單元數字應該爲SxSx(Bx5+C),論文中S爲7,B爲2,C爲20類(VOC數據集),因此輸出是一個7x7x30的tensor。另外,對於一個大物體,可能出現多個格子對它負責預測,這個時候使用非極大值抑制處理。
  5. 訓練:網絡結構參考GoogleNet作了修改。在ImageNet上作了1000類分類的預訓練,而後增長卷積層和全鏈接層,把224的輸入改爲448(檢測須要更細粒度的視覺信息)。輸出層使用線性激活,其它層使用leaky relu。在VOC07和12的訓練集和驗證集上訓練了135個epochs,在VOC12測試時也使用(加入)了VOC07的測試集進行訓練。batch size 爲64,momentum爲0.9,weight decay爲0.0005。學習率在第一個epoch從0.001緩慢升到0.01,若是一開始使用高學習率會因爲不穩定的梯度致使模型不收斂。而後0.01訓練75個epochs,0.001訓練30個epochs,0.0001訓練最後30個epochs。爲了防止過擬合使用了dropout(第一個鏈接層以後,0.5)和數據加強。
  6. 損失函數:以下(論文中給出的)式子所示。損失函數把定位偏差和分類偏差平等對待可能不太好,並且一張圖像可能不少格子是沒有物體的,使得置信度幾乎爲0,這壓制了確實有物體的格子的梯度,使得模型不穩定。因此須要減少不含物體的bb的置信度帶來的損失(給予一個0.5的權重\(\lambda_{noobj}\)),增長bb座標帶來的損失(給予一個5的權重\(\lambda_{coord}\))。損失函數把大bb和小bb平等對待也不太好,爲了必定程度上彌補這個問題,對於寬度和高度,使用它們的平方根來代替它們自己。
  7. 其它:關於yolo以前在ng深度學習課程中有所瞭解,具體筆記見:ng-深度學習-課程筆記-目標檢測
    \[\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{obj}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] + \\ \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{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}\mathbb{1}_{ij}^{obj}(C_i - \hat{C}_i)^2+ \lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{1}_{ij}^{noobj}(C_i - \hat{C}_i)^2 + \\ \sum_{i=0}^{S^2}\mathbb{1}_{i}^{obj}\sum_{c \in classes}(p_i(c)-\hat{p}_i(c))^2\]

Yolov2

  1. yolov2:從yolov1到yolov2增長了一系列設定來改善yolo,以下第一個圖所示。
  2. hi-res classifier:表示在正式訓練檢測網絡(448x448)以前先使用448x448輸入圖像的分類網絡進行預訓練(在這以前已經在ImageNet上進行224輸入圖像的預訓練)。
  3. convolutional和anchor boxes:表示借鑑Faster的作法,去掉迴歸層以前的全鏈接和池化,在最後一層卷積層上進行anchor box的預測,此舉雖然下降了mAP,可是提升了recall(81到88)。在v1中類別是分配到格子的,因此是最後tensor大小是SxSx(Bx5+C),C是類別。而v2中每一個格子設計多個anchor box(表示每一個格子分配多少個bb),類別分配到了格子的bb中,因此最後tensor大小是SxSxBx(5+C)。
  4. new network:表示使用新的網絡結構做爲檢測的基礎網絡,借鑑了VGG和NIN,提出了Darknet-19。
  5. dimension prior:表示使用k-means聚類來設計anchor的形狀。
  6. location prediction:表示不預測offset(Faster中anchor的預測方式),而是沿用yolov1直接預測相對格子的歸一化座標。
  7. passthrough:表示將最後一層feature map(13x13)和上一層(26x26)調整後的feature map進行concat,由於對於小目標經過層層卷積後可能就不見了,因此鏈接一下上一層的特徵圖。
  8. multi-scale:表示的是多尺度訓練。
  9. hi-res detector:表示使用更高分辨率的輸入圖像。
  10. yolo9000:yolo9000以yolov2爲主網絡,經過聯合優化分類和檢測的方法,同時訓練兩個數據集(WordTree結合了ImageNet和COCO的數據集),使得系統可以檢測超過9000類的物體,其中WordTree以下第二個圖所示。


Yolov3

  1. bb預測:對於每一個bb的objectness score使用邏輯迴歸。當bb是某個ground truth的最大IOU時則應該預測爲1。假如bb並非最高的,只是(跟ground truth的)IOU大於某個閾值,則忽略預測,跟Faster同樣。和Faster不同的是,對於ground truth只分配一個bb。若是一個bb沒有被分配到ground truth就沒有座標損失和分類損失,只有objectness損失。
  2. 類預測:每一個bb的分類預測使用獨立邏輯迴歸以及binary cross-entropy而不使用softmax。這樣有助於遷移到更復雜的領域(好比Open Image Dataset中存在重疊標籤,好比女人和人),而softmax假定了一個box只屬於某一個類。
  3. 跨尺度預測:借鑑FPN(feature pyramid network)的作法,從三個不一樣尺度上提取特徵,主要就是把前層的feature map拉過來作上採樣而後concat。COCO的實驗中,每一個尺度預測3個boxes因此tensor爲NxNx[3x(5+80)],80表示類別。
  4. 特徵提取:在Darknet-19基礎上加入了殘差結構,提出了Darknet-53。

參考文獻

  1. R-CNN(2014 CVPR):Rich feature hierarchies for accurate object detection and semantic segmentation模型源碼-caffe(matlab)實現
  2. Fast R-CNN(2015 ICCV):Fast R-CNN模型源碼-caffe實現
  3. Faster R-CNN(2015 NIPS):Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks模型源碼-caffe實現
  4. FPN(2017 CVPR):Feature Pyramid Networks for Object Detection模型源碼-caffe實現
  5. Yolov1(2016 CVPR):You Only Look Once: Unified, Real-Time Object Detection模型源碼-darknet(C和cuda)
  6. Yolov2(2017 CVPR):YOLO9000: Better, Faster, Stronger模型源碼-darknet(C和cuda)
  7. Yolov3:YOLOv3: An Incremental Improvement模型源碼-darknet(C和cuda)實現
相關文章
相關標籤/搜索