Object Detection,在給定的圖像中,找到目標圖像的位置,並標註出來。 或者是,圖像中有那些目標,目標的位置在那。這個目標,是限定在數據集中包含的目標種類,好比數據集中有兩種目標:狗,貓。 就在圖像找出來貓,狗的位置,並標註出來 是狗仍是貓。算法
這就涉及到兩個問題:網絡
2012年AlexNet在ImageNet舉辦的ILSVRC中大放異彩,R-CNN做者受此啓發,嘗試將AlexNet在圖像分類上的能力遷移到PASCAL VOC的目標檢測上。這就要解決兩個問題:app
對於問題,R-CNN利用候選區域的方法(Region Proposal),這也是該網絡被稱爲R-CNN的緣由:Regions with CNN features。對於小規模數據集的問題,R-CNN使用了微調的方法,利用AlexNet在ImageNet上預訓練好的模型。函數
R-CNN目標檢測的思路:測試
下圖給出了,R-CNN的目標檢測過程
spa
R-CNN進行目標檢測的訓練流程:.net
從一張圖片中提取2000個候選區域,將每一個區域按照訓練時候的方式進行處理,輸入到SVM中進行正負樣本的識別,並使用候選框迴歸器,計算出每一個候選區域的分數。
候選區域較多,有2000個,全部不少重疊的部分,就須要剔除掉重疊的部分。
針對每一個類,經過計算IOU,採起非最大值抑制的方法,以最高分的區域爲基礎,刪掉重疊的區域。設計
R-CNN雖然取得了不錯的成績,可是其缺點也很明顯。Ross Girshick在15年推出Fast RCNN,構思精巧,流程更爲緊湊,大幅提高了目標檢測的速度。一樣使用最大規模的網絡,Fast RCNN和RCNN相比,訓練時間從84小時減小爲9.5小時,測試時間從47秒減小爲0.32秒。在PASCAL VOC 2007上的準確率相差不大約在66%-67%之間。blog
Fast RCNN主要是解決RCNN的問題的索引
輸入是整幅圖像和多個感興趣區域(ROI)的位置信息,在前面的網絡層中並不會處理ROI信息,在後面的RoI pooling layer中,將每一個RoI池化到固定大小的特徵圖中,而後經過全鏈接層提取特徵。最後經過將提取的每一個RoI特徵輸入到SoftMax分類器已經邊框迴歸器中,完成目標定位的端到端的訓練。
Fast R-CNN網絡將整個圖像和一組候選框做爲輸入。網絡首先使用幾個卷積層(conv)和最大池化層來處理整個圖像,以產生卷積特徵圖。而後,對於每一個候選框,RoI池化層從特徵圖中提取固定長度的特徵向量。每一個特徵向量被送入一系列全鏈接(fc)層中,其最終分支成兩個同級輸出層 :一個輸出個類別加上1個背景類別的Softmax機率估計,另外一個爲個類別的每個類別輸出四個實數值。每組4個值表示個類別的一個類別的檢測框位置的修正。
ROI池化層前面的網絡層是對整幅圖像提取特徵獲得多個Feature Map。ROI池化層的輸入就是這多個Feature Map以及多個ROI(候選區域),這裏的ROI是一個矩形框,由其左上角的座標以及寬高組成的四元組\((r,c,h,w)\)定義。
ROI池化層使用最大池化將輸入的Feature Map中的任意區域(ROI對應的區域)內的特徵轉化爲固定的\(H \times W\)的特徵圖,其中\(H\)和\(W\)是超參數。 對於任意輸入的\(h \times w\)的ROI,將其分割爲\(H \times W\)的子網格,每一個子網格的大小爲\(\frac{h}{H} \times \frac{w}{W}\)。以下,取得\(2\times 2\)的特徵圖
ROI池化層的池化操做同標準的池化操做是同樣的,每一個通道都單獨執行。
經過ROI池化層能夠從整幅圖像的特徵圖中獲得每一個ROI的特徵圖(固定大小),而整幅圖像的特徵圖則使用預訓練的網絡提取獲得。對於預訓練完成的網絡要作以下的修改:
R-CNN中的特徵提取和檢測部分是分開進行的,使用檢測樣本進行訓練的時候沒法更新特徵提取部分的參數。SPPnet也不能更新金字塔層前面的卷積層權重,這是由於當批量訓練的樣原本自不一樣的圖片時,,反向傳播經過SPP層時十分低效。Fast R-CNN則可使用反向傳播的方法更新整個網絡的參數。
Fast R-CNN提出一個高效的訓練方法,能夠在訓練過程當中發揮特徵共享的優點。在Fast R-CNN訓練過程當中隨機梯度降低(SGD)的mini-batch是分層採樣的,首先取\(N\)張圖像,而後從每張圖片採樣\(\frac{R}{N}\)個RoI。來自同一張圖片的RoI在前向和後向傳播中共享計算和內存。這樣就能夠減小mini-batch的計算量。例如\(N=2,R=128\),這個訓練模式大概比從128個不一樣的圖像採樣1個RoI(這就是R-CNN和SPPnet的訓練方式)要快64倍。
該策略一個問題是會致使收斂起來比較慢,由於來自同一張圖片的RoI是相關的。但它在實際中並無成爲一個問題,咱們的使用\(N=2,R=128\)達到了很好的成績,只用了比R-CNN還少的SGD迭代。
Fast R-CNN有兩種輸出:
將上面的兩個任務的須要色損失函數放在一塊兒
\[ L(p,u,t^u,v) = L_{cls}(p,u) + \lambda [u \ge 1]L_{Ioc}(t^u,v) \]
其中,\(L_{cls}(p,u)\)是分類的損失函數,\(p_u\)是class u的真實分類的機率。這裏,約定\(u = 0\)表示背景,不參與邊框迴歸的損失計算。
\[ L_{cls}(p,u) = -\log (p_u) \]
\(L_{Ioc}(t^u,v)\)是邊框迴歸的損失函數,
\[ \begin{align*} L_{Ioc}(t^u,v) &= \sum_{i \in {x,y,w,h}}smooth_{L_1}(t_i^u - v) \end{align*} \]
其中,\(u\)表示類別,\(t^u\)表示預測邊框的偏移量(也就是預測邊框進行\(t^u\)偏移後,可以和真實邊框最接近),\(v\)表示預測邊框和實際邊框之間真正的偏移量
\[ smooth_{L_1}(x) = \left\{ \begin{array}{cc} 0.5 x^2 & if |x| < 1 \\ |x|-0.5 & otherwise\end{array}\right. \]
這裏\(smooth_{L_1}(x)\)中的\(x\)爲真實值和預測值座標對應值的差值,該函數在\((-1,1)\)之間爲二次函數,在其餘位置爲線性函數,Fast RCNN做者表示做者表示這種形式能夠加強模型對異常數據的魯棒性。其函數曲線以下圖
關於邊框的修正後面單獨詳述。
在進行目標檢測時,須要處理的RoI的個數較多,幾乎一半的時間花費在全鏈接層的計算上。就Fast R-CNN而言,RoI池化層後的全鏈接層須要進行約2k次,所以在Fast R-CNN中能夠採用SVD分解加速全鏈接層計算。
設全鏈接層的輸入爲\(X\),權值矩陣爲\(W_{u\times v}\),輸出爲\(Y\),則全鏈接層的實際上的計算是一個矩陣的乘法
\[ Y = W \cdot X \]
能夠將權值矩陣\(W\)進行奇異值分解(SVD分解),使用其前\(t\)個特徵值近似代替該矩陣
\[ W \approx U \Sigma_t V^T \]
其中,\(U\)是\(u \times t\)的左奇異矩陣,\(\Sigma_t\)是\(t \times t\)的對角矩陣,\(V\)是\(v \times t\)的右奇異矩陣。
截斷SVD將參數量由原來的 \(u \times v\) 減小到 \(t \times (u + v)\),當 \(t\) 遠小於 \(min(u,v)\) 的時候下降了很大的計算量。
在實現時,至關於把一個全鏈接層拆分爲兩個全鏈接層,第一個全鏈接層使用權值矩陣\(\Sigma_t V^T\)(不含偏置),第二個全鏈接層使用矩陣\(U\)(含偏置).當RoI的數量大時,這種簡單的壓縮方法有很好的加速
Fast R-CNN是對R-CNN的一種改進
在Fast R-CNN中使用的目標檢測識別網絡,在速度和精度上都有了不錯的結果。不足的是,其候選區域提取方法耗時較長,並且和目標檢測網絡是分離的,並非end-to-end的。在Faster R-CNN中提出了區域檢測網絡(Region Proposal Network,RPN),將候選區域的提取和Fast R-CNN中的目標檢測網絡融合到一塊兒,這樣能夠在同一個網絡中實現目標檢測。
Faster R-CNN的網絡有4部分組成:
其整個工做流程以下:
Faster R-CNN的4個組成部分,其中Conv Layers,RoI池化層以及分類和邊框迴歸修正,和Fast R-CNN的區別不是很大,其重大改進就是使用RPN網絡生成候選區域。
前面的卷積層用於提取輸入圖像的特徵,生成Feature Map。這裏有VGG-16爲例,Conv layers部分共有13個conv層,13個relu層,4個pooling層。在VGG中,
Conv Layers的13個conv層並不會改變圖像的尺寸,而有4個池化層,每一個池化層將輸入縮小爲原來的\(1/2\),則對於\(W \times W\)的輸入,Conv Layers輸出的Feature Map的寬和高爲\(W / 16 \times W /16\),也就是輸入尺寸的\(1/16\)。 有了這個Feature Map相對於原始輸入圖像的寬高比例,就能夠計算出Feature Map中的每一個點對應於原圖的區域。
因爲池化層的降採樣,Feature Map中的點映射回原圖上,對應的不是某個像素點,而是矩形區域。
區域提議網絡(RPN)以任意大小的圖像做爲輸入,輸出一組矩形的候選區域,而且給每一個候選區域打上一個分數。以下圖
RPN輸入的是前面Conv Layers提取圖像的Feature Map,輸出有兩部分:
爲了獲得上述的兩種輸出,要從輸入的Feature Map上獲得兩種信息:
前面提到因爲池化層的降採樣,Feature Map中的點映射回原圖上,對應的不是某個像素點,而是矩形區域。很簡單的,能夠將Feature Map中的每一個點映射回原始圖像,就能夠獲得一個候選區域,可是這樣獲得的區域太過於粗糙,顯然是不行的。Faster R-CNN使用的是將每一個Feature Map中的點映射到原圖上,並以映射後的位置爲中心,在原圖取不一樣形狀和不一樣面積的矩形區域,做爲候選區域。 論文中提出了Anchor的概念來表示這種取候選區域的方法:一個Anchor就是Feature Map中的一個點,並有一個相關的尺度和縱橫比。說白了,Anchor就是一個候選區域的參數化表示,有了中心點座標,知道尺寸信息以及縱橫比,很容易經過縮放比例在原圖上找到對應的區域。
在論文中爲每一個Anchor設計了3種不一樣的尺度\({128\times 128,256 \times 256,512 \times 512}\),3種形狀,也就是不一樣的長寬比\(W:H = {1:1,1:2,2:1}\),這樣Feature Map中的點就能夠組合出來9個不一樣形狀不一樣尺度的Anchor。下圖展現的是這9個Anchor對應的候選區域:
現假設輸入到Conv Layers的圖像尺寸爲\(800 \times 600\),經過VGG16的下采樣縮小了16倍,則最終生成的Feature Map的尺寸爲
\[ ceil(800/16) \times ceil(600 /16 ) = 50 \times 38 \]
有Feature Map的一個點\((5,5)\),以該點爲Anchro,生成不一樣的候選區域
只有區域信息也不行啊,這些區域有多是前景也有多是背景,這就須要提取這些區域對應的特徵信息,用於分類。對於VGG16,其最終生成的特徵圖有512個通道,也就是每一個點均可以獲得一個512維的特徵,將這個特徵做爲該點爲Anchor生成的區域特徵,用於分類。 論文中,是在特徵圖上作一個\(3 \times 3\)的卷積,融合了周圍的信息。
設Feature Map的尺度爲\(W \times H\),每一個點上生成k個Anchor(\(k = 9\)),則總共能夠獲得\(WHk\)個Anchors。而每一個Anchor便可能是前景也多是背景,則須要Softmax層\(cls = 2k\) scores;而且每一個anchor對應的候選區域相對於真實的邊框有$(x,y,w,y)\(4個偏移量,這就須要邊框迴歸層\)reg = 4k$ coordinates。
每一個anchor便可能包含目標區域,也可能沒有目標。 對於包含目標區域的anchor分爲positive label,論文中規定,符合下面條件之一的即爲positive樣本:
和任意GT的區域的IoU都小於0.3的anchor設爲negative樣本,對於既不是正標籤也不是負標籤的anchor,以及跨越圖像邊界的anchor就直接捨棄掉。
因爲一張圖像可以獲得\(WHk\)個Anchors,顯然不能將全部的anchor都用於訓練。在訓練的時候從一幅圖像中隨機的選擇256個anchor用於訓練,其中positive樣本128個,negative樣本128個。
關於邊框迴歸的具體內容,因爲本文內容過多,這裏再也不說明,單獨另寫。
本文就R-CNN的系列文章進行了一個大體的梳理,從R-CNN初次將CNN應用於目標檢測,到最終的Faster R-CNN經過一個CNN網絡完成整個目標檢測的演變過程。下圖總結下三個網絡
上表格引用自 Faster R-CNN論文筆記——FR