2015-07-22 134 views
0

目前,我正在使用卷积神经网络进行纹理分类。我试图通过使用Matlab代码here来实现ZCA白化来预处理我的图像。ZCA白化(MATLAB) - 内存不足

请注意,我的图像的大小是512x512与RGB JPEG格式导致矩阵乘法内存不足。 (但是,我有我自己的理由,我不能减少我的研究中的图像大小)

下面是我的代码实现,例如,采取lena.jpg(512x512)作为示例。

I = double(imread('lena.jpg')); % image size of 512x512 
x = reshape(I, [], 3); % RGB vectors 
avg = mean(x, 1);  % Compute the mean pixel intensity value separately for each channel. 
sigma = x * x'/size(x, 2); % <== I get error here 
x = x - repmat(avg, size(x, 1), 1); 
[U,S,V] = svd(sigma); 
xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x; 

下面是我memory状态

Maximum possible array:  4338 MB (4.548e+09 bytes) * 
Memory available for all arrays:  4338 MB (4.548e+09 bytes) * 
Memory used by MATLAB:  1363 MB (1.429e+09 bytes) 
Physical Memory (RAM):  8052 MB (8.443e+09 bytes) 

* Limited by System Memory (physical + swap file) available. 

任何建议吗?

回答

0

我怀疑你的reshape是错误的...

当你阅读的图像,它返回一个512 * 512 * 3阵列I。当你用reshape(I,[],3)重塑它时,它将变成262144 * 3阵列x。现在x*x'会产生一个262144 * 262144阵列,这对您的内存来说太大了。

编辑:

显然,这是ZCA美白正确的步骤,但你应该应用此对图像的小补丁,以保持size(x,1)*size(x,1)听话......

+0

这是我在[网站](http://ufldl.stanford.edu/wiki/index.php/Implementing_PCA/Whitening)中找到了什么:“这里,我们假设'x'是一个数据结构,每个* *列**(所以,'x'是一个'n'-by -'m'矩阵)“ 因此,我的列分别是R,G,B,行应该是每个chan的像素NEL。 如果我的想法错了,请纠正我。 – karfai

+0

@EdwardSiew是的,显然你的操作在这种情况下是正确的,但它通常是在图像的补丁(比如16 * 16补丁)上产生的,它可以产生易处理的“n = 256” –