R-FCN
We propose position-sensitive score maps to address a dilemma between translation-invariance in image classification and translation-variance in object detection.
平移不變性和平移變換性
分類需要特徵具有平移不變性(同一物體不管在哪都能檢測爲同一物體),檢測則要求對目標的平移做出準確響應(bbox位置精準迴歸)。對於圖像分類任務來說:分類問題往往會忽略位置信息,只需要判斷是否爲某個物體,所以要求提取出來的特徵具有平移不變性,不管圖片特徵放大、縮小還是位移都能很好的適應,而卷積操作、pooling操作都能較好的保持這個性質,並且網絡越深模型越對位置不敏感;。對於圖像檢測任務來說:更傾向於平移變換性。我們假設圖像分類網絡的卷積層越深,則該網絡對平移越不敏感。現在的大部分CNN在分類上可以做的很好,但用在檢測上效果不佳。SPP,Faster R-CNN類的方法在RoI pooling前都是卷積,卷積是具備平移不變性的(因爲卷積核共享參數,一隻貓在左上角和右下角都可以檢測到是同一只貓),但一旦插入RoI pooling之後,後面的網絡結構就不再具備平移不變性了(RoI池化之後原來相差4x4=16像素的兩個點經過池化可能變爲相鄰,不在具有平移不變性)。
因此,R-FCN提出來了 position-sensitive score map (位置敏感分值圖)這個概念,希望能把目標的位置信息融合進RoI pooling。它包含物體的位置信息,其頂端設有RoI Pooling層來處理位置信息,之後再沒有權重層。這樣,R-FCN就將幾乎所有的計算都共享,可以達到比faster rcnn快2.5-20倍。
在此之前的R-CNN系列的目標檢測框架通常包含兩部分:
- RoI Pooling之前的一個共享的全卷積子網絡;
- RoI Pooling之後的不共享的RoI-wise的子網絡。
這主要是因爲歷史上先驅的分類網絡如AlexNet,VGGNet等都是類似的結構:一個卷積組成的網絡,接pooling層,再接幾個fc層。這樣物體分類網絡中的最後一個pooling層可以方便地替換成RoI Pooling,然後用在物體檢測網絡中。
而現在的state of the art 的物體分類網絡如ResNet,GoogLeNet都是全卷積網絡,在目標檢測方面也使用共享的全卷積網絡是一個很自然的想法,然而,實踐證明這個方案的檢測精度極低。爲了解決這個問題,在ResNet的文獻中,Faster R-CNN中的RoI pooling layer被不自然的插入到兩個卷積層集之間,大家插入類似RoI Pooling這樣的層結構,一方面是的任意大小圖片都可以輸入,更重要的是一定程度上彌補了位置信息的缺失,帶來了準確率的提升。但帶來一個副作用是:RoI後每個Region都需要跑一遍後續子網絡,計算不共享就導致訓練和Inference的速度慢。
作者認爲上述不合理的設計是由於圖片分類任務中增長的平移不變性和目標檢測任務中的平移變換性之間的矛盾引起的:
圖像分類任務側重於平移不變性(在一幅圖片中平移一個物體而不改變它的判別結果),因此深度全卷積網絡結構在儘可能保存平移不變性上是最好的(源於卷積核共享參數的特性),在ImageNet分類task的良好表現得以證明;
目標檢測任務需要位置表示(translation-variant)。例如,某個候選框裏的物體的平移應該產生有意義的responses,用來描述該候選框和物體的重疊度。我們假定在圖片分類網絡中,卷積層越深,對平移越不敏感。爲了解決這個dilemma,Faster R-CNN在ResNet中插入了RoI pooling層,這個 region-specific 操作破壞了平移不變性,而且當evaluate across不同region時,post-RoI卷積層不再是平移不變的了。並且這個設計犧牲了訓練和測試的效率,因爲它引入了大量的region-wise layers。
爲了將平移變換性(translation variance)融合到FCN中,我們通過使用一組專用卷積層作爲FCN的輸出來構造一組位置敏感得分圖(position-sensitive score maps)。每一個得分圖對相對空間位置信息(例如,“在對象的左邊”)進行編碼。在這個FCN的頂層,我們附加了一個位置敏感的RoI pooling層(position-sensitive RoI pooling layer),從這些得分圖中獲取信息。這些得分圖不帶任何權重層(卷積層或全連接層)。整個結構是end-to-end的學習。所有可學習的層在整幅圖片中都是可卷積並且可共享的,並且可以編碼空間位置信息用於目標檢測。
Main Approach
本論文的方法參考R-CNN的架構,也是使用two-stage的目標檢測策略。
- region proposal
- region classification
雖然不依賴於region proposal的目標檢測方法確實存在,如SSD和YOLO,但是region-based system依舊在一些benchmark上保持最好的準確性。
我們希望的是,耗時的卷積都儘量移到前面共享的subnetwork上。因此,和Faster RCNN中用的ResNet(前91層共享,插入ROI pooling,後10層不共享)策略不同,本文把所有的101層都放在了前面共享的subnetwork。最後用來prediction的卷積只有1層,大大減少了計算量。
核心思想
R-FCN思路就是利用最後一層網絡通過FCN構成一個position-sensitive的feature map。具體而言,每一個proposal的位置信息都需要編碼,那麼先把每個proposal(圖中的RoI)平均分成 個網格,然後對每一個網格進行編碼。下圖中,這裏的feature map是過去RoI Pooling前的全卷積特徵提取子網絡,之後接着的(大彩色立方體)是position-sensitive score maps,它其實是一個普通的卷積層 ,只不過對位置信息進行了編碼,它的輸出是 個類別的分值。
位置敏感分值圖和位置敏感RoI池化層配合,替代原先的全連接層類別推斷的功能。
R-FCN 最後1個卷積層在整幅圖像上爲每類生成 個位置敏感分數圖(position-sensitive feature maps),有 類物體加1個背景類,因此共有 個通道的輸出層。 代表分數圖對應描述位置的空間網格數,假如 ,則每一類的 position-sensitive feature map會有 個,則9個分數圖用來編碼單個物體類的位置特徵(如:左上、左中、左右、……,下右:從左到右從上到下掃描,圖中用不同顏色代表)。
注意,score map尺寸等於圖片尺寸,即position-sentitive score maps總共產生 的tensor。
在position-sentitive score maps 以後跟着一個positive-sensitive的RoI pooling layer作爲結束層,它將最後一個卷積層的輸出結果聚集起來,然後產生每個ROI的score。positive-sensitive RoI pooling層不同於Fast R-CNN的RoI pooling,它採用的是selective pooling。
Selective pooling(選擇性池化):RoI的左上角網格只取橙色塊 (top−left)對應RoI左上角的區域,池化橙色方塊 RoI 得到橙色小方塊 (分數);右下角網格只取淺藍色RoI區域;其它顏色的響應圖像同理。得到薄的那個立方塊(已池化過),對所有顏色的小方塊投票 (或池化) 得到1個類別的響應結果。
整體架構
RPN 給出感興趣區域,R-FCN 對該感興趣區域分類。R-FCN 在與 RPN 共享的卷積層後多加1個卷積層。所以,R-FCN 與 RPN 一樣,輸入爲整幅圖像。但 R-FCN 最後1個卷積層的輸出從整幅圖像的卷積響應圖像中分割出感興趣區域的卷積響應圖像。 R-FCN 最後用位置敏感 RoI 池化層,給每個 RoI 1個分數。最後在經過一個pool進行類別投票。
R-FCN就是把Faster R-CNN的Fast R-CNN的分支改進成R-FCN網絡
Backbone architecture
Image-set pre-trained ResNet 101——去掉原始ResNet101的最後一層的global average pooling和一個1000-class的fc層,僅僅保留前100層的卷積層用來計算feature map,ResNet-101中的最後一個卷積塊是2048-d,再接一個隨機初始化的 的卷積層以減少尺寸(第100層的輸出是2048維,爲了降維,再引入了一個 的卷積層,則輸出爲1024維)。然後使用了 個通道的卷積層來生成score maps 分數圖。
Position-sensitive score maps & Position-sensitive RoI pooling
爲了顯式地在每個RoI中編碼位置信息,我們將RoI矩形劃分爲k x k個bins。對於一個大小爲 的 RoI 區域,每一個 bin 的大小 ≈ 。最後一個卷積層爲每個類別產生 個分數圖,所以一共 個 的分值圖。對第 行第 列的 ,定義一個位置敏感 RoI 池化操作,僅僅池化第 個得分圖:
其中, 爲第 類第 個bin的池化響應, 爲 個分數圖中的其中一個score map(某種顏色的塊中的 ?), 爲 RoI 的左上角座標, 爲bin裏的像素總數, 爲網絡的所有可學習的參數。第 個bin的範圍是: ,以及 。如下圖,一個顏色的通道對應一個 網格,論文中採用的都是average pooling,當然max pooling也有良好表現。
個score map的物理意義: Score map本身沒有區域的概念,是人爲的在 的通道數上進行編碼表示九處位置,如共有 個顏色,則每個顏色的立體塊 表示的是不同位置存在目標的概率值(第一塊黃色表示的是左上角位置,最後一塊淡藍色表示的是右下角位置)。共有 個score map。每個score map 是第 個立體塊( 行 列)上的第 個map( )。 決定了9種位置的某一種位置,假設爲左上角位置( ), 決定了哪一類,假設爲 person 類。在 這個feature map上的某一個像素的位置是 ,像素值是 value ,則 value 表示的是原圖對應的 這個位置上可能是人( )且是人的左上部位( )的概率值。
RoI pooling:就是faster RCNN中的RoI pooling,也就是一層的SPP結構。主要用來將不同大小的RoI對應的feature map映射成同樣維度的特徵,思路是不論對多大的RoI,規定在上面畫 個bins的網格,每個網格里的所有像素值做一個pooling(平均),這樣不論圖像多大,pooling後的RoI特徵維度都是 。注意一點RoI pooling是每個feature map單獨做,不是多個channel一起的。
position-sensitive RoI pooling的輸入和輸出: RoI pooling操作的輸入(對於C+1個類)是 (W’和H’是ROI的寬度和高度)的score map上某RoI對應的那個立體塊,且該立體塊組成一個新的 的立體塊:每個顏色的立體塊(C+1)都只摳出對應位置的一個bin,把這 個bin組成新的立體塊,大小爲 。例如,上圖中的第一塊黃色只取左上角的bin,最後一塊淡藍色只取右下角的bin(selective)。所有的bin重新組合後就變成了類似右圖的那個薄的立體塊(圖中的這個是池化後的輸出,即每個面上的每個bin上已經是一個像素。池化前這個bin對應的是一個區域,是多個像素)。池化每一個RoI時,各個網格(一共 個),均由上一層中對應分組的對應位置區域通過平均池化獲得。由此獲得一組 張特徵圖。最後,將這些特徵圖經過全局平均池化,得到 維的向量,計算分類損失函數。 (注意有兩次池化)。
這 個score maps用來對RoI區域進行投票,論文中僅僅通過對score取平均來投票。對於每個RoI產生 維的向量: 。然後計算每個類別的softmax,用於訓練時候計算交叉熵loss。
RoI 在 的每一類上都會得到一個 網格,即生成一個 的feature map,對於這裏來說 ,所以最後RoI pooling層產生 維的feature map。如下圖:
對 的 feature map 進行 average pooling,對於每一個RoI會產生 維的向量(置信度),然後通過softmax即可得到屬於哪個類別的可能性(loss採用交叉熵)。
進一步地,論文用相似地方法定位了bounding box迴歸,除了上面的 個卷積層,還附加了一個sibling的 -d 的卷積層用於bounding box迴歸。位置敏感RoI pooling在 的map中執行,對於每一個RoI,產生一個 維的向量,然後通過平均投票被聚合爲一個4維向量,代表 。
ResNet101的輸出是 ,用 個 的卷積核去卷積即可得到 個大小爲 的position sensitive的score maps。這步的卷積操作就是在做prediction。k = 3,表示把一個RoI劃分成 ,對應的9個位置分別是:上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角)。
R-FCN訓練過程
預先得到region proposals,R-FCN很容易進行端到端的訓練。網絡的損失函數和Fast R-CNN一樣,採用了多目標的損失函數(Multi-task),同時考慮了分類的損失和位置的損失。
Loss Function
定義爲在每個RoI上的關於類別的交叉熵loss和bounding box迴歸的loss的和。
上式中:
- 代表RoI的 ground-truth label( 代表背景類)
- 代表了分類的交叉熵損失
- 表示位置的損失,定義同Fast R-CNN一樣
- 表示ground truth的bounding box的參數
- 表示對於背景類不必進行bbox位置迴歸。訓練時,由於proposal已知類別,所以直接送入對應類別的Regressor即可
- 超參數 ,用於平衡分類損失和位置損失。
- 在softmax分類過程中,作者設定與ground truth 的IoU閾值>0.5的設定爲正樣本,其他的爲負樣本。
online hard example mining(OHEM)
Training Region-based Object Detectors with Online Hard Example Mining
訓練時,在我們的方法中採用OHEM是非常容易的,對每個RoI區域幾乎可忽略的計算代價使得example mining是cost-free的。假定每張圖片有N個proposals,前向傳播時,我們估算這N個proposal的損失,然後把所有RoI按照loss進行從大到小排序,然後只挑選B個具有最高loss的RoI(B/N)用於反向傳播更新(loss越高的proposal說明網絡沒有兼顧這種proposal,類似boosting思想)。
因爲我們的每個RoI的計算都是近似可忽略的,所以前向計算的時間幾乎不會受N的影響。而OHEM Fast R-CNN可能是會花費雙倍的訓練時間。
在Fast R-CNN中,確定一個proposal是背景時也是根據IoU範圍[bg_lo,0.5],這個範圍的前提假設是與ground truth有重疊的樣本是hard(很正的負的,難以區分的)的可能性較大,但是作者在此指出,這樣得到的結果很可能是次優的,因爲在其他位置可能存在更hard的樣本,所以在本文提出的OHEM算法中移除了這個閾值。
OHEM是一種boosting策略,目的是使得訓練更加高效,簡單說,它不是使用簡單的抽樣策略,而是對容易判斷的樣本做抑制,對模型不容易判斷的樣本重複添加。
在檢測中,正樣本定義爲:與ground-truth的IoU>0.5的,反之爲負樣本,應用過程爲:
- 前向傳播:所有候選框在Inference後做損失排序,選取B(共N個)個損失最高的候選框,當然,由於臨近位置的候選框的損失相近,所以還需要對其做NMS(如取IoU=0.7),然後再選出這B個樣本;
- 反向傳播:僅用這B個樣本做反向傳播更新權重。
訓練細節
- decay = 0.0005,momentum = 0.9
- 單尺度訓練:圖片resize到短邊600
- 使用8個GPU進行訓練,每個GPU 1張圖,選擇B=128(B/N)個ROIs進行反向傳播(OHEM)
- fine-tune learning rate = 0.001 for 20k mini-batches, 0.0001 for 10k mini-batches on VOC.
- 爲了讓R-FCN共享RPN的特徵,採用4步交替訓練 RPN 和 R-FCN(參見Faster R-CNN訓練過程)
測試(Inference)
如Figure 2所示,計算input image(600x600)後得到的feature map由RPN和R-FCN共享。然後RPN網絡提出RoI區域建議,而R-FCN網絡計算類別得分和bbox迴歸。在測試階段,我們評估了300個RoI區域,並對結果進行非極大值抑制(0.3的IoU閾值)。
多孔算法(A trous)
將mAP提高了2.6個點
- 將ResNet-10的有效stride從32減爲16像素,提高了score map的分辨率。
- conv4階段之前(stride=16)的所有層都沒有改變。
- 第一個conv5塊兒的stride從2改爲1,並且conv5階段的卷積核都被改爲hole algorithm,(Algorithme à trous)以補償減少的步幅。
- 爲了公平比較,RPN在conv4之上進行計算。從而RPN不被à trous影響
可視化
Figure 3和Figure 4中,我們展示了KxK=3x3時,通過R-FCN學習到的position-sensitive score maps。這些特徵圖受到物體的具體相對位置的強烈影響。例如,“top-center-sensitive” score map(九種顏色塊之一)對那些大致接近目標的top-center位置的顯示了較高的分數(白色)。如果一個候選框與真實物體精確的重合了(Figure 3),那麼RoI中大多數的bins(of bins)會被強烈的激活,最後投票時得到較高的分數。相反,如果候選框和真實物體位置存在較大偏差,那麼在RoI裏有些 bins不會被激活(黑色),從而導致得分很低。
RoI 分類的可視化。RPN 剛好產生包含 person 類的 RoI。經過 R-FCN 的最後1個卷積層後產生9個相對空間位置的分數圖,對 person 類的每個相對空間位置通道內的 RoI bin平均池化得到3×3的池化分數,投票後送入分類器判斷屬於 person 類。當分類正確時,該類通道的位置敏感分數圖 (中間) 的大多數橙色實線網格內的響應在整個 RoI 位置範圍內最強(白色)。
如圖Figuire 3,共九張圖,代表 個類中 person 這個類的 個score map,每個score map的卷積結果都是不一樣的,但它們在自己相對位置(黃色實線小方框)上的響應都比較高(白色),位置敏感RoI pooling的九個網格取對應位置的score map中對應的黃色實線小框中的像素做均值池化,得到右邊 3x3的pooling 結果在3。這9個池化結果再做一個均值投票,得到該RoI是否屬於 person 類的結果。
3*3的區域內,每一個區域內都預測(C+1)類的得分,比如下圖左上角的bin預測的是可能是人這個類且是人的左上部位的score(也預測是其他C個類且是該類左上部位的score)。
實驗結果
- 網格越細(7x7),mAP越高。
- Test時間提升2.5x。
- OHEM沒有帶來時間開銷。