代码之家  ›  专栏  ›  技术社区  ›  jruivo

将图像文件转换为numpy数组时内存不足

  •  0
  • jruivo  · 技术社区  · 7 年前

    我试图运行一个循环,循环遍历一个图像文件夹并返回两个numpy数组: X -将图像存储为numpy数组 Y -存储标签。

    一个文件夹可以很容易地有超过40000个rgb图像,尺寸(224224)。 我有大约12GB的内存,但经过一些迭代后,使用的内存只是激增,一切都停止了。

    我能做些什么来解决这个问题?

    def create_set(path, quality):
        x_file = glob.glob(path + '*')
        x = []
    
        for i, img in enumerate(x_file):
            image = cv2.imread(img, cv2.IMREAD_COLOR)
            x.append(np.asarray(image))
            if i % 50 == 0:
                print('{} - {} images processed'.format(path, i))
    
        x = np.asarray(x)
        x = x/255
    
        y = np.zeros((x.shape[0], 2))
        if quality == 0:
            y[:,0] = 1
        else:
            y[:,1] = 1 
    
        return x, y
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim Bradley    7 年前

    你就是不能把那么多的图像载入内存。你想把每一个 文件 在给定的内存路径中,将它们附加到x。

    尝试分批处理它们,或者如果要为tensorflow应用程序执行此操作,请先将它们写入.tfrecords。

    如果要保存一些内存,请将图像保留为np.uint8,而不是将其强制转换为浮动(当您在此行中对其进行标准化时会自动发生这种情况> x = x/255 )

    你也不需要 np.asarray 在你 x.append(np.asarray(image)) 线。 image 已经是数组。 ASP阵列 用于将列表、元组等转换为数组。

    编辑:

    一个非常粗糙的批处理示例:

    def batching function(imlist, batchsize):
        ims = []
        batch = imlist[:batchsize]
    
        for image in batch:
            ims.append(image)
            other_processing()
    
        new_imlist = imlist[batchsize:]
        return x, new_imlist
    
    def main():
        imlist = all_the_globbing_here()
        for i in range(total_files/batch_size):
            ims, imlist = batching_function(imlist, batchsize)
            process_images(ims)
    
    推荐文章