torchvision.datasets.ImageFolder()加载图片报错[Errno 20] Not a directory求助
问题根因
- 报错核心是
torchvision.datasets.ImageFolder的root参数要求传入文件夹路径,但你实际运行时传入的是单张图片路径/Users/___/Desktop/stylegan/images/anonym.4.jpg,系统扫描路径时发现目标是文件不是文件夹,因此抛出NotADirectoryError。 - PIL的
Image.open本身接受单张图片路径作为输入,和ImageFolder的参数要求完全不同,因此测试单张路径可读取不代表符合数据集加载工具的要求。 - 你贴出的代码和实际运行的代码存在不一致:你贴出的代码中
root赋值为/Users/____/Desktop/stylegan/images,但报错堆栈显示实际运行时root被赋值为单张图片路径,优先排查是否修改代码后未保存、或运行的是历史版本脚本。
解决步骤
方案1:调整目录结构适配ImageFolder
ImageFolder要求数据集必须按「分类子文件夹」的结构存放,格式如下:
<root目录> ├── 类别1文件夹 │ ├── 图片1.jpg │ ├── 图片2.jpg │ └── ... ├── 类别2文件夹 │ ├── 图片1.jpg │ ├── 图片2.jpg │ └── ... └── ...
如果所有图片属于同一类别,在/Users/____/Desktop/stylegan/images下新建一个子文件夹(比如命名为default_class),把所有图片移动到这个子文件夹内即可。
方案2:无需分类子文件夹的替代加载方式
如果不想调整目录结构,可以直接自定义简单的数据集类加载图片,示例代码如下:
import os from PIL import Image from torch.utils.data import Dataset class CustomImageDataset(Dataset): def __init__(self, img_dir, transform=None): self.img_dir = img_dir self.transform = transform self.img_paths = [os.path.join(img_dir, f) for f in os.listdir(img_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg'))] def __len__(self): return len(self.img_paths) def __getitem__(self, idx): img_path = self.img_paths[idx] image = Image.open(img_path).convert("RGB") if self.transform: image = self.transform(image) # 单类别默认返回标签0,多类别可自行调整逻辑 return image, 0 # 调用方式 train_ds = CustomImageDataset(img_dir="/Users/____/Desktop/stylegan/images", transform=transform_ds)
内容的提问来源于stack exchange,提问作者aidan.goetzinger
相关产品推荐
相关产品推荐

