1. 程式人生 > >目標檢測 — two-stage檢測

目標檢測 — two-stage檢測

利用 one 表示 pos 但是 tun search方法 還需 抽取

  目前主流的目標檢測算法主要是基於深度學習模型,其可以分成兩大類:two-stage檢測算法;one-stage檢測算法。本文主要介紹第一類檢測算法,第二類在下一篇博文中介紹。

  目標檢測模型的主要性能指標是檢測準確度和速度,對於準確度,目標檢測要考慮物體的定位準確性,而不單單是分類準確度。一般情況下,two-stage算法在準確度上有優勢,而one-stage算法在速度上有優勢。不過,隨著研究的發展,兩類算法都在兩個方面做改進。

  two-stage檢測算法將檢測問題劃分為兩個階段,首先產生候選區域(region proposals),然後對候選區域分類(一般還需要對位置精修),這類算法的典型代表是基於region proposal的R-CNN系算法,如R-CNN,SPPNet ,Fast R-CNN,Faster R-CNN,FPN等;

1、R-CNN(13)

  R-CNN算法分為4個步驟 :

  • 一張圖像生成1K~2K個候選區域 ,Selective search方法(使用了Selective Search方法從一張圖像生成約2000-3000個候選區域。基本思路如下: 使用一種過分割手段,將圖像分割成小區域 ;查看現有小區域,合並可能性最高的兩個區域(基於顏色、紋理等)。重復直到整張圖像合並成一個區域位置; 輸出所有曾經存在過的區域,所謂候選區域);
  • 對每個候選區域,歸一化為同一尺寸,使用深度網絡提取特征 ;
  • 特征送入每一類的SVM 分類器(二分類),判別是否屬於該類 ;
  • 使用回歸器精細修正候選框位置 ;

  RCNN存在三個明顯的問題:

  1)多個候選區域對應的圖像需要預先提取,占用較大的磁盤空間;

  2)針對傳統CNN需要固定尺寸的輸入圖像,crop/warp(歸一化)產生物體截斷或拉伸,會導致輸入CNN的信息丟失;

  3)每一個ProposalRegion都需要進入CNN網絡計算,上千個Region存在大量的範圍重疊,重復的特征提取帶來巨大的計算浪費。

  4)方法中的三個模型是分別訓練的——CNN提取圖像特征、分類器預測類別、回歸模型tighten bounding box的邊界,這也導致流程不易訓練。

2、SPPNet (14)

   SPP-Net在RCNN的基礎上做了實質性的改進:

  (1)取消了crop/warp圖像歸一化過程

解決圖像變形導致的信息丟失以及存儲問題

  在R-CNN中,由於每個候選區域大小是不同,所以需要先resize成固定大小才能送入CNN網絡,SPP-net正好可以解決這個問題。采用空間金字塔池化(SpatialPyramid Pooling )替換了 全連接層之前的最後一個池化層。為了適應不同分辨率的特征圖,定義一種可伸縮的池化層,不管輸入分辨率是多大,都可以劃分成m*n個部分。這是SPP-net的第一個顯著特征,它的輸入是conv5特征圖 以及特征圖候選框(原圖候選框 通過stride映射得到),輸出是固定尺寸(m*n)特征;

  SPP層原理如下所示,假定CNN層得到的特征圖大小為a×a(比如13×13,隨輸入圖片大小而變化),設定的金字塔尺度為n×n bins(對於不同大小圖片是固定的),那麽SPP層采用一種滑動窗口池化,窗口大小win_size=?a/n?,步為stride=?a/n?stride=?a/n?,采用max pooling,本質上將特征圖均分為n×n個子區域,然後對各個子區域max pooling,這樣不論輸入圖片大小,經過SPP層之後得到是固定大小的特征。一般設置多個金字塔級別,文中使用了4×42×21×1三個尺度。每個金字塔都得一個特征,將它們連接在一起送入後面的全連接層即可,這樣就解決了變大小圖片輸入的問題了。

  技術分享圖片

  (2)只對原圖提取一次特征:SPP的位置,放在所有的卷積層之後,有效解決了卷積層的重復計算問題(速度提高了24~102倍),這是論文的核心貢獻。

  R-CNN每次都要挨個使用CNN模型計算各個候選區域的特征,這是極其費時的,不如直接將整張圖片送入CNN網絡,然後抽取候選區域的對應的特征區域,采用SPP層,這樣可以大大減少計算量,並提升速度。基於SPP層的R-CNN模型在準確度上提升不是很大,但是速度卻比原始R-CNN模型快24-102倍。

  技術分享圖片

  盡管SPP-Net貢獻很大,仍然存在很多問題:

  (1)和RCNN一樣,訓練過程仍然是隔離的,提取候選框 | 計算CNN特征| SVM分類 | Bounding Box回歸獨立訓練,大量的中間結果需要轉存,無法整體訓練參數

  (2)SPP-Net在無法同時Tuning在SPP-Layer兩邊的卷積層和全連接層,很大程度上限制了深度CNN的效果;

  (3)在整個過程中,Proposal Region仍然很耗時

