python - 读取和保存图像的内存和速度更高效的方式?
问题描述
我正在训练一个神经网络。因此,我使用下面的代码读取了 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()
由于图像数量巨大,我有一个相对较大的泡菜文件(3GB)。正因为如此,读取该文件需要一些时间,并且还需要大量内存。此外,当我准备在 Google Colab 中训练网络时,恰巧 Colab 因为数据量大而崩溃。
因此,是否有更有效的方法 1. 读取数据和 2. 存储数据帧?
谢谢!
解决方案
我会做这样的事情:
- 确保模型的批量大小足够小,以使输入数据和模型参数适合内存。
- 将图像保存为磁盘上的图像。将非图像数据保存为 Parquet、CSV 或其他格式(不要为此使用 Pickle)。将图像文件名放在表中。
- 将数据保存在磁盘上,不要将其全部加载到内存中。
- 将非图像数据加载为常规数据框。仅当 SGD 中的批处理需要时才从磁盘加载图像。
推荐阅读
- c# - 如何将焦点放在文本框或该表单中的任何其他控件中的最前面
- python - Azure Devops 和 Python 的集成以通过自动化脚本的测试结果并在 Azure Devops 中更新?
- shell - 用 n 个空格替换一个模式
- sql-server - 有没有办法让 SQL Server 自动规范化重复的字符串?
- android-studio - 如何解决此错误?> 任务:app:installDebug 失败
- java - 为什么无法解析符号 TransactionWriteRequest 或 TransactionLoadRequest?
- amazon-web-services - 尝试从私有 ECR 中提取图像时出现“没有基本身份验证凭据”
- regex - 如何在 RegEx 中选择某些数字?
- c# - 如何防止用户输入错误的时间格式(客户端)
- android - 提供 ssl 证书错误的 URL 启动器