使用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
相关产品推荐
相关产品推荐

