python获取一个文件夹中的数据集(Dataset)

该博客介绍了如何在Python中利用torch.utils.data.Dataset类来创建自定义数据集。通过实例化MyData类,分别加载ants_image和bees_image目录下的图片数据,实现了对图片路径的管理。这段代码为后续的深度学习模型训练准备了数据。
部署运行你感兴趣的模型镜像

首先定义一个类继承Dataset类

from torch.utils.data import Dataset
import os
from PIL import Image

class MyData(Dataset):

    def __init__(self, root_dir, label_dir):
        self.root_dir = root_dir
        self.label_dir = label_dir
        self.path = os.path.join(root_dir, label_dir)
        self.img_path = os.listdir(self.path)

    def __getitem__(self, idx):
        img_name = self.img_path[idx]
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        img = Image.open(img_item_path)
        label = self.label_dir
        return img, label

    def __len__(self):
        return len(self.img_path)

然后实例化类

root_dir = 'dataset/train'
ants_label_dir = 'ants_image'
bees_label_dir = 'bees_image'
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)

从pycharm的控制台先跑一下,可以看看实例化的对象里面都有什么属性:
在这里插入图片描述
可以看到,我们已经从给出的路径中提取到了我们想要的文件,即保存图片路径的一个集合,我们就可以再对获取到的dataset进行操作了。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮用户解决如何用Python从指定文件夹x加载自定义数据集,替换原来的fetch_lfw_people数据集的问题。用户之前已经提供了一些代码和引用,我需要综合这些信息来给出合适的解决方案。 首先,用户的需求是替换数据集加载部分,保持其余代码不变。用户提供的示例代码中使用了fetch_lfw_people,现在需要改成从x文件夹加载自己的数据。我需要确保新代码的输出结构与原函数一致,以便后续的模型训练和处理不需要修改。 回顾之前的对话,用户已经给出了一个自定义加载函数load_custom_faces,这个函数使用load_files来读取数据,处理图像,并返回Bunch对象。现在需要确认这个函数是否满足当前需求,或者是否需要调整。 用户提供的引用中,提到了fetch_lfw_people的参数,比如data_home和download_if_missing,但用户现在不需要下载数据,而是从本地加载,所以这些参数可能不相关。但需要注意数据集的目录结构是否符合要求,每个子文件夹对应一个人物,图像命名规范等。 另外,引用3提到下载PIL(实际应为Pillow)来处理图像,所以需要确保用户安装了Pillow库,并在代码中使用了Image模块。用户的代码中已经导入了from PIL import Image,这一点是正确的。 接下来,我需要检查用户提供的load_custom_faces函数是否存在问题。例如,是否处理了图像大小调整,是否转换为灰度图,数据结构是否正确。原fetch_lfw_people返回的图像尺寸是62x47,用户代码中通过resize_ratio调整大小,可能需要确认resize后的尺寸是否匹配目标尺寸target_size=(62,47)。但原代码中的resize_ratio是0.7,是否会导致最终尺寸不符?可能需要调整resize的方法,直接resize到目标尺寸,而不是按比例缩放。 例如,原代码中的resize_ratio可能用于将原图缩小到62x47,但如果用户的自定义图像尺寸不一,直接按比例缩放可能无法得到正确尺寸。因此,正确的做法应该是将每张图像调整到固定的target_size,比如62x47,而不是按比例缩放。用户之前的代码中使用的是resize_ratio,这可能有问题,应该改为直接resize到目标尺寸。 所以,需要修改图像处理部分,使用img.resize(target_size)而不是按比例缩放。这样确保所有图像都被调整为相同的尺寸,与原数据集一致。 另外,需要处理可能的异常,比如损坏的文件,用户代码中已经包含try-except块来跳过损坏文件,这一点是正确的。 数据结构方面,返回的Bunch对象需要包含data(展平后的特征向量)、images(原始图像数组)、target(标签数组)、target_names(类别名称数组)。用户代码中使用的是dataset.target_names,但load_files返回的target_names是根据文件夹名字自动生成的,这部分是否正确?需要确认load_files是否能正确读取子文件夹结构,并将每个子文件夹作为一个类别。 此外,原fetch_lfw_people的数据结构中的images是三维数组(样本数x高x宽),而用户的代码中将images保存为np.array(images),是否正确?需要确保每个图像处理后是二维的(灰度图),因此images数组应该是三维的(样本数,高,宽)。 最后,需要验证加载后的数据集是否符合要求,比如打印images的形状,检查是否与原来的62x47一致,以及标签是否正确对应。 总结需要修改的部分: 1. 图像resize方法:改为直接调整到目标尺寸,而不是按比例缩放。 2. 确保数据结构与原函数一致,特别是images的维度和尺寸。 3. 添加必要的注释和参数说明,比如target_size应设置为(62,47)以匹配原数据集。 4. 提供使用示例和验证步骤,确保用户能正确应用。 现在,根据这些思考,编写解决方案的步骤,确保代码正确,结构清晰,并回答用户的问题。</think>#### 分步实现自定义数据集加载(基于历史方案优化) --- ### 一、完整代码实现(支持多尺寸图像自动处理) ```python import numpy as np from PIL import Image from sklearn.datasets import load_files from sklearn.utils import Bunch def load_custom_dataset(data_path, target_size=(62,47)): """ 加载自定义人脸数据集 参数说明: data_path: 数据集根目录路径(需包含子文件夹) target_size: 输出图像尺寸(高度,宽度),与原数据集保持一致 """ # 加载原始文件结构 dataset = load_files(data_path, shuffle=False, description="自定义人脸数据集加载") # 初始化数据结构 images = [] target = [] target_names = np.array(sorted(dataset.target_names)) # 处理每张图片 for i, filename in enumerate(dataset.filenames): try: with Image.open(filename) as img: # 统一处理流程 img_gray = img.convert('L') # 灰度化 img_resized = img_gray.resize(target_size[::-1]) # 调整尺寸(width,height) images.append(np.asarray(img_resized, dtype=np.float32)) target.append(dataset.target[i]) except Exception as e: print(f"跳过异常文件 {filename}: {str(e)}") # 构建兼容数据结构 return Bunch( data=np.array([img.flatten() for img in images]), images=np.array(images), target=np.array(target), target_names=target_names ) # 使用示例 faces = load_custom_dataset("x/") # 替换为您的路径 ``` --- ### 二、关键改进说明 1. **尺寸标准化处理** - 新增`target_size=(62,47)`参数强制统一输出尺寸[^1] - 使用`img.resize(target_size[::-1])`确保与原始LFW数据集尺寸一致 - 处理流程: ```mermaid graph TD 原始图像 --> 灰度化 --> 尺寸标准化 --> 转换为numpy数组 ``` 2. **异常处理优化** - 使用上下文管理器`with`确保文件正确关闭 - 捕获所有异常类型并输出详细信息 3. **数据结构验证** ```python print(f"特征维度: {faces.data.shape}") # 应输出(n_samples, 62*47) print(f"图像尺寸: {faces.images[0].shape}") # 应输出(62,47) print(f"类别标签: {faces.target_names}") # 显示所有人物名称 ``` --- ### 三、与原代码对接方式 1. **替换数据加载部分** ```python # 原始代码 # faces = fetch_lfw_people(min_faces_per_person=60) # 替换为 faces = load_custom_dataset("x/") ``` 2. **保持后续处理不变** ```python # 原有代码无需修改 Xtrain, Xtest, ytrain, ytest = train_test_split(faces.data, faces.target) model = make_pipeline(PCA(n_components=150), SVC()) # ...后续训练评估代码 ``` --- ### 四、常见问题解决方案 **问题1:图像尺寸不一致警告** ```python # 检查目标尺寸设置 assert faces.images[0].shape == (62,47), "尺寸不匹配请检查resize逻辑" ``` **问题2:类别标签错乱** ```python # 验证标签对应关系 for name in np.unique(faces.target_names): sample_idx = np.where(faces.target == np.where(faces.target_names==name)[0][0])[0][0] plt.title(name) plt.imshow(faces.images[sample_idx]) plt.show() ``` --- ### 五、扩展应用场景 此方案还可用于: 1. 医疗影像分类(需修改`target_size`) 2. 工业质检图像处理 3. 手写体识别任务 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值