一、faster rcnn的結構
通過上面的結構,我們知道該faster rcnn前面以VGG16為框架,加入RPN層,最后做分類層。
采用VGG16相對ZF來說慢一點,但是精度也高一點。
二、RPN結構
RPN層的引入,極大提升檢測框的生成速度。RPN是指以下結構:
前面的卷積結果過來后,分兩路來前進,上面是分類路徑(2×9),下面是坐標回歸路徑(4×9)。RPN屬於FCN網絡。
PRN的引入屬於創新性變化,我們在訓練的時候對RPN進行了兩次訓練,一次是使用gt+data 對其訓練,保存產生的proposal,沒有共用卷積層的訓練;
一次是共享卷積層的訓練,具體設置共享卷據層的lr=0,這樣就對RPN單獨訓練了。
還有就是我們訓練RPN時,隨機采樣256的anchors來,以正負1:1來訓練,初始化權重使用高斯隨機初始化新層權重,舊層使用預訓練的imageNet來初始化。
具體的訓練步驟:
三、anchors
這里每個像素點為中心產生9個anchor,每個anchor對應一個分類分數和回歸分數。256是圖片經過前面的卷積后得到的特征的維度,這里是ZF得到的256維度特征,VGG是512。對該特征
進行reshape成2×9和4×9。
圖片的左上角產生9個anchors后,以滑窗的形式遍歷整個圖,對於1000×600的圖片來說就產生20000個anchors,忽略跨界anchor大概剩下6000個anchors。注意這里訓練時忽略跨界anchors,但測試時不忽略,而采取剪切到邊界的方法。
生成anchors -> softmax分類器提取fg anchors -> bbox reg回歸fg anchors -> Proposal Layer生成proposals
這里Proposal Layer生成proposals的過程為:
Proposal Layer forward(caffe layer的前傳函數)按照以下順序依次處理:
- 生成anchors,利用
對所有的anchors做bbox regression回歸(這里的anchors生成和訓練時完全一致)
- 按照輸入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個anchors,即提取修正位置后的foreground anchors。
- 限定超出圖像邊界的foreground anchors為圖像邊界(防止后續roi pooling時proposal超出圖像邊界)
- 剔除非常小(width<threshold or height<threshold)的foreground anchors
- 進行nonmaximum suppression
- 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)結果作為proposal輸出。
四、bounding box regression原理
綠色是gt box,紅色是anchor,由圖可知anchor的預測不好,沒有包含飛機翼。那么我們現在就對該紅框使用回歸技術使其盡量擬合綠框。注意這里只有當紅色靠近綠框才使用回歸,太遠的誤差大,屬非線性回歸。
給動(Px,Py,Pw,Ph)尋找一種映射使f(Px,Py,Pw,Ph)=(Gxˆ,Gyˆ,Ghˆ,Gwˆ)≈(Gx,Gy,Gh,Gw)
先做平移
再做尺度縮放
回歸就是學習dx(p),dy(P),dw(P),dh(P)四個變換。
輸入是P=(Px,Py,Pw,Ph)和gt的t=(tx,ty,tw,th)
而gt與proposal的真正平移量和尺度縮放量是
那么目標函數是d(P)=wΦ(P), Φ(P)是輸入proposal的特征向量,w是要學習的參數,d(P)是預測值,我們要使預測值d(P)和真實偏差值t的差距最小,使用平方差函數有
函數優化就是針對該目標函數進行最小化
使用梯度下降求解w。
那么補充下:
1、為什么寬高尺度會設計成這種形式:tx,ty除以寬高,th,tw含log?
因為CNN具有尺度不變性,
圖片經上面變化后,t的值不變。如果直接學習坐標差,則就前后發生了改變,即x1-p1不等於x2-p2。
而尺度變化中尺度必須大於0,自然想到exp函數,反過來就是log函數的來源了。
2、為什么anchor靠近gt時,即IOU較大時,才認為是線性變換?
tx和ty顯然是線性組合。而tw和th中含有log,我們回憶下
高數里面:
因此:
我們看這公式,當且僅當Gw-Pw=0時,才會是線性函數,即gt的寬高和anchor的寬高必須近似相等。
五、損失函數
正標簽:IOU最大 + 與gt重疊>0.7 的框,一個gt框會為多個anchors添加正標簽,負標簽是<0.3的框。
pi是類的概率(只取1/0,當為1時才對正標簽激活后面的坐標回歸函數),ti是坐標向量,用這兩個量來定義函數(分類得分+回歸得分)。
Ncls和Nreg是歸一化因子,減少遞歸時間並規范化模型。
λ的選取經實驗得10的時候對結果最好。
上面的分類使用對數log損失,下面的回歸使用L1平滑函數損失。回歸為什么不使用平方函數損失呢?
因為平方函數隨着x的增加,平方函數的懲罰會越來越大,所以使用較為平緩的 |x| ; 但 |x| 在0點出不可導,所以要設計成平滑。
最終的L1平滑函數成這樣子:
六、RoI Pooling
輸入的圖片大小不一樣,為了統一圖片的格式,使用ROI Pooling,保留了全圖的特征,而不用crop或wrap掉部分特征。
RoI Pooling layer forward過程:在之前有明確提到: 是對應MxN尺度的,所以首先使用spatial_scale參數將其映射回(M/16)x(N/16)大小的feature maps尺度;之后將每個proposal水平和豎直分為pooled_w和pooled_h份,對每一份都進行max pooling處理。這樣處理后,即使大小不同的proposal,輸出結果都是 大小,實現了fixed-length output(固定長度輸出)。
引用:https://zhuanlan.zhihu.com/p/31426458