基于FER2013数据集:Python实现一维像素数组转图像并分类存储
完整实现FER2013数据集像素转图像并按Usage分类存储的Python代码
我来帮你补全并优化FER2013数据集的图像转换与分类存储代码,下面是完整的实现方案,附带详细说明:
完整代码
import pandas as pd import numpy as np from PIL import Image import os # 读取FER2013数据集的CSV文件 # 替换成你的CSV文件实际路径,比如 './fer2013.csv' 或者绝对路径 df = pd.read_csv('fer2013.csv') # 创建对应Usage的目标文件夹,若文件夹已存在则跳过创建 usage_folders = ['training', 'PrivateTest', 'PublicTest'] for folder in usage_folders: os.makedirs(folder, exist_ok=True) # 遍历每一行数据,完成像素转图像并分类保存 for idx, row in df.iterrows(): # 提取当前行的关键信息 emotion_label = row['emotion'] pixel_str = row['pixels'] usage_category = row['Usage'] # 将空格分隔的像素字符串转换为48×48的灰度图像数组 pixel_array = np.array(pixel_str.split(), dtype=np.uint8).reshape(48, 48) # 基于数组创建PIL灰度图像(mode='L'代表8位单通道灰度) img = Image.fromarray(pixel_array, mode='L') # 生成唯一的文件名:索引_情感标签.png,避免文件重名覆盖 img_filename = f"{idx}_{emotion_label}.png" # 拼接最终的保存路径 save_path = os.path.join(usage_category, img_filename) # 保存图像到对应文件夹 img.save(save_path) # 可选:每处理1000张图像打印一次进度,方便跟踪处理状态 if idx % 1000 == 0: print(f"已完成 {idx} 张图像的处理与保存") print("所有图像处理完成!已按Usage分类存入对应文件夹")
关键代码解释
- 像素数据转换:
pixel_str.split()将CSV中用空格分隔的像素字符串拆分为单个像素值的列表,再转换为uint8类型的numpy数组(符合图像像素的0-255取值范围),最后reshape(48,48)还原为数据集规定的图像尺寸。 - 图像对象创建:使用
Image.fromarray基于numpy数组创建灰度图像,mode='L'参数指定图像为8位单通道灰度模式,匹配FER2013的图像属性。 - 文件夹与文件处理:
os.makedirs(folder, exist_ok=True)确保目标文件夹存在,避免因文件夹已存在而抛出异常;- 用
索引_情感标签作为文件名,保证每个图像文件唯一,防止不同数据行的图像被意外覆盖。
注意事项
- 依赖安装:如果还没安装所需的库,执行以下命令安装:
pip install pandas numpy pillow - 文件路径:务必将代码中的
'fer2013.csv'替换为你本地数据集的实际路径(相对路径或绝对路径均可)。 - 处理时间:FER2013数据集共有35887张图像,整个处理过程可能需要3-5分钟,具体时间取决于你的机器性能。
内容的提问来源于stack exchange,提问作者Shristee
相关产品推荐
相关产品推荐

