Faster rcnn代碼理解(1)


這段時間看了不少論文,回頭看看,感覺還是有必要將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的代碼就介紹到這兒了~

 (轉載請注明出處)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM