使用Numpy构建人脸识别CNN时npz文件无法保存内容的问题
问题分析
你的代码存在几个核心错误:
- 根本没读取图像文件:你只是把文件夹路径字符串赋值给
image变量,np.savez存的是这个字符串,不是实际的图像数据。npz是用来存储numpy数组的,直接存字符串不会生成有效的图像数组,所以查看器里看不到有效内容。 - 误解了npz的用途:npz不是文件夹打包工具,它只能存储numpy数组对象,没法直接保存整个文件夹或zip文件。
- np.load用法错误:
np.load是加载npz文件里的数组,不能直接加载文件夹,自然会触发权限错误。
正确操作步骤
要把多文件夹里的图像存入npz,得先遍历文件夹读取所有图像、转成numpy数组,再保存:
步骤1:遍历文件夹读取图像
用os模块遍历文件夹,搭配PIL或OpenCV读取图像并转为numpy数组,同时记录人脸标签(比如用子文件夹名当标签)。示例代码(用PIL):
import os import numpy as np from PIL import Image # 注意Windows路径用双反斜杠,或者原始字符串r"D:\project\Images" image_dir = "D:\\project\\Images" images = [] labels = [] # 遍历每个子文件夹(假设子文件夹名就是人脸标签) for label_name in os.listdir(image_dir): label_path = os.path.join(image_dir, label_name) if not os.path.isdir(label_path): continue # 跳过非文件夹的文件 # 遍历子文件夹里的所有图像 for img_name in os.listdir(label_path): img_path = os.path.join(label_path, img_name) try: # 读取图像、转RGB格式、统一尺寸(CNN要求固定输入尺寸) img = Image.open(img_path).convert("RGB") img = img.resize((128, 128)) # 尺寸根据你的CNN需求调整 img_array = np.array(img) images.append(img_array) labels.append(label_name) # 也可以转成数字标签方便后续训练 except Exception as e: print(f"读取失败 {img_path}: {e}") # 把列表转成numpy数组 images_np = np.array(images) labels_np = np.array(labels)
步骤2:保存到npz文件
用np.savez存储时要指定键值对,这样读取时能通过键获取对应数据:
np.savez("Test_Images.npz", images=images_np, labels=labels_np)
步骤3:读取npz文件
读取时通过对应的键提取数组:
data = np.load("Test_Images.npz") images_loaded = data["images"] labels_loaded = data["labels"] print(f"加载到 {len(images_loaded)} 张图像") print(f"标签示例: {labels_loaded[:5]}")
额外注意事项
- 图像尺寸必须统一:CNN要求输入尺寸一致,所以读取时一定要resize到相同大小。
- 内存限制:如果图像数量多、尺寸大,可能会占满内存,这时可以考虑分批次处理,或者用HDF5格式(h5py库)存储大数据。
- 路径转义:Windows路径里的反斜杠要写成
\\,或者用原始字符串r"路径",避免转义错误。
内容的提问来源于stack exchange,提问作者MxuezhiM
相关产品推荐
相关产品推荐

