Faster-RCNN 训练自己的数据

  在前一篇随笔中,数据制作成了VOC2007格式,可以用于Faster-RCNN的训练。

1.针对数据的修改

修改datasets\VOCdevkit2007\VOCcode\VOCinit.m,我只做了两类

VOCopts.classes={...
        'dog'
        'flower'};

 

修改function\fast_rcnn\fast_rcnn_train.m,val_iters不能大于val数据量(我的只有几十个)。

ip.addParamValue('val_iters',       20,            @isscalar); 

 

修改function\rpn\proposal_train.m,与上一致。

ip.addParamValue('val_iters',           20,                @isscalar);

 

修改models\fast_rcnn_prototxts中两个文件夹里面的train_val.prototxt和test.prototxt,以K代表类别数做相应的修改,(共4个文件修改12处)。

input: "bbox_targets"
input_dim: 1  # to be changed on-the-fly to match num ROIs
input_dim: 12 # 4 * (K+1) (=21) classes
input_dim: 1
input_dim: 1

input: "bbox_loss_weights"
input_dim: 1  # to be changed on-the-fly to match num ROIs
input_dim: 12 # 4 * (K+1) (=21) classes
input_dim: 1
input_dim: 1
type: "InnerProduct"
    inner_product_param {
        num_output: 3  #K+1
        weight_filler {
            type: "gaussian"
            std: 0.01
        }
        bias_filler {
            type: "constant"
            value: 0
        }
    }
layer {
    bottom: "fc7"
    top: "cls_score"
    name: "cls_score"
    param {
        lr_mult: 1.0
    }
    param {
        lr_mult: 2.0
    }
    type: "InnerProduct"
    inner_product_param {
        num_output: 3  # K+1
        weight_filler {
            type: "gaussian"
            std: 0.01
        }
        bias_filler {
            type: "constant"
            value: 0
        }
    }
}

layer {
    bottom: "fc7"
    top: "bbox_pred"
    name: "bbox_pred"
    type: "InnerProduct"
    param {
        lr_mult: 1.0
    }
    param {
        lr_mult: 2.0
    }
    inner_product_param {
        num_output: 12  # 4 * (K+1)
        weight_filler {
            type: "gaussian"
            std: 0.001
        }
        bias_filler {
            type: "constant"
            value: 0
        }
    }
}

 

修改experiments\+Model\ZF_for_Faster_RCNN_VOC2007.m的三个为solver_30k40k.prototxt,默认60k80k所需时间过长。

 

2.根据设备性能的修改

显卡GTX750,显存2G,尽管数据不多,在默认设置下出现了内存不够的错误。

修改functions\fast_rcnn\fast_rcnn_config.m,以%标注的为默认值。

%% training
    % whether use gpu
    ip.addParamValue('use_gpu',         gpuDeviceCount > 0, ...            
                                                        @islogical);
    % Image scales -- the short edge of input image                                                
    ip.addParamValue('scales',          60,            @ismatrix);  %600
    % Max pixel size of a scaled input image
    ip.addParamValue('max_size',        1000,           @isscalar);
    % Images per batch
    ip.addParamValue('ims_per_batch',   2,              @isscalar);
    % Minibatch size
    ip.addParamValue('batch_size',      32,            @isscalar);  %128
    % Fraction of minibatch that is foreground labeled (class > 0)
    ip.addParamValue('fg_fraction',     0.25,           @isscalar);
    % Overlap threshold for a ROI to be considered foreground (if >= fg_thresh)
    ip.addParamValue('fg_thresh',       0.5,            @isscalar);
    % Overlap threshold for a ROI to be considered background (class = 0 if
    % overlap in [bg_thresh_lo, bg_thresh_hi))
    ip.addParamValue('bg_thresh_hi',    0.5,            @isscalar);
    ip.addParamValue('bg_thresh_lo',    0.1,            @isscalar);
    % mean image, in RGB order
    ip.addParamValue('image_means',     128,            @ismatrix);
    % Use horizontally-flipped images during training?
    ip.addParamValue('use_flipped',     true,           @islogical);
    % Vaild training sample (IoU > bbox_thresh) for bounding box regresion
    ip.addParamValue('bbox_thresh',     0.5,            @isscalar);

    % random seed
    ip.addParamValue('rng_seed',        6,              @isscalar);

    
    %% testing
    ip.addParamValue('test_scales',     60,            @isscalar);  %600
    ip.addParamValue('test_max_size',   1000,           @isscalar);
    ip.addParamValue('test_nms',        0.3,            @isscalar);
    ip.addParamValue('test_binary',     false,          @islogical);

 

3.开始训练

训练前删除或备份output,imdb\cache,运行experiments/script_faster_rcnn_VOC2007_ZF.m 开始训练。

在我的显卡上经过四个小时,训练完成。

 

下面是未删除output重新运行(很快)的结果。

***************
stage one proposal 
***************
aver_boxes_num = 1090, select top 2000
aver_boxes_num = 1091, select top 2000

***************
stage one fast rcnn
***************
!!! dog : 0.8969 0.9418
!!! flower : 0.9006 0.9458

~~~~~~~~~~~~~~~~~~~~
Results:
   89.6920
   90.0606

   89.8763

~~~~~~~~~~~~~~~~~~~~

***************
stage two proposal
***************
aver_boxes_num = 1263, select top 2000
aver_boxes_num = 1271, select top 2000

***************
stage two fast rcnn
***************

***************
final test
***************
aver_boxes_num = 233, select top 300
!!! dog : 0.8893 0.9449
!!! flower : 0.8990 0.9445

~~~~~~~~~~~~~~~~~~~~
Results:
   88.9304
   89.9025

   89.4165

~~~~~~~~~~~~~~~~~~~~
Cleared 0 solvers and 2 stand-alone nets
please modify detection_test.prototxt file for sharing conv layers with proposal model (delete layers until relu5)
>> 

 

4.测试

训练结束已有提示,要先修改detection_test.prototxt。

修改data为1*256*50*50,去掉roi_pool5之前的layer并将bottom改为data。

name: "Zeiler_conv5"

input: "data"
input_dim: 1
input_dim: 256
input_dim: 50
input_dim: 50

input: "rois"
input_dim: 1 # to be changed on-the-fly to num ROIs
input_dim: 5 # [batch ind, x1, y1, x2, y2] zero-based indexing
input_dim: 1
input_dim: 1

layer {
    bottom: "data"
    bottom: "rois"
    top: "pool5"
    name: "roi_pool5"
    type: "ROIPooling"
    roi_pooling_param {
        pooled_w: 6
        pooled_h: 6
        spatial_scale: 0.0625  # (1/16)
    }
}

 

在experiments\script_faster_rcnn_demo.m中将路径更改成本地相应路径,根据测试结果可以修改thres值。

model_dir                   = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC2007_ZF'); %% ZF_test
im_names = {'000001.jpg','000002.jpg','000034.jpg','000212.jpg','000213.jpg', '001150.jpg'};
thres = 0.3;  %0.6

 

检测速度很快,不过此次我的数据检测效果很不好,可能由于数据太少、画框不认真或某些没有意识到的参数错误-_-!。

 

posted on 2016-12-16 23:02  1357  阅读(2046)  评论(0编辑  收藏  举报

导航