Skip to content

Commit

Permalink
clear redundance
Browse files Browse the repository at this point in the history
  • Loading branch information
ShaoqingRen committed Aug 7, 2015
1 parent 16e3776 commit 47f845b
Show file tree
Hide file tree
Showing 10 changed files with 75 additions and 126 deletions.
52 changes: 37 additions & 15 deletions experiments/+Faster_RCNN_Train/gather_rpn_fast_rcnn_models.m
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
function gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, model, dataset)
cachedir = fullfile(pwd, 'output', 'rpn_fast_rcnn', model.final_model.cache_name);
cachedir = fullfile(pwd, 'output', 'faster_rcnn_final', model.final_model.cache_name);
mkdir_if_missing(cachedir);

% find latest model for rpn and fast rcnn
[rpn_test_net_def_file, rpn_output_model_file] = find_last_output_model_file(model.stage1_rpn, model.stage2_rpn);
[fast_rcnn_test_net_def_file, fast_rcnn_output_model_file] = find_last_output_model_file(model.stage1_fast_rcnn, model.stage2_fast_rcnn);

% check whether feature shared and find the indexs of shared layers
[is_share_feature, ~, fast_rcnn_weights, shared_layer_idx] = ...
[is_share_feature, last_shared_output_blob_name, shared_layer_names, shared_layer_idx] = ...
check_proposal_fast_rcnn_model(rpn_test_net_def_file, rpn_output_model_file, ...
fast_rcnn_test_net_def_file, fast_rcnn_output_model_file);

Expand Down Expand Up @@ -35,38 +35,60 @@ function gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, model, datas
if is_share_feature
proposal_detection_model.last_shared_layer_idx = max(shared_layer_idx);
proposal_detection_model.last_shared_layer_detection = ...
fast_rcnn_weights(proposal_detection_model.last_shared_layer_idx).layer_names;
shared_layer_names{proposal_detection_model.last_shared_layer_idx};
proposal_detection_model.last_shared_output_blob_name = ...
last_shared_output_blob_name;
fprintf('please modify %s file for sharing conv layers with proposal model (delete layers until %s)\n', ...
proposal_detection_model.detection_net_def, proposal_detection_model.last_shared_layer_detection);
end

save(fullfile(cachedir, 'model'), 'proposal_detection_model');
end

