深度學習-目標檢測(R-FCN)

1、R-FCN初探算法


1. R-FCN與傳統二階段網絡的異同點

 

    圖1 R-FCN與傳統二階段網絡的異同點

  相同點:首先,二者二階段的檢測框架(全卷積子網絡+RoI-wise subnetwork); 其次二者最終輸出的結果都是相應的類別和對應的BBox;

  不一樣點:如上圖所示,咱們能夠看到和Faster R-CNN相比,R-FCN具備更深的共享卷積網絡層,這樣能夠得到更加抽象的特徵;同時,它沒有RoI-wise subnetwork,不像Faster R-CNN的feature map左右都有對應的網絡層,它是真正的全卷積網絡架構;從圖中的表格能夠看出Faster R-CNN的共享卷積子網絡是91層,RoI-wise子網絡是10層,而R-FCN只有共享卷積子網絡,深度爲101層。與R-CNN相比,最大的不一樣就是直接得到整幅圖像的feature map,再提取對應的ROI,而不是直接在不一樣的ROI上面得到相應的feature map。

 2. 分類網絡的位置不敏感性和檢測網絡的位置敏感性

  博主以我的理解解釋一下「分類網絡的位置不敏感性」與「檢測網絡的位置敏感性」網絡


            

 

    圖2 分類網絡的位置不敏感性和檢測網絡的位置敏感性
 

  分類網絡的位置不敏感性:對於分類任務而言,我但願個人網絡有一個很好地分類性能,隨着某個目標在圖片中不斷的移動,個人網絡仍然能夠準確的將你區分爲對應的類別。如上圖所示,無論小貓在圖片中如何移動,個人分類網絡都想要準確的將你分類爲貓。即個人網絡有很好地區分能力。實驗代表,深的全卷積網絡可以具有這個特性,如ResNet-101等。

  檢測網絡的位置敏感性:對於檢測任務而言,我但願個人網絡有一個好的檢測性能,能夠準確的輸出目標所在的位置值。隨着某個目標的移動,個人網絡但願可以和它一塊兒移動,仍然可以準確的檢測到它,即我對目標位置的移動很敏感。我須要計算對應的誤差值,我須要計算個人預測和GT的重合率等。可是,深的全卷積網路不具有這樣的一個特徵。

  所以,分類網絡的位置不敏感性和檢測網絡的位置敏感性的一個矛盾問題,而咱們的目標檢測中不只要分類也要定位,那麼如何解決這個問題呢,R-FCN提出了Position-sensitive score maps來解決這個問題。

3. R-FCN網絡的背景

  Faster R-CNN系列的網絡均可以分紅2個部分:ROI Pooling以前的共享全卷積網絡和ROI Pooling以後的ROI-wise子網絡(用來對每一個ROI進行特徵提出,並進行迴歸和分類)。第1部分就是直接用普通分類網絡的卷積層,用來提取共享特徵,而後利用ROI Pooling在最後一層網絡造成的feature map上面提取針對各個RoIs的特徵向量,而後將全部RoIs的特徵向量都交給第2部分來處理(即所謂的分類和迴歸),而第二部分通常都是一些全鏈接層,在最後有2個並行的loss函數:softmax和smoothL1,分別用來對每個RoI進行分類和迴歸,這樣就能夠獲得每一個RoI的真實類別和較爲精確的座標信息啦(x, y, w, h)。

  須要注意的是第1部分一般使用的都是像VGG、GoogleNet、ResNet之類的基礎分類網絡,這些網絡的計算都是全部RoIs共享的,在一張圖片上面進行測試的時候只須要進行一次前向計算便可。而對於第2部分的RoI-wise subnetwork,它卻不是全部RoIs共享的,主要的緣由是由於這一部分的做用是「對每一個RoI進行分類和迴歸」,因此不能進行共享計算。那麼問題就處在這裏,首先第1部分的網絡具備「位置不敏感性」,而若是咱們將一個分類網絡如ResNet的全部卷積層都放置在第1部分用來提取特徵,而第2部分則只剩下全鏈接層,這樣的目標檢測網絡是位置不敏感的(translation-invariance),因此其檢測精度會較低,並且這樣作也會浪費掉分類網絡強大的分類能力(does not match the network's superior classification accuracy)。而ResNet論文中爲了解決這個問題,作出了一點讓步,即將RoI Pooling層再也不放置在ResNet-101網絡的最後一層卷積層以後而是放置在了「卷積層之間」,這樣RoI Pooling Layer以前和以後都有卷積層,而且RoI Pooling Layer以後的卷積層不是共享計算的,它們是針對每一個RoI進行特徵提取的,因此這種網絡設計,其RoI Pooling層以後就具備了位置敏感性(translation-variance),可是這樣作會犧牲測試速度,由於全部的RoIs都須要通過若干層卷積計算,這樣會致使測試速度很慢。R-FCN就是針對這個問題提出了本身的解決方案,在速度和精度之間進行折中。

2、R-FCN架構分析

1. R-FCN算法步驟架構



     圖3 R-FCN結構圖

  如圖所示,先來分析一下R-FCN算法的整個運行步驟,使得咱們對整個算法有一個宏觀的理解:
    1) 選擇一張須要處理的圖片,並對這張圖片進行相應的預處理操做;框架

    2) 將預處理後的圖片送入一個預訓練好的分類網絡中(這裏使用了ResNet-101網絡的Conv4以前的網絡),固定其對應的網絡參數;
    3) 在預訓練網絡的最後一個卷積層得到的feature map上存在3個分支,第1個分支就是在該feature map上面進行RPN操做,得到相應的ROI;第2個分支就是在該feature map   上得到一個K*K*(C+1)維的位置敏感得分映射(position-sensitive score map),用來進行分類;第3個分支就是在該feature map上得到一個4*K*K維的位置敏感得分映射,用  來進行迴歸;
    4) 在K*K*(C+1)維的位置敏感得分映射和4*K*K維的位置敏感得分映射上面分別執行位置敏感的ROI池化操做(Position-Sensitive Rol Pooling),這裏使用的是平均池化操   做,得到對應的類別和位置信息。

  這樣,咱們就能夠在測試圖片中得到咱們想要的類別信息和位置信息啦。

