function script_faster_rcnn_demo() close all; clc; clear mex; clear is_valid_handle; % to clear init_key run(fullfile(fileparts(fileparts(mfilename('fullpath'))), 'startup')); %% -------------------- CONFIG -------------------- opts.caffe_version = 'caffe_faster_rcnn'; opts.gpu_id = auto_select_gpu; active_caffe_mex(opts.gpu_id, opts.caffe_version); opts.per_nms_topN = 6000; opts.nms_overlap_thres = 0.7; opts.after_nms_topN = 300; opts.use_gpu = true; opts.test_scales = 600; %% -------------------- INIT_MODEL -------------------- % model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_vgg_16layers'); %% VGG-16 model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_ZF'); %% ZF 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; if opts.use_gpu proposal_detection_model.conf_proposal.image_means = gpuArray(proposal_detection_model.conf_proposal.image_means); proposal_detection_model.conf_detection.image_means = gpuArray(proposal_detection_model.conf_detection.image_means); end % 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); % fast rcnn net fast_rcnn_net = caffe.Net(proposal_detection_model.detection_net_def, 'test'); fast_rcnn_net.copy_from(proposal_detection_model.detection_net); % set gpu/cpu if opts.use_gpu caffe.set_mode_gpu(); else caffe.set_mode_cpu(); end %% -------------------- WARM UP -------------------- % the first run will be slower; use an empty image to warm up for j = 1:2 % we warm up 2 times im = uint8(ones(375, 500, 3)*128); if opts.use_gpu im = gpuArray(im); end [boxes, scores] = proposal_im_detect(proposal_detection_model.conf_proposal, rpn_net, im); aboxes = boxes_filter([boxes, scores], opts.per_nms_topN, opts.nms_overlap_thres, opts.after_nms_topN, opts.use_gpu); if proposal_detection_model.is_share_feature [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), ... aboxes(:, 1:4), opts.after_nms_topN); else [boxes, scores] = fast_rcnn_im_detect(proposal_detection_model.conf_detection, fast_rcnn_net, im, ... aboxes(:, 1:4), opts.after_nms_topN); end end %% -------------------- TESTING -------------------- % im_names = {'001763.jpg', '004545.jpg', '000542.jpg', '000456.jpg', '001150.jpg'}; % these images can be downloaded with fetch_faster_rcnn_final_model.m image_path = '/media/wangxiao/Elements/image_segment_backup/ImagesData223/Pedestrian/172.19.199.223/'; file1 = dir(image_path); for ii = 3:size(file1, 1) new_path1 = [image_path, file1(ii).name, '/']; file2 = dir(new_path1); for jj = 3:size(file2, 1) new_path2 = [new_path1, file2(jj).name, '/']; file3 = dir(new_path2); for kk = 3:size(file3, 1) im = imread([new_path2, file3(kk).name]); running_time = []; % for j = 1:length(im_names) % im = imread(fullfile(pwd, im_names{j})); if opts.use_gpu im = gpuArray(im); end % test proposal th = tic(); [boxes, scores] = proposal_im_detect(proposal_detection_model.conf_proposal, rpn_net, im); t_proposal = toc(th); th = tic(); aboxes = boxes_filter([boxes, scores], opts.per_nms_topN, opts.nms_overlap_thres, opts.after_nms_topN, opts.use_gpu); t_nms = toc(th); % test detection th = tic(); if proposal_detection_model.is_share_feature [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), ... aboxes(:, 1:4), opts.after_nms_topN); else [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); % fprintf('%s (%dx%d): time %.3fs (resize+conv+proposal: %.3fs, nms+regionwise: %.3fs)\n', im_names{j}, ... % size(im, 2), size(im, 1), t_proposal + t_nms + t_detection, t_proposal, t_nms+t_detection); % running_time(end+1) = t_proposal + t_nms + t_detection; % visualize classes = proposal_detection_model.classes; boxes_cell = cell(length(classes), 1); thres = 0.6; for i = 1:length(boxes_cell) boxes_cell{i} = [boxes(:, (1+(i-1)*4):(i*4)), scores(:, i)]; boxes_cell{i} = boxes_cell{i}(nms(boxes_cell{i}, 0.3), :); I = boxes_cell{i}(:, 5) >= thres; boxes_cell{i} = boxes_cell{i}(I, :); end figure(j); [location, label, score] = output(im, boxes_cell, classes, 'voc'); if (score==0) continue; else disp(file3(kk).name); save(['./mat results/' file3(kk).name '.mat' ], 'location', 'label', 'score', 'im'); end showboxes(im, boxes_cell, classes, 'voc'); pause(0.1); end end end % fprintf('mean time: %.3fs\n', mean(running_time)); caffe.reset_all(); clear mex; end ------------------------------------------------------- --------------------------------------------------------- function proposal_detection_model = load_proposal_detection_model(model_dir) ld = load(fullfile(model_dir, 'model')); proposal_detection_model = ld.proposal_detection_model; clear ld; proposal_detection_model.proposal_net_def ... = fullfile(model_dir, proposal_detection_model.proposal_net_def); proposal_detection_model.proposal_net ... = fullfile(model_dir, proposal_detection_model.proposal_net); proposal_detection_model.detection_net_def ... = fullfile(model_dir, proposal_detection_model.detection_net_def); proposal_detection_model.detection_net ... = fullfile(model_dir, proposal_detection_model.detection_net); end function aboxes = boxes_filter(aboxes, per_nms_topN, nms_overlap_thres, after_nms_topN, use_gpu) % to speed up nms if per_nms_topN > 0 aboxes = aboxes(1:min(length(aboxes), per_nms_topN), :); end % do nms if nms_overlap_thres > 0 && nms_overlap_thres < 1 aboxes = aboxes(nms(aboxes, nms_overlap_thres, use_gpu), :); end if after_nms_topN > 0 aboxes = aboxes(1:min(length(aboxes), after_nms_topN), :); end end
matlab命令窗口,显示: 刚开始都是正常的,如下:
fast_rcnn startup done
GPU 1: free memory 3824902144
Use GPU 1
Warning: Specified caffe folder (/home/wangxiao/Downloads/faster_rcnn-master/experiments/external/caffe/matlab/caffe_faster_rcnn)
is not exist, change to default one (/home/wangxiao/Downloads/faster_rcnn-master/experiments/external/caffe/matlab)
> In active_caffe_mex at 19
In ori_demo at 7
20150301095338.jpg
20150301095445.jpg
20150301095535.jpg
20150301095543.jpg
20150301095603.jpg
20150301095613.jpg
20150301095617.jpg
20150301095632.jpg
20150301095635.jpg
20150301095646.jpg
20150301095656.jpg
20150301095659.jpg
20150301095711.jpg
20150301095714.jpg
20150301095717.jpg
20150301095720.jpg
20150301095723.jpg
20150301095726.jpg
20150301095729.jpg
20150301095734.jpg
20150301095741.jpg
20150301095750.jpg
Index exceeds matrix dimensions.
Error in ori_demo (line 114)
boxes_cell{i} = [boxes(:, (1+(i-1)*4):(i*4)), scores(:, i)];
但是,跑着跑着就出问题了,索引超过矩阵维度是什么鬼??只好硬着头皮一句一句的调试了,fuck 。。。。
但是,搞不定啊。。只知道了一个:非极大值抑制(NMS)
为什么会出错呢??? 之前跑的好好地啊。。。提示超过矩阵范围的那一句是作者自己写的。。。怎么会错呢?怎么会错?怎么会?怎么?怎? ?
不搞了,先把原始的图像,整理成一个文件夹在做处理:
clc; close all; path = '/media/wangxiao/Elements/image_segment_backup/'; savePath = '/media/wangxiao/Elements/wang xiao/additional_data/'; camera = dir(path); txt_path = '/media/wangxiao/Elements/wang xiao/'; txt_file = fopen([txt_path, 'log_file.txt'], 'a'); for i = 3:length(camera) disp(['camera ', num2str(i-2), '---']); fprintf(txt_file, '%s \n ', num2str(i-2)); path2 = [path, camera(i).name, '/']; file1 = dir(path2); for ii = 5:size(file1, 1) disp([' ', file1(ii).name, '---']); fprintf(txt_file, '%s \n', file1(ii).name); new_path = [path2, file1(ii).name, '/']; file2 = dir(new_path); for j = 3:size(file2, 1) disp([' ', file2(j).name, '---']); fprintf(txt_file, '%s \n', file2(j).name); new_path2 = [new_path, file2(j).name, '/']; file3 = dir(new_path2); for k = 3:size(file3, 1) disp([' ', file3(k).name, '---']); fprintf(txt_file, '%s \n', file3(k).name); new_path3 = [new_path2, file3(k).name , '/']; file4 = dir(new_path3); for r = 3:size(file4, 1) disp([' ', file4(r).name, '---']); fprintf(txt_file, '%s \n', file4(r).name); new_path4 = [new_path3, file4(r).name, '/']; file5 = dir(new_path4); for w = 3:size(file5, 1) if (imread([new_path4, file5(w).name])) im = imread([new_path4, file5(w).name]); imshow(im); imwrite(im, [savePath, file5(w).name]); else continue; end end end end end end end fclose(txt_file);
找到原因了,妈的,原来是因为,输入图像的大小不一致导致的,奇怪了,只要加一句: im = imresize(im, [127 127]); 将输入的图像统一resize成 固定的大小,即可。。。简单 粗暴 但是,不解其惑 。。。。
...