function [is_share_feature, proposal_weights, fast_rcnn_weights, shared_layer_idx] = check_proposal_fast_rcnn_model(proposal_model_net, proposal_model_bin, ...
function [is_share_feature, last_shared_output_blob_name, shared_layer_names, shared_layer_idx] = check_proposal_fast_rcnn_model(proposal_model_net, proposal_model_bin, ...
fast_rcnn_model_net, fast_rcnn_model_bin)

init_net(fast_rcnn_model_net, fast_rcnn_model_bin, '//log//', 0);
init_net(proposal_model_net, proposal_model_bin, '//log//', 1);
fast_rcnn_weights = caffe('get_weights', 0);
proposal_weights = caffe('get_weights', 1);
rpn_net = caffe.Net(proposal_model_net, 'test');
rpn_net.copy_from(proposal_model_bin);

is_share_feature = true;
fast_rcnn_net = caffe.Net(fast_rcnn_model_net, 'test');
fast_rcnn_net.copy_from(fast_rcnn_model_bin);

share_layer = true;
shared_layer_idx = [];
for i = 1:min(length(fast_rcnn_weights), length(proposal_weights))
if ~strcmp(fast_rcnn_weights(i).layer_names, proposal_weights(i).layer_names)
shared_layer_names = {};
shared_rpn_blobs = {};
for i = 1:min(length(rpn_net.layer_names), length(fast_rcnn_net.layer_names))
if ~strcmp(rpn_net.layer_names{i}, fast_rcnn_net.layer_names{i})
break;
end

if ~isequal(fast_rcnn_weights(i).weights, proposal_weights(i).weights)
is_share_feature = false;
rpn_layer_name = rpn_net.layer_names{i};
fast_rcnn_layer_name = fast_rcnn_net.layer_names{i};
rpn_layer = rpn_net.layers(rpn_layer_name);
fast_rcnn_layer = fast_rcnn_net.layers(fast_rcnn_layer_name);

for j = 1:min(length(rpn_layer.params), length(fast_rcnn_layer.params))
if ~isequal(rpn_net.params(rpn_layer_name, j).get_data(), fast_rcnn_net.params(fast_rcnn_layer_name, j).get_data())
share_layer = false;
end
end

if ~share_layer
break;
else
shared_layer_idx(end+1) = i;
shared_layer_names{end+1} = rpn_layer_name;
last_shared_output_blob_name = rpn_net.blob_names{rpn_net.top_id_vecs{i}};
end
end

caffe('release', 0);
caffe('release', 1);
is_share_feature = false;
if ~isempty(shared_layer_idx)
is_share_feature = true;
end

caffe.reset_all();
end

function [test_net_def_file, output_model_file] = find_last_output_model_file(stage1, stage2)
Expand Down
12 changes: 6 additions & 6 deletions experiments/+Faster_RCNN_Train/set_cache_folder.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,20 @@

model.stage1_fast_rcnn.cache_name = ...
[cache_base_proposal, ...
strrep(sprintf('_top%d_nms%g_top%d', model.stage1_rpn.per_nms_topN, ...
model.stage1_rpn.nms_overlap_thres, model.stage1_rpn.after_nms_topN), '.', '_'), ...
strrep(sprintf('_top%d_nms%g_top%d', model.stage1_rpn.nms.per_nms_topN, ...
model.stage1_rpn.nms.nms_overlap_thres, model.stage1_rpn.nms.after_nms_topN), '.', '_'), ...
cache_base_fast_rcnn, '_stage1_fast_rcnn'];

model.stage2_rpn.cache_name = ...
[cache_base_proposal, ...
strrep(sprintf('_top%d_nms%g_top%d', model.stage2_rpn.per_nms_topN, ...
model.stage2_rpn.nms_overlap_thres, model.stage2_rpn.after_nms_topN), '.', '_'), ...
strrep(sprintf('_top%d_nms%g_top%d', model.stage2_rpn.nms.per_nms_topN, ...
model.stage2_rpn.nms.nms_overlap_thres, model.stage2_rpn.nms.after_nms_topN), '.', '_'), ...
cache_base_fast_rcnn, '_stage2_rpn'];

model.stage2_fast_rcnn.cache_name = ...
[cache_base_proposal, ...
strrep(sprintf('_top%d_nms%g_top%d', model.stage2_rpn.per_nms_topN, ...
model.stage2_rpn.nms_overlap_thres, model.stage2_rpn.after_nms_topN), '.', '_'), ...
strrep(sprintf('_top%d_nms%g_top%d', model.stage2_rpn.nms.per_nms_topN, ...
model.stage2_rpn.nms.nms_overlap_thres, model.stage2_rpn.nms.after_nms_topN), '.', '_'), ...
cache_base_fast_rcnn, '_stage2_fast_rcnn'];

model.final_model.cache_name = [cache_base_proposal, cache_base_fast_rcnn];
Expand Down
4 changes: 3 additions & 1 deletion experiments/script_faster_rcnn_VOC0712_VGG16.m
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,12 @@ function script_faster_rcnn_VOC0712_VGG16()
%% final test
fprintf('\n***************\nfinal test\n***************\n');

model.stage2_rpn.nms = model.final_test.nms;
dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, dataset.imdb_test, dataset.roidb_test);
opts.final_mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage2_fast_rcnn, dataset.imdb_test, dataset.roidb_test);

% save final models, for outside tester
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, opts);
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, model, dataset);
end

function [anchors, output_width_map, output_height_map] = proposal_prepare_anchors(conf, cache_name, test_net_def_file)
Expand Down
4 changes: 3 additions & 1 deletion experiments/script_faster_rcnn_VOC0712_ZF.m
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,12 @@ function script_faster_rcnn_VOC0712_ZF()
%% final test
fprintf('\n***************\nfinal test\n***************\n');

model.stage2_rpn.nms = model.final_test.nms;
dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, dataset.imdb_test, dataset.roidb_test);
opts.final_mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage2_fast_rcnn, dataset.imdb_test, dataset.roidb_test);

