我基本上是按顺序读取50000个png文件(名为1.png,2.png ....的文件)并逐个将它们转换为灰度。然后我使用重塑功能将这些图像数据转换为单个矢量。 imresize这里将32 * 32图像尺寸缩小到8 * 8。由于下面的for循环花费了很多时间(约5到6分钟),我正在考虑替代方法或任何优化方法。我尝试了来自并行计算工具箱的matlabpool和parfor,但由于我在一台孤立的计算机上工作,它不适合我。请在此代码中向我推荐一些方法或更改。
image_Coll = zeros(8*8,50000);
for k = 1:50000
imageData = imread(strcat('D:\MATLAB_FILES\KAGGLE_CIFAR\train\',num2str(k), '.png'));
imageData = imresize(imageData,[8 8]);
imageData = rgb2gray(imageData);
imageData=reshape(imageData,8*8,1); % 8 * 8 pixels
image_Coll(:,k)= imageData;
end
答案 0 :(得分:1)
最耗时的部分很可能是imread
,而你可能做的并不多。
您可以通过在循环中使用单独的变量来减少一点时间。使用您的代码,imageData
首先是32x32,然后是8x8,在下一次迭代中,Matlab必须再次分配内存以使imageData
32x32。你可以避免使用两个变量而不是一个。此外,(:)
可能比reshape
更快:
image_Coll = zeros(8*8,50000);
for k = 1:50000
imageData = imread(strcat('D:\MATLAB_FILES\KAGGLE_CIFAR\train\',num2str(k), '.png'));
imageData2 = imresize(imageData,[8 8]);
imageData2 = rgb2gray(imageData2);
image_Coll(:,k)= imageData2(:);
end
或者
image_Coll = zeros(8*8,50000);
for k = 1:50000
imageData = imread(strcat('D:\MATLAB_FILES\KAGGLE_CIFAR\train\',num2str(k), '.png'));
imageData2(:,k)= rgb2gray(imresize(imageData,[8 8]));
image_Coll(:,k)= imageData2(:);
end
但是,我不认为这会为你节省很多时间。
答案 1 :(得分:1)
您希望达到什么样的速度?就个人而言,我认为每分钟打开1000张图像并不合格。“
如果你想要显着的加速,你可能需要在框外思考一下。我能提出的一些事情:
尝试将它们保存到一个或几个较大(垫子)文件中并从那里加载,而不是加载50000个图像。当然,这只有在你需要多次处理相同的照片时才有用。
通常,您可以通过使用矢量化来实现加速。我不知道是否可能,但如果你在一些大图像(原始图像的串联)上调用rgb2gray并将结果分开,则可能比单独处理每个图像快得多。
无论如何,请务必使用profile
,关注瓶颈并保持现实的期望。