2. Position-Sensitive Score Map解析

  圖3是R-FCN的網絡結構圖,其主要設計思想就是「位置敏感得分映射(position-sensitive score map)」。如今咱們來解釋一下其設計思路。若是一個RoI中含有一個類別C的物體,咱們將該RoI劃分爲K*K 個區域,其分別表示該物體的各個部位,好比假設該RoI中含有的目標是人,K=3,那麼就將「人」劃分紅了9個子區域,咱們將RoI劃分爲K*K個子區域是但願這個RoI在其中的每個子區域都應該含有該類別C的物體的各個部位,當全部的子區域都含有各自對應的該物體的相應部位後,那麼分類器纔會將該RoI判斷爲該類別。也就是說物體的各個部位和RoI的這些子區域是「一一映射」的對應關係。

  OK,如今咱們知道了一個RoI必須是K*K個子區域都含有該物體的相應部位,咱們才能判斷該RoI屬於該物體,若是該物體的不少部位都沒有出如今相應的子區域中,那麼就該RoI判斷爲背景類別。那麼如今的問題就是網絡如何判斷一個RoI的 K*K個子區域都含有相應部位呢?

  這其實就是position-sensitive score map設計的核心思想了。R-FCN會在共享卷積層的最後一層網絡上接上一個卷積層,而該卷積層就是位置敏感得分映射,該score map的含義以下所述,首先它就是一層卷積層,它的height和width和共享卷積層的同樣(即具備一樣的感覺野),可是它的通道個數爲K*K*(C+1) 。其中C表示物體類別種數,再加上1個背景類別,因此共有(C+1)類,而每一個類別被分紅 K*K個score maps。如今咱們只針對其中的一個類別來進行說明,假設咱們的目標屬於人這個類別,那麼其有 K*K 個score maps,每個score map表示原始圖像中的哪些位置含有人的某個部位,該score map會在含有對應的人體的某個部位的位置有高的響應值也就是說每個score map都是用來描述人體的其中一個部位出如今該score map的何處,而在出現的地方就有高響應值」。既然是這樣,那麼咱們只要將RoI的各個子區域對應到屬於人的每個score map上而後獲取它的響應值就行了。可是要注意的是,因爲一個score map都是隻屬於一個類別的一個部位的,因此RoI的第 i個子區域必定要到第i張score map上去尋找對應區域的響應值,由於RoI的第i個子區域須要的部位和第i張score map關注的部位是對應的。那麼如今該RoI的K*K個子區域都已經分別在屬於人的K*K個score maps上找到其響應值了,那麼若是這些響應值都很高,那麼就證實該RoI是人呀。固然這有點不嚴謹,由於咱們只是在屬於人的 K*K個score maps上找響應值,咱們尚未到屬於其它類別的score maps上找響應值呢,萬一該RoI的各個子區域在屬於其它類別的上的score maps的響應值也很高,那麼該RoI就也有可能屬於其它類別呢?是吧,若是2個類別的物體自己就長的很像呢?這就會涉及到一個比較的問題,那個類別的響應值高,我就將它判斷爲哪一類目標。它們的響應值一樣高這個狀況發生的概率很小,咱們不作討論。

  OK,這就是position-sensitive score map的所有思想了,應該很容易理解了吧。

