【问题标题】:More memory and velocity efficient way to read in and save images?读取和保存图像的内存和速度更高效的方式?
【发布时间】:2020-09-05 18:26:01
【问题描述】:

我正在训练一个神经网络。因此,我使用下面的代码读取了 182335 个图像(png 文件)。

folders = glob.glob(r'path\to\images\*')
imagenames_list = []
for folder in folders:
    for f in glob.glob(folder+'/*.png'):
        imagenames_list.append(f)
read_images = []        

for image in imagenames_list:
    read_images.append(cv2.imread(image))

在对数据进行一些预处理后,我创建了一个 pandas 数据框并将其保存为一个 pickle 文件:

df.to_pickle(r'data\data_as_pddataframe.pkl')

df.head()

由于图像数量巨大,我有一个相对较大的 pickle 文件 (3GB)。正因为如此,读取该文件需要一些时间,并且还需要大量内存。另外,我准备在 Google Colab 中训练网络时,碰巧 Colab 因为数据量太大而崩溃。

因此,有没有更有效的方法 1. 读取数据和 2. 存储数据帧?

谢谢!

【问题讨论】:

  • 数据是如何存储在DataFrame中的?
  • 如果没有别的,你不应该使用 Pickle 作为你的数据格式。考虑使用 Parquet 或 HDF5。见realpython.com/storing-images-in-python
  • 感谢您的回答!我编辑了我的问题。数据框中还存储了更多数据。变量是 image、image_path、track_id、lp 和 train。
  • 好的。至于崩溃的 Colab,您肯定是在使用 SGD 或批量 SGD 运行模型,对吧?然后,您所要做的就是将数据存储在磁盘上的某个位置,并一次(或分批)加载一个记录以进行训练。
  • 好的,谢谢!我正在训练批量 SGD。

标签: python pandas pickle


【解决方案1】:

我会这样做:

  1. 确保模型的批量大小足够小,以使输入数据和模型参数适合内存。
  2. 将图像保存为磁盘上的图像。将非图像数据保存为 Parquet、CSV 或其他格式(不要为此使用 Pickle)。将图像文件名放入表格中。
  3. 将数据保存在磁盘上,不要全部加载到内存中。
  4. 将非图像数据加载为常规数据框。仅当 SGD 中的批处理需要时才从磁盘加载图像。

【讨论】:

  • 好的,谢谢!我想知道如何在不将图像与其他数据合并的情况下将训练与测试数据分开,因为测试和训练数据存储在同一个文件夹中。在其他数据中,说明了哪些数据是训练数据,哪些是测试数据。
  • 数据框应该说明每条记录使用哪个图像文件,所以只要您有两个不同的数据框用于训练和测试,将所有图像保留在一个目录。
  • 好的,这意味着您将用 cloumn image_names 替换列图像,对吗?为此,我可以将 imagenames_list 的项目与所有其他数据(image_path、track_id 等)一起放入表中?将图像存储到磁盘并仅批量使用它们时,我仍然遇到一些麻烦..
  • @Tobitor 类似的东西,是的。我没有使用过 Google Colab,因此我无法评论让这种配置在该环境中工作是否存在特定困难。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多