3、Fast R-CNN(15)

  Fast RCNN 在 RCNN的基礎上做了實質性的改進:

  (1)共享卷積層:輸入一張完整的圖片,再把候選框映射到conv5上,得到每個候選框的特征。提出簡化版的ROI池化層(註意,沒用金字塔)。

  技術分享圖片

  (2)多任務Loss層:把類別判斷和位置精調統一用深度網絡實現,不再需要額外存儲。

  在實現上是使用兩個不同的全連接層,第一個全連接層有N+1個輸出(N是類別總數,1是背景),表示各個類別的概率值;第二個全連接層有4N個輸出,表示坐標回歸值(tx,ty,tw,th),這個與R-CNN是一樣的,每個類別都預測4個位置坐標值。Fast R-CNN采用了softmax分類器而不是SVM分類器(softmax性能好一些),定位誤差采用smooth L1 而不是R-CNN中的L2。

 

 技術分享圖片

  總代價為兩者加權和,如果分類為背景則不考慮定位代價。損失函數:

 技術分享圖片 技術分享圖片

4、Faster R-CNN(15)

  Fast R-CNN存在的問題:存在瓶頸:選擇性搜索,找出所有的候選框,這個也非常耗時。那我們能不能找出一個更加高效的方法來求出這些候選框呢?解決:加入一個提取邊緣的神經網絡,也就說找到候選框的工作也交給神經網絡來做了。做這樣的任務的神經網絡叫做Region Proposal Network(RPN)。

  Faster R-CNN的主要貢獻是設計了提取候選區域的網絡RPN,代替了費時的選擇性搜索,將候選框提取合並到深度網絡中,使得檢測速度大幅提高。

  具體做法:將RPN放在最後一個卷積層的後面;RPN直接訓練得到候選區域。RPN網絡的特點在於通過滑動窗口的方式實現候選框的提取,在feature map上滑動窗口,每個滑動窗口位置生成9個候選窗口(不同尺度、不同寬高),提取對應9個候選窗口(anchor)的特征,用於目標分類和邊框回歸,與FastRCNN類似。 目標分類只需要區分候選框內特征為前景或者背景,邊框回歸確定更精確的目標位置。

  技術分享圖片

  一種網絡,四個損失函數:RPN calssification(anchor good.bad);RPN regression(anchor->propoasal);Fast R-CNN classification(over classes);Fast R-CNN regression(proposal ->box)。

  Faster R-CNN模型采用一種4步叠代的訓練策略:(1)首先在ImageNet上預訓練RPN,並在PASCAL VOC數據集上finetuning;(2)使用訓練的PRN產生的region proposals單獨訓練一個Fast R-CNN模型,這個模型也先在ImageNet上預訓練;(3)用Fast R-CNN的CNN模型部分(特征提取器)初始化RPN,然後對RPN中剩余層進行finetuning,此時Fast R-CNN與RPN的特征提取器是共享的;(4)固定特征提取器,對Fast R-CNN剩余層進行finetuning。這樣經過多次叠代,Fast R-CNN可以與RPN有機融合在一起,形成一個統一的網絡。

  其實還有另外一中近似聯合訓練策略,將RPN的2個loss和Fast R-CNN的2個loss結合在一起,然後共同訓練。註意這個過程,Fast R-CNN的loss不對RPN產生的region proposals反向傳播,所以這是一種近似(如果考慮這個反向傳播,那就是非近似聯合訓練)。應該來說,聯合訓練速度更快,並且可以訓練出同樣的性能。

