【问题标题】:how to load a very large mat file in chunks?如何分块加载非常大的mat文件?
【发布时间】:2018-11-06 13:15:04
【问题描述】:

好的,所以代码是这样的 X1 是加载的高光谱图像,尺寸为 (512x512x91) 我要做的基本上是裁剪 64x64x91 大小的矩阵,变化的步幅为 2。这给了我总共 49952 个图像,每个 64x64x91 大小但是当我运行 for 循环时,我得到了内存错误。 我的系统有 8 GB 内存。

data_images_0=np.zeros((49952,256,256,91))
k=0
for i in range(0,512-64,2):
    r=64
    print(k)
    for j in range (0,512-64,2):   
        #print(k)
        data_images_0[k,:,:,:]=X1[i:i+r,j:j+r,:]
        k=k+1

我有一张作为 Mat 文件加载的高光谱图像,尺寸为 (512x512x91)。我想使用这个图像的块作为我的 CNN 的输入,例如使用 64x64x91 的裁剪。问题是,一旦我从原始图像中创建了作物,我就无法加载数据,因为一次加载所有作物会给我带来内存错误。 我可以做些什么来分批加载我裁剪的数据,这样我就不会收到这样的内存错误。 我应该将我的数据转换成其他格式还是以其他方式处理问题?

【问题讨论】:

  • 您的图像是简单地存储为矩阵还是某种图像格式?
  • 欢迎来到 SO。请提供一个最小、完整和可验证的示例。 向我们展示您最近尝试的代码以及您遇到的问题。并解释为什么结果不是你所期望的。编辑您的问题以包含代码,请不要在评论中添加它,因为它可能不可读。 stackoverflow.com/help/mcve
  • 是的,它存储为矩阵......基本上 512x512 是空间维度,91 是通道或深度......它只是每个像素值的矩阵
  • Matlab 最新格式的 .mat 文件 (v7.3) 是压缩的,所以没有太多选择,只能全部解压。此外,数据以列的主要顺序存储,因此 64x64x91 数组的样本将遍布整个 512x512x91 体积。现在,高光谱图像只包含大约 2250 万像素:它应该很容易放入内存中。
  • 请包含如何生成作物的示例代码。这很重要,因为它可以解释为什么内存不足,展示如何存储作物,并提供如何将它们放入文件以便于访问的想法。

标签: python matlab numpy out-of-memory image-preprocessing


【解决方案1】:

您正在寻找matfile 函数。它允许您访问硬盘上的数组,然后只加载其中的一部分。

假设你的图片名为pic,那么你可以这样做

data = matfile("filename.mat");
part = data.pic(1:64,1:64,:);

%Do something

那么只有变量pic(1:64,1:64,:) 部分将被加载到part

与往常一样,应该注意的是,在硬盘上工作并不是很快,应该避免。另一方面,如果您的变量太大而无法放入内存,则没有其他方法可以解决(除了购买更多内存)。

【讨论】:

    【解决方案2】:

    我认为您可能想要使用 matfile 函数,它基本上打开一个 .mat 文件,而不会将其全部内容拉入 RAM。您基本上从 .mat 文件中读取了一个标题,其中包含有关存储元素的信息,如大小、数据类型等。想象一下您的 .mat 文件 hyperspectralimg.mat 包含矩阵 myImage。你必须像这样继续:

    filename = 'hyperspectralimg.mat';
    img = matfile(filename);
    
    A = doStuff2MyImg(img.myImage(1:64,1:64,:)); % Do stuff to your imageparts
    
    img.myImage(1:64,1:64,:) = A; %Return changes to your file
    

    这是一个简短的示例,如果您以前没有使用过matfile,您可以如何使用它。如果您已经使用过它但它不起作用,请告诉我们,作为一般建议,上传有关您的问题的代码 sn-ps 和数据示例,它会有所帮助。

    关于标签的快速评论:如果您关心matlab,那么不要标记python 和类似的东西。

    【讨论】:

    • 我实际上正在研究 python,但是我的数据文件是一个 .MAT 文件。我不确定是否应该更改我的数据格式,但基本想法是我想从我的 512x512x91 图像创建多个图像并将它们用作我的卷积神经网络的输入。问题是,一旦我创建了这么多作物并将它们一起保存在某个变量中,文件的大小就会变得非常大,我不知道如何满足这一点
    • 另外需要注意的是:这种语法对于 python 来说是完全错误的。没有驼峰式,不需要分号; python在matlab上美化的一部分。
    • Justin Mai,“python 的美化”只是你的观点。这与当前的事情无关。使用分号隐藏或实际上不隐藏对于调试来说是很好的,并且需要很少的努力。
    【解决方案3】:

    您可以使用 numpy 内存映射。这相当于 MatLAB 的 matfile。

    https://numpy.org/doc/stable/reference/generated/numpy.memmap.html

    【讨论】:

    • 如果文件是matlab中的struct,即不是ndarray怎么办?你能详细说明一下如何做吗?我进入了链接,但我仍然感到困惑。
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2017-01-02
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多