caffe框架+faster rcnn 的MATLAB程式碼
阿新 • • 發佈:2019-02-09
最近幾天根據下面連結裡關於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.
接下來就是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.