參考博文:https://blog.csdn.net/zziahgf/article/details/79311275
目標檢測的一般結構:
1. 背景
Faster R-CNN 發表於 NIPS 2015,其后出現了很多改進版本,后面會進行介紹.
R-CNN - Rich feature hierarchies for accurate object detection and semantic segmentation 是 Faster R-CNN 的啟發版本. R-CNN 是采用 Selective Search 算法來提取(propose)可能的 RoIs(regions of interest) 區域,然后對每個提取區域采用標准 CNN 進行分類.
出現於 2015 年早期的 Fast R-CNN 是 R-CNN 的改進,其采用興趣區域池化(Region of Interest Pooling,RoI Pooling) 來共享計算量較大的部分,提高模型的效率.
Faster R-CNN 隨后被提出,其是第一個完全可微分的模型. Faster R-CNN 是 R-CNN 論文的第三個版本.
R-CNN、Fast R-CNN 和 Faster R-CNN 作者都有 Ross Girshick.
2. 網絡結構
Faster R-CNN 的結構是復雜的,因為其有幾個移動部件. 這里先對整體框架宏觀介紹,然后再對每個部分的細節分析.
問題描述:
針對一張圖片,需要獲得的輸出有:
- 邊界框(bounding boxes) 列表;
- 每個邊界框的類別標簽;
-
每個邊界框和類別標簽的概率.
Figure 1. Faster R-CNN 結構
首先,輸入圖片表示為 Height × Width × Depth 的張量(多維數組)形式,經過預訓練 CNN 模型的處理,得到卷積特征圖(conv feature map). 即將 CNN 作為特征提取器,送入下一個部分.
這種技術在遷移學習(Transfer Learning)中比較普遍,尤其是,采用在大規模數據集訓練的網絡權重,來對小規模數據集訓練分類器. 后面會詳細介紹.
然后,RPN(Region Propose Network) 對提取的卷積特征圖進行處理. RPN 用於尋找可能包含 objects 的預定義數量的區域(regions,邊界框).
基於深度學習的目標檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表. 在構建深度神經網絡時,最后的網絡輸出一般是固定尺寸的張量輸出(采用RNN的除外). 例如,在圖片分類中,網絡輸出是 (N, ) 的張量,N 是類別標簽數,張量的每個位置的標量值表示圖片是類別 labeli 的概率值.
在 RPN 中,通過采用 anchors 來解決邊界框列表長度不定的問題,即,在原始圖像中統一放置固定大小的參考邊界框. 不同於直接檢測 objects 的位置,這里將問題轉化為兩部分:
對每一個 anchor 而言,
- anchor 是否包含相關的 object?
- 如何調整 anchor 以更好的擬合相關的 object?
這里可能不容易理解,后面會深入介紹.
當獲得了可能的相關objects 和其在原始圖像中的對應位置之后,問題就更加直接了. 采用 CNN 提取的特征和包含相關 objects 的邊界框,采用 RoI Pooling 處理,並提取相關 object 的特征,得到一個新的向量.
最后,基於 R-CNN 模塊,得到:
- 對邊界框內的內容進行分類,(或丟棄邊界框,采用 background 作為一個 label.)
- 調整邊界框坐標,以更好的使用 object.
顯而易見,上面忽略了一些重要的細節信息. 但,包括了 Faster R-CNN 的大致思想.
3. 基礎網絡
正如上面所說,Faster R-CNN 第一步是采用基於分類任務(如,ImageNet)的 CNN 模型作為特征提取器. 聽起來是比較簡單的,但,重要的是理解其如何工作和為什么會有效,並可視化中間層,查看其輸出形式.
網絡結構很難說哪種是最好的. Faster R-CNN 最早是采用在 ImageNet 訓練的 ZF 和 VGG,其后出現了很多其它權重不同的網絡. 如,MobileNet 是一種小型效率高的網絡結構,僅有 3.3M 參數;而,ResNet-152 的參數量達到了 60M. 新網絡結構,如 DenseNet 在提高了結果的同時,降低了參數數量.
3.1. VGG
在討論網絡結構孰優孰劣之前,這里以 VGG16 為例.
Figure 2. VGG16 網絡結構
VGG16 是 ImageNet ILSVRC 2014 競賽的模型,其是由 Karen Simonyan 和 Andrew Zisserman 發表在論文 Very Deep Convolutional Networks for Large-Scale Image Recognition 上.
今天來看,VGG16 網絡結構是不算深的,但在當時,其將網絡層比常用的網絡結構擴展了兩倍,開始了 “deeper→more capacity→better”的網絡結構設計方向(在訓練允許的情況).
VGG16 圖片分類時,輸入為 224×224×3 的張量(即,一張 224×224 像素的 RGB 圖片). 網絡結構最后采用 FC 層(而不是 Conv 層)得到固定長度的向量,以進行圖片分類. 對最后一個卷積層的輸出拉伸為 rank 1 的張量,然后送入 FC 層.
由於 Faster R-CNN 是采用 VGG16 的中間卷積層的輸出,因此,不用關心輸入的尺寸. 而且,該模塊僅利用了卷積層. 進一步去分析模塊所使用的哪一層卷積層. Faster R-CNN 論文中沒有指定所使用的卷積層,但在官方實現中是采用的卷積層 conv5/conv5_1 的輸出.
每個卷積層利用前面網絡信息來生成抽象描述. 第一層一般學習邊緣edges信息,第二層學習邊緣edges中的圖案patterns,以學習更復雜的形狀等信息. 最終,可以得到卷積特征圖,其空間維度(分辨率)比原圖小了很多,但更深. 特征圖的 width 和 height 由於卷積層間的池化層而降低,而 depth 由於卷積層學習的 filters 數量而增加.
Figure 3. 卷積特征圖
在 depth 上,卷積特征圖對圖片的所有信息進行了編碼,同時保持相對於原始圖片所編碼“things”的位置. 例如,如果在圖片的左上角存在一個紅色正方形,而且卷積層有激活響應,那么該紅色正方形的信息被卷積層編碼后,仍在卷積特征圖的左上角.
3.2. VGG vs ResNet
ResNet 結構逐漸取代 VGG 作為基礎網絡,用於提取特征. Faster R-CNN 的共同作者也是 ResNet 網絡結構論文 Deep Residual Learning for Image Recognition 的共同作者.
ResNet 相對於 VGG 的明顯優勢是,網絡更大,因此具有更強的學習能力. 這對於分類任務是重要的,在目標檢測中也應該如此.
另外,ResNet 采用殘差連接(residual connection) 和 BN (batch normalization) 使得深度模型的訓練比較容易. 這對於 VGG 首次提出的時候沒有出現.
3.3. Anchors
在獲得了處理后的圖片后,需要尋找 proposals,如用於分類的 RoIs(regions of interest). anchors 是用來解決長度不定問題的.
目標是,尋找圖片中的邊界框bounding boxes,邊界框是具有不同尺寸sizes和長寬比aspect ratios 的矩形.
假設,已經知道圖片中有兩個 objects,首先想到的是,訓練一個網絡,輸出 8 個值:兩對元組 xmin,ymin,xmax,ymax,分別定義了每個 object 的邊界框. 這種方法存在一些基本問題. 例如,當圖片的尺寸和長寬比不一致時,良好訓練模型來預測,會非常復雜. 另一個問題是無效預測:預測 xmin 和 xmax 時,需要保證 xmin<xmax.
事實上,有一種更加簡單的方法來預測 objects 的邊界框,即,學習相對於參考boxes 的偏移量. 假設參考 box:xcenter,ycenter,width,height,待預測量 Δxcenter,Δycenter,Δwidth,Δheight,一般都是很小的值,以調整參考 box 更好的擬合所需要的.
Anchors 是固定尺寸的邊界框,是通過利用不同的尺寸和比例在圖片上放置得到的 boxes,並作為第一次預測 object 位置的參考 boxes.
因為是對提取的 Convwidth×Convheight×ConvDepth 卷積特征圖進行處理,因此,在 Convwidth×Convheight 的每個點創建 anchors. 需要理解的是,雖然 anchors 是基於卷積特征圖定義的,但最終的 anchos 是相對於原始圖片的.
由於只有卷積層和 pooling 層,特征圖的維度是與原始圖片的尺寸成比例關系的. 即,數學地表述,如果圖片尺寸 w×h,特征圖的尺寸則是 w/r×h/r. 其中,r 是下采樣率(subsampling ratio). 如果在卷積特征圖空間位置定義 anchor,則最終的圖片會是由 r 像素划分的 anchors 集. 在 VGG 中, r=16.
Figure 4. 原始圖片上的 Anchor Centers.
為了選擇 anchors 集,一般是先定義許多不同尺寸(如,64px,128px,256px等)和boxes 長寬比(如,0.5,1,1.5等),並使用所有可能的尺寸和比例組合.
Figure 5. 左:Anchors;中:單個點的 Anchor;右:全部Anchors.
4. RPN - Region Proposal Network
Figure 6. RPN 結構 - RPN 輸入是卷積特征圖,輸出圖片生成的 proposals.
RPN 利用所有的參考 boxes(anchors),輸出一系列 objecs 的良好的 proposals. 針對每個 anchor,都有兩個不同的輸出:
[1] - anchor 內是某個 object 的概率.
RPN 不關注於 anchor 是某個 object class,只是確定其可能是一個 object (而不是背景background). 即: RPN 不關心 object 類別,只確定是 object 還是 background.
利用 object score,去濾出將要用於第二階段的效果不佳的 boxes.
[2] - anchor 邊界框回歸輸出
邊界框的輸出用於調整 anchors 來更好的擬合預測的 object.
RPN 是全卷積(full conv) 網絡,其采用基礎網絡輸出的卷積特征圖作為輸入. 首先,采用 512 channel,3×3 kernel 的卷積層,然后是兩個並行的 1×1 kernel 的卷積層,該卷積層的 channels 數量取決每個點的 anchors 的數量.
Figure 7. RPN 結構的全卷積實現,k 是 anchors 數量.
對於分類層,每個 anchor 輸出兩個預測值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score.
對於回歸層,也可以叫邊界框調整層,每個 anchor 輸出 4 個預測值:Δxcenter,Δycenter,Δwidth,Δheight,即用於 anchors 來得到最終的 proposals.
根據最終的 proposal 坐標和其對應的 objectness score,即可得到良好的 objects proposals.
4.1. 訓練、目標和損失函數
RPN 有兩種類型的預測值輸出:二值分類和邊界框回歸調整.
訓練時,對所有的 anchors 分類為兩種類別. 與 ground-truth object 邊界框的 Intersection over Union (IoU) 大於 0.5 的 anchors 作為 foreground;小於 0.1 的作為 background.
然后,隨機采樣 anchors 來生成batchsize=256 的 mini-batch,盡可能的保持 foreground 和 background anchors 的比例平衡.
RPN 對 mini-batch 內的所有 anchors 采用 binary cross entropy 來計算分類 loss. 然后,只對 mini-batch 內標記為 foreground 的 anchros 計算回歸 loss. 為了計算回歸的目標targets,根據 foreground anchor 和其最接近的 groundtruth object,計算將 anchor 變換到 object groundtruth 的偏移值 correct Δ.
Faster R-CNN 沒有采用簡單的 L1 或 L2 loss 用於回歸誤差,而是采用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,當 L1 誤差值非常小時,表示為一個確定值 σ, 即認為是接近正確的,loss 就會以更快的速度消失.
采用動態 batches 是很有挑戰性的. 即使已經嘗試保持 background 和 foreground 的 anchors 的平衡比例,也不總是可行的. 根據圖片中 groundtruth objects 和 anchors 的尺度與比例,很有可能得不到 foreground anchors. 這種情況時,將采用與 groundtruth boxes 具有最大 IoU 的 anchors. 這與理想情況相差很遠,但實際中一般總能有 foreground 樣本和要學習目標.
4.2. 后處理
[1] - 非極大值抑制(Non-maximum suppression)
由於 Anchors 一般是有重疊的overlap,因此,相同 object 的 proposals 也存在重疊.
為了解決重疊 proposals 問題,采用 NMS 算法處理,丟棄與一個score 更高的 proposal 間 IoU 大於預設閾值的 proposals.
雖然 NMS 看起來比較簡單,但 IoU 閾值的預設需要謹慎處理. 如果 IoU 值太小,可能丟失 objetcs 的一些 proposals;如果 IoU 值過大,可能會導致 objects 出現很多 proposals. IoU 典型值為 0.6.
[2] - Proposal 選擇
NMS 處理后,根據 sore 對 topN 個 proposals 排序. 在 Faster R-CNN 論文中 N=2000,其值也可以小一點,如 50,仍然能的高好的結果.
4.3. 單獨應用 RPN
RPN 可以獨立使用,不用 2-stage 模型.
當處理的問題是,單個 object 類時,objectness 概率即可作為最終的類別概率. 此時,“foreground” = “single class”,“background”=“not single class”.
可以應用於人臉檢測(face detection),文字檢測(text detection),等.
僅單獨采用 RPN 的優點在於,訓練和測試速度較快. 由於 RPN 是僅有卷積層的簡單網絡,其預測效率比采用分類 base 網絡的效率高.
5. RoI Pooling
RPN 處理后,可以得到一堆沒有 class score 的 object proposals.
待處理問題為,如何利用這些邊界框 bounding boxes,並分類.
一種最簡單的方法是,對每個 porposal,裁剪,並送入pre-trained base 網絡,提取特征;然后,將提取特征來訓練分類器. 但,這就需要對所有的 2000 個 proposals 進行計算,效率低,速度慢.
Faster R-CNN 則通過重用卷積特征圖(conv feature map) 來加快計算效率. 即,采用 RoI(region of interest) Pooling 對每個 proposal 提取固定尺寸的特征圖. R-CNN 是對固定尺寸的特征圖分類.
Figure 8. RoI Pooling
目標檢測中,包括 Faster R-CNN,常用一種更簡單的方法,即:采用每個 proposal 來對卷積特征圖裁剪crop,然后利用插值算法(一般為雙線性插值 bilinear)將每個 crop resize 到固定尺寸 14×14×ConvDepth. 裁剪后,利用 2×2 kernel 的 Max Pooling 得到每個 proposal 的最終 7×7×ConvDepth 特征圖.之所以選擇該精確形狀,與其在下面的模塊(R-CNN)中的應用有關.
6. R-CNN -- Region-based CNN
R-CNN 是 Faster R-CNN 框架中的最后一個步驟.
- 計算圖片的卷積特征圖conv feature map;
- 然后采用 RPN 對卷積特征圖處理,得到 object proposals;
- 再利用 RoI Pooling 對每個 proposal 提取特征;
- 最后,利用提取特征進行分類.
R-CNN 是模仿分類 CNNs 的最后一個階段,采用全連接層來輸出每個可能的 object 類別class 的score.
R-CNN 有兩個不同的輸出:
- 對每個 proposal 分類,其中類別包括一個 background 類(用於去除不良 proposals);
- 根據預測的類別class,更好的調整 proposal 邊界框.
在 Faster R-CNN 論文中,R-CNN 對每個 proposal 的特征圖,拉平flatten,並采用 ReLU 和兩個大小為 4096 維的全連接層進行處理.然后,對每個不同 objects 采用兩個不同的全連接層處理:
- 一個全連接層有 N+1 個神經單元,其中 N 是類別 class 的總數,包括 background class;
- 一個全連接層有 4N 個神經單元. 回歸預測輸出,得到 N 個可能的類別 classes 分別預測 Δcenterx,Δcentery,Δwidth,Δheight.
Figure 9. R-CNN 結構
6.1. 訓練和目標
R-CNN 的目標基本上是與 RPN 目標的計算是一致的,但需要考慮不同的可能的 object 類別 classes.
根據 proposals 和 ground-truth boxes,計算其 IoU.
與任何一個 ground-truth box 的 IoU 大於 0.5 的 proposals 被設為正確的 boxes. IoU 在 0.1 到 0.5 之間時設為 background.
與 RPN 中目標組裝相關,這里忽略沒有任何交叉的 proposals. 這是因為,在此階段,假設已經獲得良好的 proposals,主要關注於解決難例. 當然,所有的這些超參數都是可以用於調整以更好的擬合 objects.
邊界框回歸的目標計算的是 proposal 與其對應的 ground-truth間的偏移量,只對基於 IoU 閾值設定類別class 后的 proposals 進行計算.
隨機采用一個平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有類別class) 和 75% 的background proposals.
類似於 RPNs 的 losses,對於選定的 proposals,分類 loss 采用 multiclass entropy loss;對於 25% 的 foreground proposals 采用 SmoothL1 loss 計算其與 groundtruth box 的匹配.
由於 R-CNN 全連接網絡對每個類別class 僅輸出一個預測值,當計算邊框回歸loss 時需謹慎. 當計算 loss 時,只需考慮正確的類別.
6.2. 后處理
類似於 RPN,R-CNN 最終輸出一堆帶有類別 class 的objects,在返回結果前,再進一步進行處理.
為了調整邊界框,需要考慮概率最大的類別的 proposals. 忽略概率最大值為 background class 的proposals.
當得到最終的 objects 時,並忽略被預測為 background 的結果,采用 class-based NMS. 主要是通過對 objects 根據類別class 分組,然后根據概率排序,並對每個獨立的分組采用 NMS 處理,最后再放在一起.
最終得到的 objects 列表,仍可繼續通過設定概率閾值的方式,來限制每個類的 objects 數量.
7. Faster R-CNN 訓練
Faster R-CNN 在論文中是采用分步 multi-step 方法,對每個模塊分別訓練再合並訓練的權重. 自此,End-to-end 的聯合訓練被發現能夠得到更好的結果.
當將完整的模型合並后,得到 4 個不同的 losses,2 個用於 RPN,2 個用於 R-CNN. RPN 和 R-CNN 的base基礎網絡可以是可訓練(fine-tune)的,也可以是不能訓練的.
base基礎網絡的訓練與否,取決於待學習的objects與可用的計算力. 如果新數據與 base基礎網絡訓練的原始數據集相似,則不必進行訓練,除非是想嘗試其不同的表現. base基礎網絡的訓練是比較時間與硬件消耗較高,需要適應梯度計算.
4 種不同的 losses 以加權和的形式組織. 可以根據需要對分類 loss 和回歸 loss 設置權重,或者對 R-CNN 和 RPNs 設置不同權重.
采用 SGD 訓練,momentum=0.9. 學習率初始值為 0.001,50K 次迭代后衰減為 0.0001. 這是一組常用參數設置
采用 Luminoth 訓練時,直接采用默認值開始.
8. 評價 Evaluation
評價准則:指定 IoU 閾值對應的 Mean Average Precision (mAP),如 mAP@0.5.
mAP 來自信息檢索,常用與計算 ranking 問題的誤差計算,以及評估目標檢測結果.
9. 總結
至此,對 Faster R-CNN 的處理方式有了清晰的理解,可以根據實際應用場合來做一些應用.
如果想進一步深入理解,可以參考 Luminoth Faster R-CNN 實現.
Faster R-CNN 可以用於解決復雜的計算機視覺問題,並取得很好的效果. 雖然這里模型是目標檢測,但對於語義分割,3D目標檢測等,都可以基於以上模型. 或借鑒於 RPN,或借鑒於 R-CNN,或兩者都有. 因此,能夠深度理解其工作原理,對於更好的解決其它問題很有幫助.
Related
[1] - 知乎 - Faster R-CNN
[2] - 知乎 - 原始圖片中的ROI如何映射到到feature map?
[3] - 論文閱讀學習 - Faster R-CNN
[4] - 論文閱讀學習 - Fast R-CNN
[5] - Caffe源碼 - RoI Pooling 層