天天看點

Faster rcnn源碼了解(1)

這段時間看了不少論文,回頭看看,感覺還是有必要将Faster rcnn的源碼了解一下,畢竟後來很多方法都和它有相近之處,同時了解該架構也有助于以後自己修改和編寫自己的架構。好的開始吧~

這裡我們跟着Faster rcnn的訓練流程來一步一步梳理,進入tools\train_faster_rcnn_alt_opt.py中:

首先從__main__入口處進入,如下:

Faster rcnn源碼了解(1)

上圖中首先對終端中的指令行進行解析,擷取相關的指令參數;然後利用mp.Queue()建立一個多線程的對象,再利用get_solvers()獲得solvers等資訊;然後就開始了論文中的“四步訓練”:

第一步,首先訓練RPN網絡:

Faster rcnn源碼了解(1)

上圖中,先開始子程序訓練RPN,訓練函數是train_rpn(),那麼我們就進入這個函數一探究竟:

Faster rcnn源碼了解(1)

這裡首先使用cfg設定訓練時的一些設定參數(cfg類是一個字典,其定義在config.py中,屬于網絡訓練時的配置檔案)(注意這裡的cfg.TRAIN.PROPOSAL_METHOD = 'gt'這在後面會用到),然後是初始化caffe,這裡主要是設定了随機數種子,以及使用caffe訓練時的模式(gpu/cpu);之後就是第一個重頭戲--擷取imdb和roidb格式的訓練資料:

進入get_roidb()函數,如下:

Faster rcnn源碼了解(1)

首先通過get_imdb()函數獲得imdb資料,那我們就再進入get_imdb()函數一探究竟,如下:

Faster rcnn源碼了解(1)

這裡其實也是調用了pascal_voc()函數來建立imdb資料,pascal_voc類見pascal_voc.py檔案中,如下:

Faster rcnn源碼了解(1)

這裡隻截取了一部分,可以發現,pascal_voc這個類主要用來組織輸入的圖檔資料,存儲圖檔的相關資訊,但并不存儲圖檔;而實際上,pascal_voc類是imdb類的一個子類;好了現在imdb資料已經獲得了,再回到get_roidb()中,緊接着set_proposal_method()函數設定了産生proposal的方法,實際也是向imdb中添加roidb資料,進入set_proposal_method()這個函數:

Faster rcnn源碼了解(1)

首先用eval()對這個方法進行解析,使其有效,再傳入roidb_handler中,這裡就要回到之前的train_rpn()函數中了,它裡面設定了cfg.TRAIN.PROPOSAL_METHOD='gt'(預設值是selective search,先前用于fast rcnn的),先進入gt_roidb()函數中:

Faster rcnn源碼了解(1)

這裡gt_roidb()中實際是使用_load_pascal_annotation()通過解析XML檔案獲得gt的roi的,進入該解析函數:

Faster rcnn源碼了解(1)
Faster rcnn源碼了解(1)

可以發現,roidb的結構是一個包含有5個key的字典,具體值見上面代碼~

這個時候就從imdb獲得了最初的roidb格式的資料,但這還不是訓練時的roidb資料,再回到get_roidb()函數中,通過get_training()函數得到最終用于訓練的roidb資料,進入該函數:

Faster rcnn源碼了解(1)

先根據cfg.TRAIN.USE_FLIPPED判斷是否需要對roi進行水準鏡像翻轉(注意這裡的鏡像的對稱軸是圖檔的中心線),然後使用append_flipped_images()添加鏡像roi,作者認為這樣子能提高最終網絡的訓練結果(這應該算是一種簡單的資料增強吧),進入該函數:

Faster rcnn源碼了解(1)

添加之後還沒結束呢,回到get_training_roidb()中,最後還要再經過一步prepare_roidb(),進入該函數:

Faster rcnn源碼了解(1)

向roidb中再添加一些額外的資訊就可以用來進行訓練了(注意這還隻是第一步,訓練總共四步),好了,到這兒,關于擷取roidb和imdb的代碼就介紹到這兒了~

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

繼續閱讀