5、最後總結一下各大算法的步驟:

  • RCNN解決的是,“為什麽不用CNN做classification呢?”
  • Fast R-CNN解決的是,“為什麽不一起輸出bounding box和label呢?”
  • Faster R-CNN解決的是,“為什麽還要用selective search呢?”

  (1)RCNN

  • 在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
  • 每個候選框內圖像塊縮放至相同大小,並輸入到CNN內進行特征提取
  • 對候選框中提取出的特征,使用分類器(SVM二分類)判別是否屬於一個特定類
  • 對於屬於某一類特征的候選框,用回歸器進一步調整其位置

  (2)Fast RCNN

  • 在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
  • 對整張圖片輸進CNN,得到feature map
  • 找到每個候選框在feature map上的映射patch,將此patch作為每個候選框的卷積特征輸入到SPP layer和之後的層
  • 對候選框中提取出的特征,使用分類器判別是否屬於一個特定類
  • 對於屬於某一特征的候選框,用回歸器進一步調整其位置

  (3)Faster RCNN

  • 對整張圖片輸進CNN,得到feature map
  • 卷積特征輸入到RPN,得到候選框的特征信息
  • 對候選框中提取出的特征,使用分類器判別是否屬於一個特定類
  • 對於屬於某一特征的候選框,用回歸器進一步調整其位置

  技術分享圖片   

5、FPN (17)

  原有的目標檢測算法通常都是只采用頂層特征做檢測,原因是網絡頂層特征的語義信息比較豐富。然而,雖頂層特征的語義信息豐富,但其中的目標位置信息卻比較粗略,不利於目標包圍框的準確定位;相反,雖然底層特征的語義信息比較少,但其中目標的位置信息卻非常準確。

  FPN 主要解決的是物體檢測中的多尺度問題,通過簡單的網絡連接改變,在基本不增加原有模型計算量情況下,大幅度提升了小物體檢測的性能

  一個自底向上的線路,一個自頂向下的線路,橫向連接(lateral connection)。側向連接通過 1x1 的卷積進行連接(減少特征圖維度同時保證尺寸不變),通過 Add 操作進行 Merge。

  同時利用低層特征高分辨率和高層特征的高語義信息,通過融合這些不同層的特征達到預測的效果。並且預測是在每個融合後的特征層上單獨進行的

  技術分享圖片  

  論文實驗結論:

  <1> 如果沒有top-down的語義增強分支(仍然從不同的層輸出),那麽RPN的AR(average recall)會下降6%左右;

  <2> 如果不進行特征的融合(也就是說去掉所有的1x1側連接),雖然理論上分辨率沒變,語義也增強了,但是AR下降了10%左右!作者認為這些特征上下采樣太多次了,導致它們不適於定位。Bottom-up的特征包含了更精確的位置信息。

  <3> 如果不利用多個層進行輸出呢?作者嘗試只在top-down的最後一層(分辨率最高、語義最強)設置anchors,仍然比FPN低了5%。需要註意的是這時的anchors多了很多,但是並沒有提高AR。

  <4> 在RPN和object detection任務中,FPN中每一層的heads 參數都是共享的,作者認為共享參數的效果也不錯就說明FPN中所有層的語義都相似。

6、Mask R-CNN(17)

  Mask R-CNN在此基礎上更進一步:得到像素級別的檢測結果。 對每一個目標物體,不僅給出其邊界框,並且對邊界框內的各個像素是否屬於該物體進行標記。

  主要貢獻其實就是RoIAlign以及加了一個mask分支。 RoIAlign,是將RoIPooling的插值方式,從最近鄰插值(INTER_NEAREST)方式變為雙線性插值。

  技術分享圖片

參考博客:https://blog.csdn.net/xiaohu2022/article/details/79600037

     https://www.cnblogs.com/skyfsm/p/6806246.html

     https://blog.csdn.net/xyfengbo/article/details/70227173

目標檢測 — two-stage檢測