1. 程式人生 > >Faster rcnn(1)--- RPN原理及程式碼詳解

Faster rcnn(1)--- RPN原理及程式碼詳解

一. 論文

二. 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的迴歸以及分類

mark

2)Anchors

  • 每個滑動視窗得到多個proposal框,是根據給定的先驗anchor框得來的,先驗框的中心在滑動視窗的中心,3個不同大小尺度以及3個長寬比從而有9個anchor
  • anchors具有轉移不變性。因為論文中anchors的產生是通過卷積核中心的不同尺度和寬高比的取樣,所以會有平移不變效能。
  • anchors多尺度特性。多尺度的方法有這麼幾種,1)影象金字塔,time-sonsuming;2)卷積核金字塔(即多個不同尺度的卷積核);3)所提anchor的方式,每個位置給多個不同尺度的參考anchor,更加高效.

mark

3)損失函式

  • RPN的損失包含兩個部分,1) 二分類,判斷是否包含目標;2) 框的迴歸
    mark
  • 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再進行迴歸,迴歸器只有一個,即迴歸的係數是共享的)

mark

四. RPN程式碼閱讀(pytorch版本)

  • RPN預測的座標為對應論文中的tx,ty,tw,th;同時proposal要根據rpn的predict 座標以及anchors進行一個轉換得到(rpn.py中第36行->第77行->proposal_layer.py第106行->bbox_transform.py第88-92行)