% save final models, for outside tester
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, opts);
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, model, dataset);
end

function [anchors, output_width_map, output_height_map] = proposal_prepare_anchors(conf, cache_name, test_net_def_file)
Expand Down
4 changes: 3 additions & 1 deletion experiments/script_faster_rcnn_VOC2007_VGG16.m
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,12 @@ function script_faster_rcnn_VOC2007_VGG16()
%% final test
fprintf('\n***************\nfinal test\n***************\n');

model.stage2_rpn.nms = model.final_test.nms;
dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, dataset.imdb_test, dataset.roidb_test);
opts.final_mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage2_fast_rcnn, dataset.imdb_test, dataset.roidb_test);

% save final models, for outside tester
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, opts);
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, model, dataset);
end

function [anchors, output_width_map, output_height_map] = proposal_prepare_anchors(conf, cache_name, test_net_def_file)
Expand Down
16 changes: 9 additions & 7 deletions experiments/script_faster_rcnn_VOC2007_ZF.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ function script_faster_rcnn_VOC2007_ZF()
% train
model.stage1_rpn = Faster_RCNN_Train.do_proposal_train(conf_proposal, dataset, model.stage1_rpn, opts.do_val);
% test
dataset.roidb_train = cellfun(@(x, y) Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage1_rpn, x, y), dataset.imdb_train, dataset.roidb_train, 'UniformOutput', false);
dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage1_rpn, dataset.imdb_test, dataset.roidb_test);
% dataset.roidb_train = cellfun(@(x, y) Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage1_rpn, x, y), dataset.imdb_train, dataset.roidb_train, 'UniformOutput', false);
% dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage1_rpn, dataset.imdb_test, dataset.roidb_test);

%% stage one fast rcnn
fprintf('\n***************\nstage one fast rcnn\n***************\n');
% train
model.stage1_fast_rcnn = Faster_RCNN_Train.do_fast_rcnn_train(conf_fast_rcnn, dataset, model.stage1_fast_rcnn, opts.do_val);
% test
opts.mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage1_fast_rcnn, dataset.imdb_test, dataset.roidb_test);
% opts.mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage1_fast_rcnn, dataset.imdb_test, dataset.roidb_test);

%% stage two proposal
% net proposal
Expand All @@ -61,8 +61,8 @@ function script_faster_rcnn_VOC2007_ZF()
model.stage2_rpn.init_net_file = model.stage1_fast_rcnn.output_model_file;
model.stage2_rpn = Faster_RCNN_Train.do_proposal_train(conf_proposal, dataset, model.stage2_rpn, opts.do_val);
% test
dataset.roidb_train = cellfun(@(x, y) Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, x, y), dataset.imdb_train, dataset.roidb_train, 'UniformOutput', false);
dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, dataset.imdb_test, dataset.roidb_test);
% dataset.roidb_train = cellfun(@(x, y) Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, x, y), dataset.imdb_train, dataset.roidb_train, 'UniformOutput', false);
% dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, dataset.imdb_test, dataset.roidb_test);

%% stage two fast rcnn
fprintf('\n***************\nstage two fast rcnn\n***************\n');
Expand All @@ -73,10 +73,12 @@ function script_faster_rcnn_VOC2007_ZF()
%% final test
fprintf('\n***************\nfinal test\n***************\n');

opts.final_mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage2_fast_rcnn, dataset.imdb_test, dataset.roidb_test);
% model.stage2_rpn.nms = model.final_test.nms;
% dataset.roidb_test = Faster_RCNN_Train.do_proposal_test(conf_proposal, model.stage2_rpn, dataset.imdb_test, dataset.roidb_test);
% opts.final_mAP = Faster_RCNN_Train.do_fast_rcnn_test(conf_fast_rcnn, model.stage2_fast_rcnn, dataset.imdb_test, dataset.roidb_test);

% save final models, for outside tester
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, opts);
Faster_RCNN_Train.gather_rpn_fast_rcnn_models(conf_proposal, conf_fast_rcnn, model, dataset);
end

