Changed matcaffe_demo to return maxlabel
authorSergio Guadarrama <sguada@gmail.com>
Mon, 31 Mar 2014 21:40:38 +0000 (14:40 -0700)
committerSergio Guadarrama <sguada@gmail.com>
Mon, 31 Mar 2014 21:40:38 +0000 (14:40 -0700)
matlab/caffe/matcaffe_batch.m [new file with mode: 0644]
matlab/caffe/matcaffe_demo.m
matlab/caffe/prepare_batch.m [new file with mode: 0644]
matlab/caffe/print_cell.m [new file with mode: 0644]
matlab/caffe/read_cell.m [new file with mode: 0644]

diff --git a/matlab/caffe/matcaffe_batch.m b/matlab/caffe/matcaffe_batch.m
new file mode 100644 (file)
index 0000000..2e0e07f
--- /dev/null
@@ -0,0 +1,90 @@
+function [scores,list_im] = matcaffe_batch(list_im, use_gpu)
+% scores = matcaffe_batch(list_im, use_gpu)
+%
+% Demo of the matlab wrapper using the ILSVRC network.
+%
+% input
+%   list_im  list of images files
+%   use_gpu  1 to use the GPU, 0 to use the CPU
+%
+% output
+%   scores   1000 x num_images ILSVRC output vector
+%
+% You may need to do the following before you start matlab:
+%  $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64
+%  $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
+% Or the equivalent based on where things are installed on your system
+%
+% Usage:
+%  scores = matcaffe_batch({'peppers.png','onion.png'}, 0);
+%  scores = matcaffe_batch('list_images.txt', 0);
+if ischar(list_im)
+    %Assume it is a file contaning the list of images
+    filename = list_im;
+    list_im = read_cell(filename);
+end
+batch_size = 10;
+dim = 1000;
+disp(list_im)
+if mod(length(list_im),batch_size)
+    warning(['Assuming batches of ' num2str(batch_size) ' images rest will be filled with zeros'])
+end
+
+if caffe('is_initialized') == 0
+  model_def_file = '../../examples/imagenet_deploy.prototxt';
+  model_file = '../../models/alexnet_train_iter_470000';
+  if exist(model_file, 'file') == 0
+    % NOTE: you'll have to get the pre-trained ILSVRC network
+    error('You need a network model file');
+  end
+  if ~exist(model_def_file,'file')
+    % NOTE: you'll have to get network definition
+    error('You need the network prototxt definition');
+  end
+  caffe('init', model_def_file, model_file);
+end
+
+
+% init caffe network (spews logging info)
+
+% set to use GPU or CPU
+if exist('use_gpu', 'var') && use_gpu
+    caffe('set_mode_gpu');
+else
+    caffe('set_mode_cpu');
+end
+
+% put into test mode
+caffe('set_phase_test');
+
+d = load('ilsvrc_2012_mean');
+IMAGE_MEAN = d.image_mean;
+
+% prepare input
+
+num_images = length(list_im);
+scores = zeros(dim,num_images,'single');
+num_batches = ceil(length(list_im)/batch_size)
+initic=tic;
+for bb = 1 : num_batches
+    batchtic = tic;
+    range = 1+batch_size*(bb-1):min(num_images,batch_size * bb);
+    tic
+    input_data = prepare_batch(list_im(range),IMAGE_MEAN,batch_size);
+    toc, tic
+    fprintf('Batch %d out of %d %.2f%% Complete ETA %.2f seconds\n',...
+        bb,num_batches,bb/num_batches*100,toc(initic)/bb*(num_batches-bb));
+    output_data = caffe('forward', {input_data});
+    toc
+    output_data = squeeze(output_data{1});
+    scores(:,range) = output_data(:,mod(range-1,batch_size)+1);
+    toc(batchtic)
+end
+toc(initic);
+
+if exist('filename', 'var')
+    save([filename '.probs.mat'],'list_im','scores','-v7.3');
+end
+
+
+
index 7d4e81b..7296eb1 100644 (file)
@@ -1,4 +1,4 @@
-function [scores, layers] = matcaffe_demo(im, use_gpu)
+function [scores, maxlabel] = matcaffe_demo(im, use_gpu)
 % scores = matcaffe_demo(im, use_gpu)
 %
 % Demo of the matlab wrapper using the ILSVRC network.
@@ -89,16 +89,12 @@ tic;
 scores = caffe('forward', input_data);
 toc;
 
