1. 程式人生 > >caffe框架+faster rcnn 的MATLAB程式碼

caffe框架+faster rcnn 的MATLAB程式碼

 最近幾天根據下面連結裡關於caffe框架的解析大致看了caffe主要的幾個檔案(也就主要看了部落格提到的幾個函式)

接下來就是faster rcnn 的MATLAB程式碼了。下面是我根據看的幾篇文章做的一些摘抄,fast rcnn部分裡面的函式還沒怎麼去看.faster rcnn  matlab./datasets:VOC資料集的存放路徑 
./experimenet:訓練或者測試的入口函式 
 >script_faster_rcnn_VOC0712_VGG16.m  
 訓練過程,採用VGG和VOC0712,RPN一共配置了三個引數model,dataset,conf_proposal(conf_fast_rcnn是 fast-RCNN的引數)
 (1)model引數:
 指定了RPN和fastRCNN兩個階段所需要的網路結構配置檔案prototxt的路徑。通過第一階段的RPN熟悉其具體過程。 
 指定了VGG pre-trained模型及影象均值的路徑。具體配置程式為同級的 +Model/VGG16_for_faster_RCNN_VOC0712.m的程式碼片段,只關注RPN第一階段相關的程式碼。首先指定了基網路(VGG) 預訓練模型和影象均值檔案路徑;然後指定了RPN相關prototxt檔案路徑;最後設定了RPN測試引數。
 (2)dataset引數
 具體實現資料集讀取的檔案為 experiments/+Dataset/voc0712_trainval.m和experiments/ +Dataset/voc0712_test(沒有找到這個檔案???)。首先獲得資料集儲存路徑;然後將資料讀入到imdb和roidb 檔案。imdb檔案是一個matlab的表結構,表的每一行是一幅影象,分別包含如下資訊:影象的路徑,編號,大小, groundtruth(位置及類標)等。
 (3)conf_proposal引數:只關注RPN的conf_proposal,具體配置檔案為:functions/rpn/proposal_config.m
 RPN所需要的引數。其中值得注意的引數有 
 batch_size:[256]每幅影象中篩選使用的bg樣本和fg樣本的總個數 
 fg_fraction:[0.5]batch_size中fg樣本的比例,如果fg樣本個數不足,則新增bg樣本 
 drop_boxes_runoff_image:[1]在訓練階段是否去掉超出影象邊界的anchors 
 bg_thresh_hi:[0.3]被看做反例樣本的anchor與groundtruth的最大IoU 
 bg_thresh_lo:[0]被看做反例樣本的anchor與groundtruth的最小IoU 
 fg_thresh:[0.7]被看做正例樣本的anchor與groundtruth的最小IoU 
 ims_per_batch:[1]訓練時每次輸入的影象個數,當前只支援每次輸入一幅影象 
 scale:[600]短邊縮放後最小值 
 max_size:[1000]長邊縮放後最大值 
 feat_stride:[16]VGG中conv5_3相比於輸入影象縮小了16倍,也就是相鄰兩個點之間的stride=16 
 anchors:不同長寬比和尺度的9個基本anchors 
 output_width_map:輸入影象的寬度和conv5_3寬度的對應關係 
 output_height_map:輸入影象的高度和conv5_3高度的對應關係 
 bg_weight:[1]計算損失時每個反例樣本的權值,正例樣本權值全為1 
 image_means: 影象均值
 (4)產生anchor
 proposal_prepare_anchors函式分為兩部分。
 >首先產生輸入影象大小和conv5_3大小的對應關係map;
 首先初始化RPN的測試網路;然後產生不同長寬的全零影象並進行前向傳播;記錄每個輸入影象大小對應的conv5_3 大小;重置caffe。
 >然後產生9個基本anchors。
 設定最基準的anchor大小為16×16;保持面積不變,利用該m檔案中ratio_jitter生成三個長寬比(0.5,1,2)的 anchors.通過該m檔案中scale_jitter將不同長寬比的anchors放大到三個尺度(8,16,32)。一共生成9個anchors。 
 >最後將output_width_map,output_height_map以及anchors存入conf_proposal引數中。
 (5)所有引數設定完成後開始訓練。
 do_proposal_train直接呼叫functions/rpn/proposal_train.m檔案。
 proposal_train.m主要分為init, making tran/val data和Training三個階段
 >init,初始化  主要設定快取檔案路徑,讀入caffe求解引數,讀入caffe模型結構,讀入預訓練模型,初始化日 志文件,設定GPU模式。
 >making tran/val data,將bbs的資料轉換為regression的資料 ,呼叫到了proposal_prepare_image_roidb函式
  rpn/proposal_prepare_image_roidb.m從imdb以及roidb中讀入影象資訊後,實現了:
 影象中bbx的groundtruth 資料由[x1,y1,x2,y2]轉換為[dx,dy,dw,dh],由faster-RCNN論文中的公式(2)實現;然  後對bg和fg樣本進行篩選; 最後計算轉換後的[dx,dy,dw,dh]均值和方差。
 詳細步驟為: 
 - 讀入影象資訊:將影象資訊讀入到image_roidb中。 
 - groundtruth資料轉換:proposal_prepare_image_roidb.m中的append_bbox_regression_targets實現 
 - 獲得所有anchors:通過proposal_locate_anchors.m獲得影象的所有anchors以及影象需要縮放的比例 
 - 影象縮放比例:通過scale和max_size獲得影象的縮放比例並記錄縮放後圖像大小 
   影象的最短邊最小值為scale,最長邊最大值為max_size


  - **conv5_3特徵層大小:**通過查表法獲得縮放後圖像對應的conv5_3的大小   (output_width_mapoutput_height_map)
     - **網格化:**按照`feat_stride`將conv5_3的大小打成網格
     - **所有anchors:**在網格每個節點上放入9個基本`anchors`,並獲得其座標。
  - **挑選樣本:**`proposal_prepare_image_roidb.m`檔案中的`compute_targets`實現正例樣本和反例樣本的     選取
     - **計算overlap**:所有anchors存入變數`ex_rois`,計算每個anchor和每個groundtruth的重疊率(IoU)
     - **去掉超出範圍的anchor**:將超出範圍的anchor和groundtruth的重疊率置0.
     - **篩選正例樣本**:IoU最大的和IoU大於`fg_thresh`的anchor作為正例樣本
     - **篩選反例樣本**:IoU介於`bg_thresh_hi`和`bg_thresh_lo`之間的作為反例樣本
     - **計算迴歸量**:通過文章中公式(2)計算每個正例樣本的迴歸量`dx`,`dy`,`dw`,`dh`
     - **新的groundtruth**:將正例樣本的迴歸量作為正例樣本的groundtruth(類標1),反例樣本的迴歸量均        設為0(類標-1)。
  - **計算均值方差**:計所有正例樣本的迴歸量的均值和方差,並且標準化(減去均值,除以方差)
