MATLAB Answers

How do I compute the maxpool of a image? Let us say stride of 2,2 on a mxn matrix?

198 ビュー (過去 30 日間)
Kannan U V
Kannan U V 2018 年 7 月 5 日
コメント済み: suWits Mohrarsii 2020 年 2 月 26 日
If I were to implement just the max pooling operation on an image as mentioned in the following page https://www.quora.com/What-is-max-pooling-in-convolutional-neural-networks What is the most efficient way of computing it without going into for loops

  0 件のコメント

サインイン to comment.

採用された回答

Kannan U V
Kannan U V 2018 年 7 月 6 日
The following does the trick
fun = @(block_struct) max(block_struct.data(:));
b = blockproc (a, [X Y], fun);

  1 件のコメント

Matt J
Matt J 2018 年 7 月 6 日
But it is not very efficient. Compare:
a=rand(5000);
X=4; Y=4; %window sizes
tic
fun = @(block_struct) max(block_struct.data(:));
b = blockproc (a, [X Y], fun);
toc
%Elapsed time is 19.764354 seconds.
tic
b=sepblockfun(a,[X,Y],'max');
toc
%Elapsed time is 0.092457 seconds.
It is probably in fact the least efficient approach you could use. Even a double for-loop is faster:
tic;
[m,n]=size(a);
ex=ones(1,m/X)*X;
ey=ones(1,n/Y)*Y;
ac=mat2cell(a,ex,ey);
for i=1:m/X
for j=1:n/Y
ac{i,j}=max(ac{i,j}(:));
end
end
b=cell2mat(ac);
toc
%Elapsed time is 6.203763 seconds.

サインイン to comment.

その他の回答 (2 件)

Matt J
Matt J 2018 年 7 月 6 日
編集済み: Matt J 2018 年 7 月 6 日
What is the most efficient way of computing it without going into for loops
The most efficient way in the entire universe is to use SEPBLOCKFUN (Download) as follows,
X=2; Y=2; %window sizes
maxpool=sepblockfun(yourImage,[X,Y],'max');
This assumes the image dimensions m,n are evenly divisible by X,Y respectively. Otherwise, you must pad the image to make it so.

  2 件のコメント

Kannan U V
Kannan U V 2018 年 7 月 6 日
Thanks for your time and answer. It looks like the following does the trick
fun = @(block_struct) max(block_struct.data(:));
b = blockproc (a, [X Y], fun);
suWits Mohrarsii
suWits Mohrarsii 2020 年 2 月 26 日
thank you for this function

サインイン to comment.


Anton Semechko
Anton Semechko 2018 年 7 月 5 日
編集済み: Anton Semechko 2018 年 7 月 5 日
Here is an example:
% Sample image
im=imread('cameraman.tif'); % sample image
% 4 pixels comprising non-overlapping 2-by-2 neighbourhoods
im_nw=im(1:2:end,1:2:end);
im_sw=im(2:2:end,1:2:end);
im_se=im(2:2:end,2:2:end);
im_ne=im(1:2:end,2:2:end);
% Select pixel with maximum intensity
im_max=max(cat(3,im_nw,im_sw,im_se,im_ne),[],3);
% Visualize
figure('color','w')
ha=subplot(1,2,1);
imshow(im,imref2d(size(im)))
title(ha,'original','FontSize',20)
ha=subplot(1,2,2);
imshow(im_max,imref2d(size(im_max)))
title(ha,'2x2 max-pool','FontSize',20)
Note that even though two images appear to have the same size when visualized using 'imshow', the dimensions of im_max are half that of im. Recursive application of 2-by-2 max-pool will result in downsampled images with sizes 1/2, 1/4, 1/8, etc. of the original image.

  1 件のコメント

Kannan U V
Kannan U V 2018 年 7 月 5 日
Thanks for your time and answer. I am looking for variable X, Y window sizes too.

サインイン to comment.

サインイン してこの質問に回答します。

タグ


Translated by