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

Faster rcnn代碼理解(1)

感覺 組織 等我 ont 包含 還要 定義 fig 訓練數據

這段時間看了不少論文,回頭看看,感覺還是有必要將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中,屬於網絡訓練時的配置文件),然後是初始化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中,這裏遇到問題1(config.py設置產生proposal的默認方法是selective search,但本論文中應該是使用prn_roidb方法獲得候選框的,這是在哪兒修改的???),先進入rpn_roidb()函數中:

技術分享

首先用gt_roidb()獲得gt的roi,進入gt_roidb()函數中:

技術分享

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

技術分享

技術分享

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

然後再回到rpn_roidb(),使用_load_rpn_roidb()獲得rpn_roidb,進入該函數中:

技術分享

這裏遇到問題2,”fileaname = self.config[‘rpn_file‘]“中的rpn_file默認值是0,後來是在哪兒賦值的???這裏是用create_roidb_from_box_list()獲得該roidb,進入該函數:

技術分享

這裏遇到問題3:rpn_roidb和gt_roidb有什麽不同???

這一切弄好之後再回到rpn_roidb()中執行”roidb = self.merge_roidbs(gt_roidb , rpn_roidb)“將兩種roidb進行融合,進入該融合函數:

技術分享

這個時候就從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的代碼就介紹到這兒了,博文中的三個問題等我弄懂再更新進來,也請各位看官就這三個問題提點建議,歇息~

Faster rcnn代碼理解(1)