如何用Python将EMNIST的CSV逐行转为分类存储的PNG文件?
解决方案
下面是将EMNIST CSV格式数据集转换为指定目录结构PNG文件的Python实现方案,包含完整代码和关键细节说明:
第一步:安装依赖库
首先安装处理所需的工具库:
pip install pandas numpy pillow
第二步:完整转换代码
import os import pandas as pd import numpy as np from PIL import Image def convert_emnist_csv_to_png(csv_path, output_root, dataset_type): # 创建根目录结构:{输出根目录} > {数据集名称} > {训练集/测试集} dataset_name = "EMNIST" base_output_dir = os.path.join(output_root, dataset_name, dataset_type) os.makedirs(base_output_dir, exist_ok=True) # 分块读取CSV(避免大文件占满内存) chunk_size = 1000 for chunk_idx, chunk in enumerate(pd.read_csv(csv_path, chunksize=chunk_size)): for row_idx, row in chunk.iterrows(): # 提取类别标签和像素数据 class_label = str(row.iloc[0]) pixels = row.iloc[1:].values.reshape(28, 28) # 关键:EMNIST的像素存储是转置的,需要调整方向才能得到正确图像 pixels = np.transpose(pixels) # 创建类别文件夹 class_dir = os.path.join(base_output_dir, class_label) os.makedirs(class_dir, exist_ok=True) # 生成唯一文件名(避免重复) filename = f"img_{chunk_idx}_{row_idx}.png" img_path = os.path.join(class_dir, filename) # 转换为Image对象并保存 img = Image.fromarray(pixels.astype(np.uint8)) img.save(img_path) print(f"处理完第 {chunk_idx+1} 块数据") # 配置参数 # 替换为你的CSV文件路径和输出根目录 train_csv_path = "emnist-balanced-train.csv" test_csv_path = "emnist-balanced-test.csv" output_root = "./" # 程序目录,可根据需要修改 # 处理训练集 convert_emnist_csv_to_png(train_csv_path, output_root, "训练集") # 处理测试集 convert_emnist_csv_to_png(test_csv_path, output_root, "测试集")
关键细节说明
- 分块读取CSV:EMNIST数据集CSV文件较大,使用分块读取可以避免内存溢出,
chunk_size可根据你的内存情况调整。 - 图像方向修正:EMNIST的CSV像素数据是按列存储的,直接reshape会得到旋转90度的图像,所以需要用
np.transpose转置修正方向。 - 目录自动创建:使用
os.makedirs(..., exist_ok=True)确保目录不存在时自动创建,存在时不会报错。 - 文件名唯一性:通过块索引+行索引生成文件名,避免不同块中相同行索引导致的文件名冲突。
内容的提问来源于stack exchange,提问作者BartJesper
相关产品推荐
相关产品推荐

