這篇的主要是介紹基于 R-FCN 的目标檢測。其中值得注意的便是作者提出了使用全卷積網絡,也就是 FCN 來代替之前的檢測方法中(Fast R-CNN、Faster R-CNN等)中的網絡結構,去除了網絡中的全連接配接層等部分,為了得到更好的效果,在基礎網絡結構中使用了 hole algorithm 等算法,其中最值得注意的部分是文中所使用的 position-sensitive 思想,具體内容在下面具體内容中進行介紹。
1. 綜述
這部分主要根據論文中的 Introduction 和 Related Work 對這種目标檢測結構進行介紹。
之前的網絡(如 R-CNN,Fast R-CNN 等)已經說明了利用 region proposal 結合 深度網絡用來進行目标檢測是有效的。但是在 R-CNN 中計算那些關于 crop 和 變換的區域的計算是不共享的。而 SPP-Net,Fast R-CNN 和 Faster R-CNN 是 “半卷積”的,在卷積網絡中是計算共享的,但是在另一個子網絡是各自計算獨立的區域。
目前已經有可以被認為是“完全卷積”模型的物體檢測器。OverFeat 通過在共享的卷積特征映射上滑動多尺度視窗來檢測對象;類似的,在 Fast R-CNN 中,研究了使用滑窗來代替 region proposal。在某些情況下,可以将單精度的滑動視窗改造成一個單層的卷積層。在 Faster R-CNN 中使用 RPN 結構是一個全卷積檢測器,用來預測出一個關于多尺度的參考邊框的實際邊框。原始的 RPN 網絡是與類别無關(class-agnostic)的。但是對于 class-specific 也是可以應用的。
是以,綜上所示,目前來說,對于物體檢測可以通過 ROI Pooling layer 分成兩個方法:
- 獨立于 ROI 的共享的、全卷積的子網絡。(a shared, “fully convolutional” subnetwork independent of RoIs)
- 不共享計算的 ROI-wise 子網絡(an RoI-wise subnetwork that does not share computation)
造成這兩種不同來源于之前提出的分類網絡結構,比如說 AlexNet,VGG 等。它們由兩個子網絡組成,一個是以 spatial pooling layer(空間池化層) 結束的卷積子網,另一個是若幹個 fully-connected layers(全卷積層)。是以,在目标檢測任務中, spatial pooling layer 很自然的也就轉換成了 ROI pooling layer。
但是目前最好的圖像分類網絡,例如 ResNet 和 GoogleNets 都是使用 fully convolution 設計的,是以,類似的,很自然的可以想到通過使用全卷積在目标檢測結構中建構一個 共享計算的,卷積子網絡,而不将 ROI-Wise 子網絡作為 hidden layer(隐藏層)。然而,通過對這個想法的實驗可以得出,使用這種方法建構的目标檢測網絡的準确率與其分類的最優準确率有着很大的差距。為了解決這個問題,在 ResNet paper 中作者将 Faster R-CNN 檢測方法中的 ROI pooling layer 很不自然的插入在兩個卷積層中間,這樣便通過一個更深的 ROI-wise 子網絡來提升了檢測的準确率,但是其代價是由于在每個 ROI 中未共享計算進而降低了檢測速度。
作者發現,前面這種“不自然”的設計是由于在分類任務中的“平移不變性”和目标檢測任務中要求的“平移轉變性”的沖突。具體來說,一方面,在圖像級别的 分類任務中更加傾向于 translation invariance(平移不變性),也就是在一張圖像中的目标的移動應該不影響最終的分類結果。是以,深層(全)卷及網絡結構更加傾向于保持整個結構的這種特性(平移不變性);但是另一方面,目标檢測任務需要定位一張圖像中目标的具體位置,也就是需要存在 translation-variant (平移轉變性)。為了解決這個問題,在 ResNet paper 在目标檢測流程中在兩個卷積層之間插入了 ROI pooling layer。這種操作打破了平移不變形,以此 post-ROI 在評價不同 region 時不再保持平移不變性。然而,這種引入平移轉變性的設計是以犧牲訓練和測試效率為代價的,因為它引入了非常大量的 region-wise layers。
是以在本文中,提出了一個新的目标檢測結構,也就是 R-FCN( Region-based Fully Convolutional Network),我們的網絡由共享的全卷積結構組成,就像 FCN 網絡一樣。為了将上面提到的“平移轉變性”融合到 FCN 中,我們通過在 FCN 的輸出上使用一系列的特定卷積層建構了一系列的 position-sensitive score map(位置敏感得分圖)。這些 位置敏感得分圖 中的每一個都對相對空間位置對位置資訊進行編碼。在這個 FCN 的頂層,我們添加了一個位置敏感(position-sensitive) ROI pooling 層,以此用來管理從這些得分圖得到的資訊,并且這一層是沒有任何附權重重的。可以看出 整個結構是端到端(end-to-end)的。所有需要學習的參數(權重)都是對于整張圖像而言并且都是共享的,此外還對空間位置進行編碼用來目标檢測。下圖表示了作者設計這種 R-FCN 的整體流程:

