Faster rcnn(1)--- RPN原理及程式碼詳解
阿新 • • 發佈:2019-02-16
一. 論文
二. RPN提出的目的
- 用cnn來提取proposal,替代原始的slective search;由於原始的selective search獲得proposal框的過程很費時,使用cnn提取後可以極大提高速度。
- 如何提高?用CNN直接產生
三. RPN接面構及原理
1)概述
- 輸入為原始圖片,輸出為矩形proposal框
- backbone用的ZF(5個共享卷基層)或者VGG16(3個共享卷基層)
- 對backbone出來的最後featuremap進行滑窗,每個滑動窗口出來的是一個256(ZF)或者512(VGG16)的向量,然後這些向量用於RPN的迴歸以及分類
2)Anchors
- 每個滑動視窗得到多個proposal框,是根據給定的先驗anchor框得來的,先驗框的中心在滑動視窗的中心,3個不同大小尺度以及3個長寬比從而有9個anchor
- anchors具有轉移不變性。因為論文中anchors的產生是通過卷積核中心的不同尺度和寬高比的取樣,所以會有平移不變效能。
- anchors多尺度特性。多尺度的方法有這麼幾種,1)影象金字塔,time-sonsuming;2)卷積核金字塔(即多個不同尺度的卷積核);3)所提anchor的方式,每個位置給多個不同尺度的參考anchor,更加高效.
3)損失函式
- RPN的損失包含兩個部分,1) 二分類,判斷是否包含目標;2) 框的迴歸
- PART1 二分類部分
- 正樣本分類策略:1) 和ground truth的IOU最大的anchor為正類,2) 和任何gound truth的IOU超過0.7的anchor為正樣本;一個ground truth可能會將多個anchor標註為正樣本。通常方法 2) 更加高效,但是作者同時還採用了方法1是因為存在所有的anchor與groud truth的IOU不會超過0.7的情況
- 負樣本分類策略:anchor與所有ground truth的IOU小於0.3則判斷為負樣本
- 如果anchor為positive則對應的pi_*為1,Lcls為L1 smooth;迴歸損失只對與positive anchor有聯絡的groundtruth框計算。
- PART2 迴歸部分
- 為了平衡比重,在迴歸損失的前面加了權重(因為Nreg比Ncls大太多)
- 框的迴歸是在座標歸一化轉換後的值基礎上進行的,相當於與anchor最近的groudtruth框進行迴歸?另外一個考慮是如果不進行歸一化轉換,迴歸損失會在總損失中會佔據比較大的比重。
- 作者的框迴歸與之前的ROI方法不同,學到的是k個boungding-box迴歸器,每個迴歸器負責1個scale及1個aspect ratio,這k個迴歸器不共享權重,因此能在固定大小的features上預測不同尺度的框。(之前的是ROI出來多個尺度的feature再進行迴歸,迴歸器只有一個,即迴歸的係數是共享的)
四. RPN程式碼閱讀(pytorch版本)
- RPN預測的座標為對應論文中的tx,ty,tw,th;同時proposal要根據rpn的predict 座標以及anchors進行一個轉換得到(rpn.py中第36行->第77行->proposal_layer.py第106行->bbox_transform.py第88-92行)