1. 程式人生 > >Faster rcnn程式碼理解

Faster rcnn程式碼理解

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

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

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

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

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

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

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

進入get_roidb()函式,如下:

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

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

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

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

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

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

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

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

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

向roidb中再新增一些額外的資訊就可以用來進行訓練了(注意這還只是第一步,訓練總共四步),好了,到這兒,關於獲取roidb和imdb的程式碼就介紹到這兒了~