如何处理含图像名称、路径字段的CSV乐器图像分类数据集
数据集加载方案选择
优先选直接遍历train、test文件夹读取图像的方案,理由很实在:
- 这个数据集的目录结构是业界通用的分类数据集格式:根目录下按类别名建子文件夹,同类别图像全放在对应子目录里,PyTorch、Keras等主流框架都有现成的加载接口直接适配,不用自己写标签对齐、路径匹配的代码,对初学者来说出错概率极低。
- 配套的CSV文件本质是平台生成的文件索引,最常见的问题是里面存的是Kaggle在线环境的绝对路径,你把数据集下到本地、或者换到别的运行环境,路径直接失效,还要手动批量替换路径前缀,平白多了工作量。
- 只有两种情况需要用到CSV:一是你要做的任务不是基础图像分类,需要用到CSV里额外的标注信息(比如乐器年代、材质这类文件夹名不包含的字段);二是你抽几行核对后发现,官方的train/test划分和文件夹结构不一致,明确要求以CSV划分为准。这类公开分类数据集绝大多数情况下CSV内容和文件夹结构是完全对应的,没必要绕路用CSV加载。
遍历子文件夹读取图像的实现方法
分两种场景选方法就行:
用框架做训练的懒人方案
如果是用PyTorch/TensorFlow做模型训练,根本不用自己写遍历逻辑,直接调用框架内置的目录加载接口即可,以PyTorch为例:
from torchvision import datasets from torchvision.transforms import ToTensor # 传入train文件夹根路径,自动遍历所有子文件夹,将文件夹名映射为类别标签 train_dataset = datasets.ImageFolder( root="./train", # 替换成你本地的train文件夹实际路径 transform=ToTensor() ) # 打印类别和索引的映射关系,确认加载结果正确 print("类别对应索引:", train_dataset.class_to_idx)
测试集用同样的方法传入test根路径即可,接口会自动处理子文件夹遍历、标签匹配的逻辑。
自定义遍历逻辑的实现
如果需要自己控制遍历过程,用Python自带的pathlib模块写最简洁,还能避免不同操作系统的路径拼接错误,参考代码:
from pathlib import Path from PIL import Image # 定义支持的图像格式后缀,过滤系统隐藏文件、非图像文件 VALID_IMAGE_EXTS = (".jpg", ".jpeg", ".png", ".bmp") def load_dataset_from_dir(root_dir): root = Path(root_dir) images = [] labels = [] # 递归遍历根目录下所有层级的文件 for file in root.rglob("*"): if file.is_file() and file.suffix.lower() in VALID_IMAGE_EXTS: # 图像所在的直接上级文件夹名就是类别标签 current_label = file.parent.name # 读取图像,统一转成RGB格式避免通道数报错 current_img = Image.open(file).convert("RGB") images.append(current_img) labels.append(current_label) return images, labels # 调用示例 train_imgs, train_labels = load_dataset_from_dir("./train") test_imgs, test_labels = load_dataset_from_dir("./test")
小提示:遍历的时候一定要加文件后缀判断,不然会把目录里的.DS_Store、说明txt这类非图像文件读进去,触发图像解析报错。
内容的提问来源于stack exchange,提问作者Malhar Khairnar
相关产品推荐
相关产品推荐