2. 具體細節
這部分主要介紹 R-FCN 中的具體細節,對應論文中的部分為 Our approach 的前半部分,個人認為這部分也是整篇 paper 的精華所在。下面進行具體介紹:
2.1 整體介紹
R-FCN 的基本思路是 首先使用 RPN 結構将一幅圖像中的候選區域進行選出,然後在 RPN 網絡和 R-FCN 結構中共享這些特征。
在由 RPN 給出圖像中的候選區域後,R-FCN 結構将得到的 ROI 進行目标劃分到相應類别或是背景。在 R-FCN 中,所有的學習權重都是作用在整張圖像上的卷積操作。最後一個卷積層對每個類别産生 k2 個 position-sensitive score map,是以一共會産生 k2(C+1) 個通道的輸出層,其中有 C 個類别還有一類是背景。 k2 個得分圖對應在 ROI 位置上的 k×k 個位置。例如,如果 k×k=3×3 ,那麼每個類别對應的區域可以被編碼成為 {左上,中上,右上,…,右下}({top-left, top-center, top-right, … , bottom-right})。
R-FCN 以 position-sensitive ROI pooling layer 作為結束層。該層聚合最後一個卷積層的輸出,并為每個 RoI 生成分數。與之前的 SPP-Net 和 Fast R-CNN 不同的是,這裡的 ROI pooling 是一種選擇池化 (selective pooling),并且k×k的每個條目僅僅聚集來自于k×k得分地圖堆裡面的一個得分地圖。通過端到端的訓練,這個 ROI pooling 層将最後的卷積層轉換為特定的 位置敏感得分圖(position-sensition score maps)。
2.2 Backbone architecture.
本文中 R-FCN 的結構是基于ResNet-101的,盡管其他網絡(AlexNet, VGG)是适用的。ResNet-101 有100 層卷積層和後面的一個區全局平局池化層以及一個 1000 類的全連接配接層。在我們的設計中,我們去掉了卷積層後面的全局平局池化以及全連接配接層而僅使用卷積層用來計算特征圖(feature maps)。我們使用在 ImageNet 資料集上預訓練好的 ResNet-101 結構。在 ResNet-101 中,最後一個卷積塊是 2048 維的,是以,我們最後添加一個随機初始化的 1024 維的 1*1 卷積用來降低次元。然後我們應用 k2(C+1) -channels 的卷內建用來生成得分圖(sensitive-position score map)。
2.3 Position-sensitive score maps & Position-sensitive ROI pooling.
為了将位置資訊明确地編碼到每個RoI中,我們将每個 RoI 矩形通過規則網格劃分為k * k 個 bins。對于一個 size 為 w,h 的 ROI 區域,每個 bin 的 size 大緻為 [wh×hk] 。在作者所使用的方法中,最後一個卷積層 對于每個類别 都産生 k2 個得分圖(score map)。在第 (i,j) 個bin 内 (0≤i,j≤k−1) ,定義一個位置敏感 ROI 池化(position-sensitive RoI pooling)僅僅用來池化第 (i,j) 個 score map:
rc(i,j|Θ)=∑(x,y)∈bin(i,j)zi,j,c(x+x0,y+y0|Θ)/n
在上面的公式中, rc(i,j) 是對于第 c 類的第 (i,j) 個池化相應, zi,j,c 是 k2(C+1) 個 score map 中的一個, (x0,y0) 是 ROI 的左上角, n 是在目前這個 bin 中的像素個數,是以,上述公式可以看做是一個平均池化的操作,Θ 是網絡中所有的可學習的參數。第 (i,j) 個 bin 的範圍是 ⌊iwk⌋≤x<⌈(i+1)wk⌉ 以及 ⌊jhk⌋≤x<⌈(j+1)hk⌉ 。具體操作可以用下圖來表示:
這裡對上面這幅圖進行簡要的說明,下面的三點參考部落格 R-FCN論文閱讀:
①首先看 k2(C+1) 個 feature map,可以看到上圖中這些 feature map 一共有 9 種顔色,也就是說每種顔色的立體塊(假設尺寸為 W×H×(C+1) )表示的是不同位置存在目标的機率(也就是第一個的黃色立體塊表示的是左上角的位置,最後一塊淺藍色表示的是右下角的位置)。因為一共有 k2(C+1) 個feature map,對于每個 feature map, zi,j,c 表示的就是第 i+k(j−1) 個立體塊上的第 c 個(表類别)map(1 ≤i,j≤ 3),其中 ( i,j )決定了這 9 中位置中的某一種位置,這裡我們假設左上角為 i=j=1 ,c 決定了是哪一類,假設這裡指的是 person。在 zi,j,c 這個feature map 上的某一個像素的位置是(x,y),像素值是value,則value表示的是原圖對應的(x,y)這個位置上可能是人(c=‘person’)且是人的左上部位(i=j=1)的機率值。
②後面的 ROI pooling,就相當于是 Faster R-CNN 中的 ROI pooling 層,主要作用是将不同大小的 ROI 對應的 feature map 映射成為同樣次元的特征,大緻思路是對于無論多大的 ROI 區域,規定在相應區域上畫出一個 k*k 個 bins 的網格(grid cell),對每個網格裡所有像素值做一個平均池化(average pooling),這樣無論圖像是多大,在經過 ROI pooling 之後的 ROI 特征次元都是相同大小的。這裡需要注意的是,ROI pooling 是每個 feature map 單獨做的,而不是多個通道一起做的。
③對于 ROI pooling 來說,它的輸入是大小為 k2(C+1)∗W′∗H′ (C 表示類别,W’和 H ’表示 ROI 的寬高)的score map 上某 ROI 對應的那個立體塊,并且該立體塊組成一個新的大小為 k2(C+1)∗W′∗H′ 的立體塊,在這個新的立體塊中,每個顔色的立體塊都隻拿出對應位置的一個 bin,并把這 k*k 個 個 bins 組成新的立體塊,大小為 (C+1)∗W′∗H′ 。 例如,在上圖總第一塊的黃色隻取左上角的 bin,最後一塊淡藍色也隻取右下角的 bin。所有的 bin 進行重新組合也就成為了上圖右側中的那個薄的立體塊,但是上圖中的這個薄的立體塊是已經經過了 pooling 操作之後的,也就是說,每個 channel
上的每個 bin 已經是經過平均池化操作後的單一像素,在池化前,這個 bin 對應的是一個區域,也就是有多個像素。
2.4 Vote on the ROI
在經過 ROI pooling 操作後,得到的 k2 個位置敏感得分再進行投票操作,所謂投票操作,再本文中,使用的是如下的簡單方法:
直接對平均得分進行投票,對每個 ROI 産生一個 (C+1) 維的向量:
rc(Θ)=∑i,jrc(i,j|Theta)
上面這個公式是說,對于每一類的 score,直接進行求和。然後在進行根據下面公式對每一類的 score 進行 softmax 操作: sc(Θ)=erc(Θ)/∑c′=0Cerc′(Θ)
利用上面的 softmax 公式得到每類的最終得分并用于計算損失。
2.5 Bounding box regression
對于邊界回歸作者采用的是和 Fast R-CNN 和 FCN 中的方法類似的方法。在基本的卷積層後,除了添加上面的 k2(C+1) 維卷積層外,作者還添加了 4k2 維的卷積層用來進行 bounding box regression。與上面的方法類似,位置敏感池化(position-sensitive pooling)在這 4k2 個feature maps 上進行操作,對于每個 ROI 産生一個 4k2 維的向量,然後再通過平均投票(類似上面的方法)這 4k2 維的向量合并成為一個 4 維向量。這個 4 維向量按照 Fast R-CNN 中的方法參數化為 t=(tx,ty,tw,th) 。需要注意的是,為了簡單起見,作者使用與類别無關的邊界框回歸,但是對于類特定的情況同樣是适用的。
3. Training
在使用 RPN 網絡将 region proposals 計算出來後,便很容易使用基于 R-FCN 架構執行端到端的訓練。根據 Fast R-CNN 中的方法,這裡定義在每個 ROI 上的損失函數是交叉熵損失和邊界回歸損失之和:
L(s,tx,y,w,h)=Lcls(sc∗)+λ[c∗>0]Lreg(t,t∗)
在上面的公式中, c∗ 表示的是 ROI 區域的真是标記( c∗=0 表示目标類别是背景)。其中 Lcls(sc∗)=−log(sc∗)
是分類損失的交叉熵, Lreg 是邊框回歸損失, t∗ 表示的是真實的邊框, [c∗>0] 是一個訓示函數,當為真時,傳回 1 否則傳回 0。在上面的全局損失函數中,為了平衡分類損失和邊框回歸損失,作者令 λ=1 (根據 Fast R-CNN )。在這裡需要說明的是,作者定義的正樣本時那些和真實邊框 IoU 大于 0.5 的 region proposal,否則劃為負樣本。
在訓練本文的這個整個網絡的過程中,采用 OHEM(online hard example mining)是非常容易得。因為每個 ROI 區域的計算是可以忽略的,進而使得樣本挖掘(example mining) 近似是 cost-free 的。這裡假設每張圖檔有 N 個 region proposals,前網絡的前向過程中,計算這 N 個 region proposals 的損失,然後對這些 ROI 進行排序(包括正樣本和負樣本)然後選出具有最高的損失的 B 個樣本。反向傳播僅在這些選出的 B 個樣本上進行。因為本文中的 每個 ROI 的計算近乎是微不足道的,是以前向傳播的時間幾乎與 N 無關。
在訓練具體參數方面,我們是用參數為 0.0005 的權重衰減和 參數為 0.9 的 momentum 優化方法。我們預設設定為在但尺度上進行訓練,具體尺度為 600 像素大小。每個 GPU 用來處理一張圖像,在反向傳播過程中,B=128。作者使用 8 個 GPU 用來訓練(是以 mini-batch 的大小最好選為 8 的倍數)。此外,作者還在 VOC 資料集使用學習率為 0.001 的 20k mini-batches 和 學習率為 0.0001 的 10k mini-batches 進行微調。為了使 R-FCN 與 RPN 結構共享網絡中的特征,這裡使用的方法與 Faster R-CNN 相同,采用 4 步訓練法進行相關的訓練操作。
4. Inference
在推斷過程中,feature map 在 RPN 和 R-FCN 中是共享的。之後 RPN 部分選擇出相應的 ROI 區域,而 R-FCN 部分評估了 category-wise scores 以及 regresses bounding boxes。在推論階段,我們計算了300個ROI區域。結果通過 非極大值抑制(NMS) 來進行後處理,在這個過程中使用了 0.3 IoU 的門檻值,作為 standard practice。
5. A trous and stride
論文中的全卷積網絡結構是在 FCN 的基礎上進行修改的。特别的,作者将 ResNet-101 中的 stride 從 32 降低到了 16。進而增加了 score map 的分辨率。在 conv4 之前的所有層都沒有發生變化,在 conv5 中的 stride=2 改為 stride=1,是以在 conv5 中的算有卷積操作都相應的修改為 “hole algorithm”算法一次來補償 stride 減少帶來的影響。通過使用這種算法,使得改變 stride 前後得到的 feature map 的接受域(receipt field)不變。為了公平對比, RPN 結構僅在 conv4 及之前進行權重共享。
6. Visualization
下面的兩圖中給出類當 k×k=3×3 時由 R-FCN 得到的位置敏感得分圖(position-sensitive score maps)。預期這些特定位置的得分圖将會在對象的特定相對位置被強烈激活。例如,“頂部中心敏感”得分圖大緻在物體的頂部中心位置附近呈現出較高分數。如果有一個候選框準确度的覆寫了一個真實目标(下圖一), k2 個 bins 中大多數都會被強烈激活,也正是那些投票(voting)操作導緻了這些高的得分。相反的,如果一個候選區域沒有準确的覆寫在真實目标上, k2 個 bins 中的一部分 bins 不會被激活,同時 voting 得分也很低。
7.參考文獻
- R-FCN
- [譯] 基于R-FCN的物體檢測
- R-FCN:基于區域的全卷積網絡來檢測物體
- R-FCN論文閱讀