3. Position-Sensitive Rol Pooling解析

  上面咱們只是簡單的講解了一下ROl的K*K個子區域在各個類別的score maps上找到其每一個子區域的響應值,咱們並無詳細的解釋這個「找到」是如何找的?這就是位置敏感Rol池化操做(Position-sensitive RoI pooling),其字面意思是池化操做是位置敏感的,下來咱們對它進行解釋說明。

  如圖3所示,經過RPN提取出來的RoI區域,其是包含了x,y,w,h的4個值,也就是說不一樣的RoI區域可以對應到score map的不一樣位置上,而每一個RoI會被劃分紅K*K個bins(也就是子區域。每一個子區域bin的長寬分別是 h/k 和 w/k ),每一個bin都對應到score map上的某一個區域。既然該RoI的每一個bin都對應到score map上的某一個子區域,那麼池化操做就是在該bin對應的score map上的子區域執行且執行的是平均池化。咱們在前面已經講了,第i個bin應該在第i個score map上尋找響應值,那麼也就是在第i個score map上的第i個bin對應的位置上進行平均池化操做。因爲咱們有(C+1)個類別,因此每一個類別都要進行相同方式的池化操做。
  圖3已經很明顯的畫出了池化的方式,對於每一個類別,它都有K*K個score maps,那麼按照上述的池化方式,ROI能夠針對該類別能夠得到K*K個值,那麼一共有(C+1)個類別,那麼每一個RoI就能夠獲得K*K*(C+1)個值,就是上圖的特徵圖。那麼對於每一個類別,該類別的K*K個值都表示該RoI屬於該類別的響應值,那麼將這K*K個數相加就獲得該類別的score,那麼一共有(C+1)個scores,那麼在這(C+1)個數上面使用簡單的softmax函數就能夠獲得各個類別的機率了(注意,這裏不須要使softmax分類器了,只須要使用簡答的softmax函數,由於這裏就是經過簡單的比大小來判斷最終的類別的)。

4. Position-Sensitive Regression解析

  前面的position-sensitive score map和Position-sensitive RoI pooling獲得的值是用來分類的,那麼天然須要相應的操做獲得對應的值來進行迴歸操做。按照position-sensitive score map和Position-sensitive RoI pooling思路,其會讓每個RoI獲得(C+1)個數做爲每一個類別的score,那麼如今每一個RoI還須要 4個數做爲迴歸偏移量,也就是x,y,w,h的偏移量,因此仿照分類設計的思想,咱們還須要一個相似於position-sensitive score map的用於迴歸的score map。那麼應該如何設置這個score map呢,論文中給出了說明:即在ResNet的共享卷積層的最後一層上面鏈接一個與position-sensitive score map並行的score maps,該score maps用來進行regression操做,咱們將其命名爲regression score map,而該regression score map的維度應當是 4*K*K ,而後通過Position-sensitive RoI pooling操做後,每個RoI就能獲得4個值做爲該RoI的x,y,w,h的偏移量了,其思路和分類徹底相同。

 

