
這是薰風讀論文的第 6 篇投稿,其中内容若有問題歡迎讨論~
薰風說
R-CNN的性能瓶頸主要都在區域提議(Region Proposal/RoI)上,而這個系列用了連續用了兩篇論文解決了這個問題。
- RoI的擷取太麻煩(選擇性搜尋Selective Search)且正确率感人。
- RoI的特征提取太耗時(先切圖檔,然後CNN提特征,導緻資料無法共享),且中間涉及大量的硬碟讀寫,資料要在硬碟,記憶體,現存三者之間來回倒騰。
Fast R-CNN把問題解決了一半(第二個問題),第一個問題還得看Faster RCNN。
順便一提,因為選擇性搜尋實在是太菜了……是以我甚至覺得它才是導緻RCNN和Fast RCNN沒人複現的最主要原因。
最後,如果看完整篇内容(或者大緻翻一下),會發現其中有很多我給出的連結。那是很多我前幾天寫的知識點/論文閱讀,因為各個知識點/模型都有很多共通的地方。觸類旁通,則事半功倍。
一、太長不看版
R-CNN的主要性能瓶頸在于需要
對每個提議區域獨立抽取特征。
由于這些區域通常有大量重疊,獨立的特征抽取會導緻大量的重複計算。Fast R-CNN對R-CNN的一個主要改進在于隻對
整個圖像做卷積神經網絡的前向計算。
Fast R-CNN示意圖
它的主要計算步驟如下。
1. 提取特征
與R-CNN相比,Fast R-CNN用來
提取特征的卷積神經網絡的輸入是整個圖像,而不是各個提議區域。
而且,由于用于提取特征得網絡參數可以通過訓練更新。
設輸入一張圖像,将CNN的輸出尺寸記為
2. RoI與Roi pooling
假設已經有選擇性搜尋Selective Search生成了
個提議區域Region Proposal/Region of Interest(RoI)。這些RoI的大小各異,是以需要額外操作提取相同尺寸的特征(假設高和寬為
和
)以便于連結後輸出。Fast R-CNN引入興趣區域池化(region of interest pooling,RoI池化)層,将卷積神經網絡的輸出和提議區域作為輸入,輸出連結後的各個提議區域抽取的特征,輸出大小為
。
動圖往往比文字有效
3. 預測
通過全連接配接層将輸出形狀變換為 n×d ,其中超參數 d 取決于模型設計。
• 預測類别時,将全連接配接層的輸出的形狀再變換到 n×q 并使用softmax回歸(q 為類别個數)。
• 預測邊界框時,将全連接配接層的輸出的形狀變換為 n×4。(為每個提議區域預測類别和邊界框)
Fast R-CNN中提出的興趣域池化層 Roi Pooling 與我們熟知的各類池化層不同。
- 傳統池化層通過設定池化視窗寬度 width 、填充 padding 和步幅 stride 來間接控制輸出形狀。
- 而 Roi Pooling 層則通過參數設定直接控制輸出形狀。
二、 引言 Why Fast R-CNN
1. 區域提議的困境
R-CNN的橫空出世,讓CNN攻下了計算機視覺的另一個堡壘——目标檢測,可謂是深度學習解決目标檢測任務的開山之作。
薰風初入弦:薰風讀論文:R-CNN 深入淺出了解目标檢測開山之作zhuanlan.zhihu.com
然而,它本身有着諸多局限,最大的莫過于其中的區域提議“Reigon Proposal”了,和現在我們的常識不同,R-CNN(其實包括Fast R-CNN本身也是)在目标檢測的第一步“判斷哪可能有東西”時,并沒有用到任何“學習”的部分,而單純的是基于規則的算法(選擇性搜尋,selective search)。
提高效果需要精确的區域提議 → 但由于區域提議不精确 → 為了確定召回率需要大量的區域提議 → 要處理過多的RoI → 計算量提升。這就是論文開頭分析的
複雜度上升困境2. 為何RCNN是個弟弟
一個模型訓三輪:
- 第一輪訓在Roi上提特征的CNN,用sotfmax分類的log loss(但因為效果太差這裡的分類不能用……)
- 第二輪把CNN的softmax分類器換成SVM再分類
- 最後回歸邊框
特征不能現提現用
由于
即使同一張圖檔,每個Roi提取特征都是獨立的過程。是以提取一個Roi的特征後要先寫到硬碟再讀出來分類/回歸,費時占地。
慢
區域提議困境+一個模型訓三輪+特征來回倒=速度賊慢
雖然Fast R-CNN沒用從根本上解決區域提議導緻的複雜度上升困境。但解決了R-CNN比較弟弟的幾個問題。
其中慢的問題是前個問題導緻的,而如果可以将訓三輪轉為“Single-stage train”(論文原文的說法,與SSD Yolo的“one-stage”不是一個東西!),即
一次可以訓練特征提取+分類+回歸。那麼第一個問題就迎刃而解了。而對于第二個特征問題,作者認為這是由于
RCNN前向的各個RoI沒有共享計算。一張照片截出來的Roi,為什麼不直接共享來自整張圖檔的特征呢?
2. 貢獻
-
-
- 通過多任務損失,變為單階段訓練(一次搞定分類+回歸)
- 更新不用分成那麼多步了,都在一個大網絡上搞,一次更新所有參數
- 采用Roi Pooling,優化minibatch采樣政策,提特征就再也沒硬碟什麼事了
-
三、Fast R-CNN的結構
圖像+一堆ROI輸入全卷積網絡→RoI pooling到固定尺寸→特征圖FC到特征向量→兩個輸出:含背景的分類機率+每個分類的邊界框回歸偏置
1. 算法輸入:
整張圖和一堆
區域提議(選擇性搜尋)
2. 提取全局特征:
通過conv+最大池化,提取輸入的整張圖檔的整個特征圖(這個時候沒區域提議什麼事)
3. 抽取Roi特征:
由于Roi大小不一,是以需要Roi池化來提取特定部分的特征。抽取的每個特征向量過幾個fc,就可以連接配接輸出層了。
4. 兩兄弟輸出層:
-
-
- K+1類(類别數+背景類)softmax機率(就不用什麼先softmax後svm了)
- 每個類都有4個實值,對應每個類的邊框
-
注:從邏輯上,你可以認為RCNN是
先區域提議後提特征,Fast R-CNN是
先提特征後區域提議。(實際上是Fast R-CNN的區域提議與特征提取解耦了)
四、RoIpooling
ROI是框在conv特征圖上的一個方型,用四元組定義(左上頂點r、c,高h和寬w),顯然,RoI的大小是各不相同的,(無預處理的情況下)CNN無法處理大小不同的特征。這也是為什麼R-CNN想不到共享特征的原因。
那麼,我們需要一個将特征圖的特定區域改變次元(通常是降維)的工具,這個工具就是我們經常使用的池化(pooling)。
然而,Fast R-CNN中提出的興趣域池化層 Roi Pooling 與我們熟知的各類池化層不同。
- 傳統池化層通過設定池化視窗寬度 width 、填充 padding 和步幅 stride 來間接控制輸出形狀。
- 而 Roi Pooling 層則通過參數設定直接控制輸出形狀。
任一子視窗的高和寬要取整,其中的
最大元素作為該子視窗的輸出。是以,興趣區域池化層可從形狀各異的興趣區域中均抽取出形狀相同的特征。
下圖在4×4的輸入上,選取了左上角的3×3區域作為Roi。對Roi做2×2的Roi Pooling 得到2×2的輸出。
4個劃分後的子視窗分别含有元素(Roi pooling的每個網格大小不一定相等!):
- 0、1、4、5(5最大)
- 2、6(6最大)
- 8、9(9最大)
- 10
2×2興趣區域池化層
五、特征提取與采樣政策
Fast R-CNN的特征提取器依然是CNN,由ImageNet預訓練得來,不過預訓練的CNN需要進行如下三個轉換:
- CNN的最後一個最大值池化換成RoI
- 最後的fc和softmax換成了兩個兄弟輸出(分類+回歸)
- 輸入變成倆:圖檔+(一堆)RoI
由于從頭(特征提取)到尾(分類回歸),計算的資料都沒有脫離CNN得到的特征,是以整個訓練過程是連續的整體,一次即可更新所有參數。這大大提高了訓練的效率。
而得益于RoI Pooling,前向時為了得到特定的RoI,需要處理更大範圍的圖檔,這變相提高了輸入的感受野。
是以,可以認為Fast R-CNN好就好在特征提取與Roipooling部分共享特征與參數了。
而剛剛提到的好處建立在一個基礎上:即
每次訓練的RoI都是來自同一張圖檔,是以Fast R-CNN訓練時的訓練樣本需要特定的采樣政策。
假設SGD的minibatch有R個輸入,涉及N張完整圖檔,那一個batch裡每個圖就有R/N個RoI。
N小了,那一個batch就有更多圖可以前反向時共享特征,提高處理效率。
除了少圖檔多RoI這個政策,還有就是控制正負例樣本的比值為1:3以及難例挖掘,具體的可以看我的這篇筆記
薰風初入弦:薰風AI知識點:Hard Negative Mining/OHEM 你真的知道二者的差別嗎?zhuanlan.zhihu.com
六、輸出與多任務損失
每個RoI都有自己的輸出:- softmax得出的,K+1維(K是資料集目标類,還有一個背景類)的機率
fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識 - K個物體類的坐标,(大寫K是目标類數,小寫k是目标類的索引)
fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識
嚴謹來講這不是坐标,而是第k類尺度不變的平移和log空間的高/寬位移與輸出對應的ground truth:
- 機率 對應的标簽類别
fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識 fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識 - 坐标 對應回歸目标
fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識 fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識
意味着隻考慮真實分類對應的邊界框與Ground Truth的誤差![]()
fastrcnn網絡模型_薰風讀論文:Fast R-CNN 模型原理/細節/冷知識
由此我們可以得出多任務的損失函數:
我知道這看起來挺唬人的……那我們拆開來說:
對應顔色對應解釋
首先,損失由兩個部分組成
一個是分類的負對數損失
,順帶一說,負對數損失就是softmax分類器的标配,具體原因詳見softmax的知識點。 薰風初入弦:薰風AI知識點:Softmax與交叉熵的數學意義(資訊論與機率論視角)zhuanlan.zhihu.com
就是定位損失啦,它的損失函數采用的是smooth L1損失,具體地說,對四個坐标分别進行smooth L1,然後加起來,就像下面這樣:
其中:
相比L2,這種loss對異常值不敏感,L1随随便便就過去了,L2做損失則還需要小心學習率以防梯度爆炸。
λ則負責平衡兩個部分的大小,避免出現兩個Loss模值相差過大的情況。(如果兩邊差的不大,或者兩個Loss内寫了縮放/歸一化,那麼沒有它也可以)
七、 冷知識
這裡指一些沒什麼人提,也的确對後面影響不大的内容。
- 當時已經有人用cnn找proposal了,但作者覺得和本文無瓜(有瓜就沒faster r-cnn什麼事了)
作者說Fast R-CNN由兩個原因獲得了尺度不變性(即解決了小目标檢測的老大難問題)。一個是因為RoI Pooling本身就涉及對不同大小特征圖的放縮,練久了就尺度不變性了。
還有一個說的是,因為它們在測試時還用了“Image Pyramid”,是不是很熟悉,就是我之前筆記裡被FPN噴得很慘的那個。
薰風初入弦:薰風讀論文:Feature Pyramid Network 詳解特征金字塔網絡FPN的來龍去脈zhuanlan.zhihu.com
Fast R-CNN在訓練時卷積部分最為耗時,而測試時則是全連接配接層部分耗時。而因為我們說模型快不快通常說的都是測試(前向)速度。是以,Fast R-CNN采用了截斷SVD壓縮全連接配接層(幾年前流行的辦法,現在嘛……)
數學定義上,當t比原矩陣尺寸小很多則壓縮效果賊明顯。實際測試中RoI很多的時候,加速明顯