You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ImageFolder加载自定义数据集遇FileNotFoundError问题求助

问题描述

我的自定义数据集目录结构如下:

folder
│     
│
└--train
    └──class1
    |         │   file011
    |         │   file012
    |
    |
    └──class2
          │   file021
          │   file022

└--val
    └──class1
    |         │   file011
    |         │   file012
    |
    |
    └──class2
          │   file021
          │   file022

使用以下代码加载数据集时:

data_dir = r'PATH_TO_DATA/train'

dataset = datasets.ImageFolder(data_dir, ...)

触发错误:

FileNotFoundError: Found no valid file for the classes Cat, Deer, Dog, Human. Supported extensions are: .jpg, .jpeg, .png, .ppm, .bmp, .pgm, .tif, .tiff, .webp

我排查过类似问题,但那个案例是.ipynb_checkpoints文件导致的,我的情况不是。已经检查过隐藏文件,确认所有文件扩展名都符合要求。

补充:我用Rclone挂载了OneDrive存储数据,直接访问文件能正常读取,推测是ImageFolder通过远程挂载访问数据时出了问题。


解决方案

针对Rclone挂载远程存储导致ImageFolder无法识别文件的问题,可尝试以下方法:

  • 调整Rclone挂载参数
    Rclone默认挂载模式下,文件元数据的读取逻辑可能和PyTorch的ImageFolder不兼容。重新挂载时添加缓存参数,让本地缓存远程文件的元数据:

    rclone mount onedrive:your-target-folder /local/mount-path --vfs-cache-mode writes
    

    该参数会优化文件元数据的读取流程,解决ImageFolder遍历目录时无法识别文件的问题。

  • 自定义数据集类替代ImageFolder
    手动实现文件遍历和加载逻辑,绕开ImageFolder依赖的底层文件系统遍历:

    from torch.utils.data import Dataset
    from PIL import Image
    import os
    
    class RemoteImageDataset(Dataset):
        def __init__(self, root_dir, transform=None):
            self.root_dir = root_dir
            self.transform = transform
            self.image_paths = []
            self.labels = []
            
            # 手动遍历分类目录
            class_names = [name for name in sorted(os.listdir(root_dir)) if os.path.isdir(os.path.join(root_dir, name))]
            self.class_to_idx = {name: idx for idx, name in enumerate(class_names)}
            
            for class_name in class_names:
                class_dir = os.path.join(root_dir, class_name)
                # 手动校验文件扩展名
                for file in os.listdir(class_dir):
                    if file.lower().endswith(('.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif', '.tiff', '.webp')):
                        self.image_paths.append(os.path.join(class_dir, file))
                        self.labels.append(self.class_to_idx[class_name])
    
        def __len__(self):
            return len(self.image_paths)
    
        def __getitem__(self, idx):
            img = Image.open(self.image_paths[idx]).convert('RGB')
            label = self.labels[idx]
            if self.transform:
                img = self.transform(img)
            return img, label
    
    # 使用自定义数据集
    dataset = RemoteImageDataset(data_dir, transform=...)
    
  • 校验挂载路径与权限
    确认代码中的PATH_TO_DATA是Rclone挂载后的本地路径,无拼写错误;同时确保当前用户对挂载目录拥有完整的读写权限。


内容的提问来源于stack exchange,提问作者Manu Dwivedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:50:32