> Training,訓練
  1.打亂訓練資料順序 proposal_train.m中的generate_random_minibatch函式實現對訓練資料的打亂,並返回打亂後的第一幅影象的標 號sub_db_inds。
  2.準備一個訓練資料  proposal_generate_minibatch.m實現。 
 - 正反例樣本選取及權重設定:proposal_generate_minibatch.m中的sample_rois選取樣本並且設定權重 
 - fg_inds:正例樣本序號,如果不到batch_size的fg_fraction倍,則用反例樣本補足。 
 - bg_inds:反例樣本序號,反例樣本一般都比較多,需要進行隨機選取。 
 - label:對每個正例樣本label置1,反例樣本label置0. 
 - label_weights:樣本類別損失的權重。正例樣本置1,反例樣本置bg_weight。 
 - bbox_targets:進行資料轉換後的正反例樣本視窗位置 
 - bbox_loss_weights:樣本位置損失的權重。正例為1,反例為0
 整合RPN輸入blob:RPN輸入的im_blob.RPN輸入的labels_blob.RPN輸入的label_weights_blob.RPN輸入的bbox_targets_blob.RPN輸入的bbox_loss_blob
   3.迭代


./external:caffe的matlab介面。只需安裝好caffe的依賴庫,並不需要編譯caffe原始檔。 


./fetch_date:下載資料集,預訓練模型等檔案的函式 


./functions:訓練資料處理相關的函式 
 >fast_rcnn
 >rpn
 1.proposal_generate_anchors一個產生anchors 的函式,我們稱其產生的為base anchor.
 2.proposal_locate_anchors在rpn訓練的過程中,針對每一張樣本影象的大小與網路,得到所有anchor。
 >nms
 非極大值抑制c程式碼mex之後的檔案 


./imdb:將VOC資料讀入到imdb格式 


./models:基網路(如VGG)的預訓練模型;fast-RCNN,RPN網路結構prototxt及求解相關的引數prototxt檔案 


./utils:一些其它常用的函式 
 1.boxoverlap.m  
 用來計算兩個boxes中box間的重疊係數。主要在選擇產生的roi時用到,用於選擇滿足一定重疊係數的roi.
 2.im_list_to_blob.m 
 輸入元組ims,ims{i}為一張圖片,將ims轉換為blob(w,h,3,n)
 3.prep_im_for_blob.m 根據輸入圖片,圖片均值,目標尺寸,返回目標圖片和縮放係數。 
 prep_im_for_blob_size.m 按輸入圖片的尺寸和目標尺寸,返回尺寸縮放係數。
 4.RectLTRB2LTWH RectLTWH2LTRB 座標標定的不同方式之間的轉換。
 5.輸入一張圖片,含多個box座標資訊的元組boxes,每個box對應的標籤legends,對圖片進行資訊的標註。輸出圖片尺寸固定,要注意對應box座標的縮放。
 6.function tic_toc_print(fmt, varargin)
  % Print only after 1 second has passed since the last print. 
  % Arguments are the same as for fprintf.