1. 程式人生 > >Faster rcnn原始碼理解(3)

Faster rcnn原始碼理解(3)

緊接著之前的部落格,我們繼續來看faster rcnn中的AnchorTargetLayer層:

該層定義在lib>rpn>中,見該層定義:

首先說一下這一層的目的是輸出在特徵圖上所有點的anchors(經過二分類和迴歸)

(1)輸入blob:bottom[0]儲存特徵圖資訊,bottom[1]儲存gt框座標,bottom[2]儲存im_info資訊;

(2)輸出blob:top[0]儲存anchors的label值(fg是1,bg是0,-1類不關心),top[1]儲存的是生成的anchors的迴歸偏移量,即論文中的tx,ty,tw,th四個量(所以說整個faster rcnn總共兩次bbox迴歸,第一次在RPN中,第二次在fast rcnn中),top[2]和top[3]分別儲存的是bbox_inside_weights和bbox_outside_weights,這兩者的具體形式後面再說,作用還不是很清楚;

好的,先進入層的setup函式:

該函式通過解析父類對自己的一些引數進行初始化,同時定義該層的輸入輸出blob;

該函式中要注意的是generate_anchors()函式,它的作用是產生對應與特徵圖上最左上角那個點的九種anchor(尺寸對應與輸入影象),這9個anchor在後面被用來產生所有影象上的anchors,進入generate_anchors()函式:

 

三種長寬比(0.5,1,2)和三種參考尺寸(128,256,512)形成了九種anchors(注意這裡只是參考尺寸,是用來計算anchors尺寸時用到的三種規格,並不是說anchors的規格就是這三種);

接著向下看該層的前向傳播函式forward函式:

 

這裡獲得輸入bottom[0]、bottom[1]、bottom[2],繼續:

這裡的shift_x和shift_y分別對應x和y軸上的偏移量,用在之前說過的用generate_anchors()函式生成的最左上角的anchors上,對其進行偏移,從而獲得所有影象上的anchors;all_anchors用來儲存所有這些anchors,total_anchors用來儲存這些anchors的數量K×A,其中,K是輸入影象的num,A是一幅影象上anchor的num;之後作者還對這些anchors進行了篩選,超出影象邊界的anchors都將其丟棄~繼續:

這一部分主要就是獲得這些anchors和對應gt的最大重疊率的情況,以及正樣本的劃分標準:a.對於每一個gt,重疊率最大的那個anchor為fg;b,對於每一個gt,最大重疊率大於0.7的為fg;

cfg.TRAIN.RPN_CLOBBER_POSITIVE則涉及到一種情況,即如果最大重疊率小於cfg.TRAIN.RPN_NEGATIVE_OVERLAP=0.3,則到底正還是負,這裡的cfg.TRAIN.RPN_CLOBBER_POSITIVE預設是False;

繼續:

這一部分是說,如果我們得到的正樣本或者負樣本太多的話,那麼就選取一定數量的,丟棄一定數量的anchors,應該是為了加速(這裡的選取方法也很直接,就是隨機選取),繼續:

這一部分是生成bbox_targets、bbox_inside_weights、bbox_inside_weights;其中對於bbox_targets,它這裡是呼叫了_compute_targets()函式,見:

在該函式又接著呼叫了bbox_transform函式,見:

從而得到了論文中所需要的四個偏移量tx,ty,tw,th四個量;

而對於後兩個bbox_inside_weights和bbox_outside_weights,函式中定義的是bbox_inside_weights初始化為n×4的0陣列,然後其中正樣本的座標的權值均為1;而bbox_outside_weights同樣的初始化,其中正樣本和負樣本都被賦值1/num(anchors的數量),還有另一種非統一的賦值方式在else中,這裡就不說了;繼續:

這裡則是通過_unmap()函式實現將之前在所有影象上產生的anchors都賦上label、bbox_targets、bbox_inside_weights、bbox_outside_weights屬性,見該函式:

之後會把這些屬性資訊經過reshape封裝進該網路層的輸出blob,即top[0]、top[1]、top[2]、top[3]中;之後:

由於該層不需要反向傳播,所以backward函式也不需要寫了,在前向傳播中已經reshape了,就不用再寫reshape函數了~

 好了,到此,AnchorTargetLayer層的定義就寫到這兒,若有錯誤請指出~

http://www.cnblogs.com/zf-blog/p/7307502.html