論文筆記:目標檢測算法(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)實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM