論文位址:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
代碼位址:GitHub
背景
R-CNN 三部曲之完結篇,在上一篇物體檢測需要 Selective Search 擷取 proposal,然後神經網絡分類基礎上,将擷取 proposal 和 detection 合并為同一個神經網絡,算法更加 graceful 并且速度和準确度都有提升。
方法
可以了解為将提取 proposal 的步驟也抽象為了一種 R-CNN。conv 層最後一層每個像素為中心,提取不同尺寸,不同比例的 proposal(RPN),之後計算是否屬于前景,并且求得 bounding box regression(是不是很像 Fast R-CNN 幹的事情?)。在這之後再使用 Fast R-CNN 中的 RoI Layer,進而對 proposal 分類。過程圖:
圖檔來源1
RPN
對于最後一層卷積層産生的 feature map,使用 3x3 的全連接配接層(類似卷積),每個點就會産生與 conv 層相同 feature 次元的一個向量。後面又接了 ReLU,這樣每個點的 feature 就有了。
下面再說說對每個點提取 proposal,作者提出 anchor 的概念,咱就暫且叫他“茴”吧2,每個點不同尺寸,不同比例提取 k 個 proposal 。此處不明白,k 個 proposal 的 feature 有什麼不同,每個 proposal 會對應産生是否是前景/背景值,以及位置回歸值。很奇怪作者未做任何提及,難道是在每個 anchor box 裡面 pooling 了一把?
圖檔來源3
Loss Function
與 Fast R-CNN 非常相似,
L({pi},{ti})=1Ncls∑iLcls(pi,p∗i)+λ1Nreg∑ip∗iLreg(ti,t∗i)
等号右面第一項是前背景分類的目标函數,第二項是 bounding box regression 的目标函數。最小化兩者之和,關于等式定義,首先說系數。作者想要前後兩項的比重基本上是1:1,是以不管系數有何意義,咱都可以認為系數為 1 即可。
第一項 pi 表示每個茴的 四種寫法前背景的預測值, p∗i=1{i是前景} , Lcls 是 ln 函數。
第二項可以參考前一篇 Fast R-CNN,具體值如下:
圖檔來源 4
訓練方法
使用 batch 進行訓練,每個 batch 大小約為 256 個茴,正負樣本 1:1。
如何确定正負樣本?正樣本标定規則:
- 如果茴與 ground truth 有最大 IoU,标記為正樣本;
- 如果茴與 ground truth 的 IoU > 0.7,标記為正樣本。
事實上,采用第 2 個規則基本上可以找到足夠的正樣本,但是對于一些極端情況,例如所有的茴與 groud truth 的 IoU 不大于 0.7,可以采用第一種規則生成。
負樣本标定規則:如果茴與 ground truth 的 IoU < 0.3,标記為負樣本。剩下的既不是正樣本也不是負樣本,不用于最終訓練。
訓練網絡時,卷積層使用前面模型 (ZF/VGG net) 初始化參數,後面随機初始化。使用 VOC 資料集訓練。
整個網絡訓練方式
由于擷取 proposal 和 detection 兩個網絡共用卷積層,采用交替訓練方式。具體方式:
- 先訓練 RPN 網絡,conv 層使用 Imagenet 資料集 pre-trained 參數初始化,訓練全部網絡層;
- 再訓練 R-CNN 網絡,conv 層使用 Imagenet 資料集 pre-trained 參數初始化,訓練全部網絡層。每幅圖檔的 proposal 從上步得到,此時這兩個網絡是全部分離的;
- 使用上步中的參數初始化網絡,隻 fine-tune 特有層,不修改 conv 層;
- 保持 conv 層不變,fine-tune 特有層,不修改 conv 層。
測試圖檔時,最後還需要加入非最大值抑制,減少不必要的重疊 proposal。
實驗部分
準确度提升:
時間縮短:
後記
感覺有點怪怪的,行文方法和前兩篇有些差異,沒有達到我預想到的高度。下篇 YOLO。
- 使用Faster-Rcnn進行目标檢測 ↩
- 魯迅,《孔乙己》,《呐喊》,1919年4月《新青年》第六卷第四号 ↩
- Faster R-CNN學習筆記 ↩
- 深度學習檢測方法梳理 ↩