function [anchors, output_width_map, output_height_map] = proposal_prepare_anchors(conf, cache_name, test_net_def_file)
Expand Down
87 changes: 0 additions & 87 deletions experiments/script_faster_rcnn_VOC2007_ZF_dbg.m

This file was deleted.

16 changes: 8 additions & 8 deletions experiments/script_faster_rcnn_demo.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ function script_faster_rcnn_demo()
opts.test_scales = 600;

%% -------------------- INIT_MODEL --------------------
model_dir = fullfile(pwd, 'proposal_detection', 'Zeiler_conv5_c3_fcn_9a_0712_60k80k_release');
model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_vgg_16layers');
proposal_detection_model = load_proposal_detection_model(model_dir);

proposal_detection_model.conf_proposal.test_scales = opts.test_scales;
proposal_detection_model.conf_detection.test_scales = opts.test_scales;

caffe.init_log(fullfile(pwd, 'caffe_log'));
% proposal net
rpn_net = caffe.Net(proposal_detection_model.proposal_net_def, 'test');
rpn_net.copy_from(proposal_detection_model.proposal_net);
Expand All @@ -31,15 +32,14 @@ function script_faster_rcnn_demo()
fast_rcnn_net.copy_from(proposal_detection_model.detection_net);

% set gpu/cpu
if conf.use_gpu
if opts.use_gpu
caffe.set_mode_gpu();
else
caffe.set_mode_cpu();
end

%% -------------------- TESTING --------------------
% im = imread(fullfile(pwd, 'datasets', 'VOCdevkit2007', 'VOC2007', 'JPEGImages', '000010.jpg'));
im = imread('E:\code\spp\spp_data\datasets\COCO\COCO2014\JPEGImages\COCO_train2014_000000000529.jpg');
im = imread(fullfile(pwd, 'datasets', 'VOCdevkit2007', 'VOC2007', 'JPEGImages', '000010.jpg'));

for j = 1:10
% test proposal
Expand All @@ -53,12 +53,12 @@ function script_faster_rcnn_demo()
% test detection
th = tic();
if proposal_detection_model.is_share_feature
[boxes, scores] = fast_rcnn_conv_feat_detect(proposal_detection_model.conf_detection, im, ...
rpn_net.blobs(proposal_detection_model.last_shared_layer_detection).get_data(), ...
[boxes, scores] = fast_rcnn_conv_feat_detect(proposal_detection_model.conf_detection, fast_rcnn_net, im, ...
rpn_net.blobs(proposal_detection_model.last_shared_output_blob_name).get_data(), ...
aboxes(:, 1:4), opts.after_nms_topN);
else
[boxes, scores] = fast_rcnn_im_detect(proposal_detection_model.conf_detection, im, ...
aboxes(:, 1:4), max_rois_num_in_gpu);
[boxes, scores] = fast_rcnn_im_detect(proposal_detection_model.conf_detection, fast_rcnn_net, im, ...
aboxes(:, 1:4), opts.after_nms_topN);
end
t_detection = toc(th);

Expand Down
5 changes: 5 additions & 0 deletions functions/fast_rcnn/fast_rcnn_conv_feat_detect.m
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@
rois_blob = get_rois_blob(conf, rois, im_scale_factors);
end

function im_scales = get_image_blob_scales(conf, im)
im_scales = arrayfun(@(x) prep_im_for_blob_size(size(im), x, conf.test_max_size), conf.test_scales, 'UniformOutput', false);
im_scales = cell2mat(im_scales);
end

function [rois_blob] = get_rois_blob(conf, im_rois, im_scale_factors)
[feat_rois, levels] = map_im_rois_to_feat_rois(conf, im_rois, im_scale_factors);
rois_blob = single([levels, feat_rois]);
Expand Down
1 change: 1 addition & 0 deletions functions/rpn/proposal_calc_output_size.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
% Licensed under The MIT License [see LICENSE for details]
% --------------------------------------------------------

% caffe.init_log(fullfile(pwd, 'caffe_log'));
caffe_net = caffe.Net(test_net_def_file, 'test');

% set gpu/cpu
Expand Down

0 comments on commit 47f845b

Please sign in to comment.