-% One can permute back Width and Height.
 scores = scores{1};
 size(scores)
 scores = squeeze(scores);
 scores = mean(scores,2);
 
-% you can also get network weights by calling
-if nargout == 2
-  weights = caffe('get_weights');
-end
+[~,maxlabel] = max(scores);
 
 % ------------------------------------------------------------------------
 function images = prepare_image(im)
diff --git a/matlab/caffe/prepare_batch.m b/matlab/caffe/prepare_batch.m
new file mode 100644 (file)
index 0000000..345c8eb
--- /dev/null
@@ -0,0 +1,41 @@
+% ------------------------------------------------------------------------
+function images = prepare_batch(image_files,IMAGE_MEAN,batch_size)
+% ------------------------------------------------------------------------
+if nargin < 2
+    d = load('ilsvrc_2012_mean');
+    IMAGE_MEAN = d.image_mean; 
+end
+num_images = length(image_files);
+if nargin < 3
+    batch_size = num_images;
+end
+
+IMAGE_DIM = 256;
+CROPPED_DIM = 227;
+indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;
+center = floor(indices(2) / 2)+1;
+
+num_images = length(image_files);
+images = zeros(CROPPED_DIM,CROPPED_DIM,3,batch_size,'single');
+
+parfor i=1:num_images
+    % read file
+    fprintf('%c Preparing %s\n',13,image_files{i});
+    try
+        im = imread(image_files{i});
+        % resize to fixed input size
+        im = single(im);
+        im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
+        % Transform GRAY to RGB
+        if size(im,3) == 1
+            im = cat(3,im,im,im);
+        end
+        % permute from RGB to BGR (IMAGE_MEAN is already BGR)
+        im = im(:,:,[3 2 1]) - IMAGE_MEAN;
+        % Crop the center of the image
+        images(:,:,:,i) = permute(im(center:center+CROPPED_DIM-1,...
+            center:center+CROPPED_DIM-1,:),[2 1 3]);
+    catch
+        warning('Problems with file',image_files{i});
+    end
+end
\ No newline at end of file
diff --git a/matlab/caffe/print_cell.m b/matlab/caffe/print_cell.m
new file mode 100644 (file)
index 0000000..864340d
--- /dev/null
@@ -0,0 +1,42 @@
+function res=print_cell(input,file,linesep,cellsep)
+assert(iscell(input),'The input should be a cell')
+if nargin < 4
+    cellsep = '\t';
+end
+if nargin < 3
+    linesep = '\n';
+end
+if exist('file','var') && ~isempty(file)
+    %%
+    fid = fopen(file,'w');
+    for l=1:length(input)
+        if iscell(input{l})
+            for i=1:length(input{l})
+                fprintf(fid,['%s' cellsep],input{l}{i});
+            end
+            fprintf(fid,linesep);
+        else
+            if size(input,2) > 1
+                for i=1:size(input,2)
+                    fprintf(fid,'%s ',input{l,i});
+                end
+                fprintf(fid,linesep);
+            else
+                fprintf(fid,['%s' linesep],input{l});
+            end
+        end
+    end
+    fclose(fid);
+else
+    res = '';
+    for l=1:length(input)
+        if iscell(input{l})
+            for i=1:length(input{l})
+                res = [res sprintf([cellsep{1} '%s' cellsep{2}],input{l}{i})];
+            end
+            res = [res sprintf(linesep)];
+        else
+            res = [res sprintf(['%s' linesep],input{l}(:))];
+        end
+    end
+end
\ No newline at end of file
diff --git a/matlab/caffe/read_cell.m b/matlab/caffe/read_cell.m
new file mode 100644 (file)
index 0000000..1983116
--- /dev/null
@@ -0,0 +1,21 @@
+function res=read_cell(filename,linesep,cellsep)
+if nargin < 2, linesep='\n'; end
+if nargin < 3, cellsep = '\t'; end
+if exist(filename,'file')
+    fid = fopen(filename);
+else
+    % Assume that filename is either a file ide or a string
+    fid = filename;
+end
+
+fileLines = textscan(fid,'%s','delimiter',linesep,'BufSize',100000);
+
+fileLines = fileLines{1};
+
+if regexp(fileLines{1},cellsep,'once')
+    fileLines = regexprep(fileLines,['^' cellsep '|' cellsep '$'],'');
+    res = regexp(fileLines,cellsep,'split');
+    res = cell2matcell(res);
+else
+    res = fileLines;
+end