5. 爲何position-sensitive score map可以在含有某個類別的物體的某個部位的區域上具備高響應值?

  這種有高響應值如今只是做者本身設想的啊,若是網絡不知足這一點的話,那麼咱們前面的全部分析都不成立啦。如今咱們就大體解釋一下爲何訓練該網絡可以讓網絡最終知足這一點。首先根據網絡的loss計算公式,若是一個RoI含有人這個「物體」,那麼該RoI經過position-sensitive score map和Position-sensitive RoI pooling獲得的(C+1)個值中屬於人的那個值必然會在softmax損失函數的驅動下變得儘可能的大,那麼如何才能使得屬於人的這個值儘可能的大呢?那麼咱們須要想一想屬於人的這個預測值是怎麼來的?通過前面的分析,咱們已經知道它是經過Position-sensitive RoI pooling這種池化操做得到的,那麼也就是說使得(C+1)個值中屬於人的那個類別C的值儘可能大,必然會使得position-sensitive score map中屬於人的那個score map上的RoI對應的位置區域的平均值儘可能大,從而會使得該score map上在該區域上的響應值儘可能大,由於只有該區域的響應值大了,才能使得預測爲人的機率大,纔會下降softmax的loss,整個訓練過程才能進行下去。函數


    圖4 位置敏感得分映射表現1性能


    圖5 位置敏感得分映射表現2

  如圖4和圖5所示,咱們一樣能夠得出以上的結論。如圖5所示,咱們輸入了一張含有一個小孩的圖片,圖中黃色的BBox表示咱們的檢測到的目標,也就是咱們的一個ROI,接下來是9張位置敏感的得分映射圖(在這裏使用的是3x3的特徵映射),這9張圖分別表示對人這個目標的top-left、top-center、... bottom-right不一樣區域敏感的得分映射。對應到圖中就是將這個ROI分爲9個子區域,每個子區域其實大體上對應到了小孩的不一樣部位,而不一樣的部位通常都會有其獨特的特徵存在,9個區域敏感得分映射圖對不一樣的區域比較敏感(所謂的敏感就是說若是這個子區域中存在該目標的某個部位特徵時,其纔會輸出較大的響應值,不然的話會輸出較小的響應值)。圖5中的9個得分映射對ROI中劃分的對應子區域都比較敏感(都有很強的響應值,越白表示響應越大,越黑表示響應越小),即ROI中的9個子區域都有較大的響應值。而後進行位置敏感池化操做,最後進行Vote操做,因爲9個區域中基本上都有很高的響應值,最後投票經過,認爲這個ROI中的對象是一個person。同理,能夠得出圖6是一個背景類。(圖6的位置敏感ROI池化中有5個區域是黑色的,即表示具備較低的響應值,只有4個區域比較高,即表示具備較高的響應值,根據Vote機制,就將其分類爲背景類)。
 

6. Loss計算及其分析學習


  這個Loss就是兩階段目標檢測框架經常使用的形式。包括一個分類Loss和一個迴歸Loss。λ用來平衡二者的重要性。對於任意一個RoI,咱們須要計算它的softmax損失,和當其不屬於背景時的迴歸損失。這很簡單,由於每一個RoI都被指定屬於某一個GT box或者屬於背景,即先選擇和GT box具備最大重疊率(IOU)的Rol,而後在剩餘的Rol中選擇與GT box的重疊率值大於0.5Rol進行匹配操做,最後將剩餘的Rol都歸爲背景類。即每一個Rol都有了對應的標籤,咱們就能夠根據監督學習經常使用的方法來訓練它啦。

7. online hard example mining

  這個方法是目標檢測框架中常常會用到的一個tricks,其主要的思路以下所示:首先對RPN得到的候選ROI(正負樣本分別進行排序)進行排序操做;而後在含有正樣本(目標)的ROI中選擇前N個ROI,將正負樣本的比例維持在1:3的範圍內,基本上保證每次抽取的樣本中都會含有必定的正樣本,均可以經過訓練來提升網絡的分類能力。若是不進行此操做的話,極可能會出現抽取的全部樣本都是負樣本(背景)的狀況,這樣讓網絡學習這些負樣本,會影響網絡的性能。(這徹底是我我的的理解,哈哈哈)

8. Atrous algorithm(Dilated Convolutions或者膨脹卷積)測試

     圖6 膨脹卷積

  這個方法一樣也是目標檢測中經常使用的一個tricks,其最主要的目的是能夠在減少卷積步長的同時擴大feature map的大小,即同等狀況下,經過這個操做,咱們能夠得到一個更大的feature map,而實驗代表,大的feature map會提高檢測的性能。

9. 爲了過濾背景Rols使用的方法

  在測試的時候,爲了減小RoIs的數量,做者在RPN提取階段就對RPN提取的大約2W個proposals進行了過濾,方法以下所示,
    1) 去除超過圖像邊界的proposals;
    2) 使用基於類別機率且閾值IoU=0.7的NMS過濾;
    3) 按照類別機率選擇top-N個proposals;

因此在測試的時候,最後通常只剩下300左右個RoIs,固然這個數量是一個超參數。而且在R-FCN的輸出300個預測框以後,仍然要對其使用NMS去除冗餘的預測框。


4、總結

總的來說,和Faster R-CNN相比,R-FCN具備更快的運行速度(2.5倍以上),稍微提升了一點檢測精度,在速度和準確率之間進行了折中,提出position-sensitive score map來解決檢測的位置敏感性問題。算法中的不少細節值得咱們進行深刻的研究和分析,但願你從中學到了不少有用的東西。spa

相關文章
相關標籤/搜索