下载数据集用于图像分类并自动分为训练集和测试集方法
下面代码的目的是为图像分类任务生成训练集和测试集的标签文件。具体来说:
自动创建标签文件:根据输入的根目录和数据集类型(如"train"或"test"),在指定位置生成对应的文本文件(如
train.txt
)。构建图片与标签的映射关系:通过遍历目录结构,将每个图片的完整路径与其所属类别建立对应关系。类别标签由父目录的子目录顺序决定(第一个子目录为0,第二个为1,依此类推)。
格式输出:将结果写入文本文件,每行格式为
<图片路径> <标签>
(例如:"八宝粥/image1.jpg 0"),便于后续用于机器学习模型的训练数据加载。
代码实现:
import os # 导入操作系统相关模块,用于路径操作def train_test_file(root, dir): # 定义生成标签文件的函数,接收根目录和数据集类型(train/test)file_txt = open(dir+'.txt','w') # 创建以dir命名的文本文件(如train.txt),用于写入标签path = os.path.join(root, dir) # 组合根目录和数据集类型形成完整路径(如食物分类/food_dataset/train)for roots, directories, files in os.walk(path): # 遍历指定路径下的所有目录和文件if len(directories) != 0 : # 如果当前目录有子目录(非叶子节点)dirs = directories # 保存当前目录的子目录列表else: # 如果当前目录是叶子节点(无子目录)now_dir = roots.split('\\') # 将当前目录路径按反斜杠分割成列表(如['食物分类', 'food_dataset', '八宝粥'])for file in files: # 遍历当前目录下的所有文件path_1 = os.path.join(roots, file) # 组合出完整文件路径(如食物分类/food_dataset/八宝粥/image1.jpg)print(path_1) # 打印文件路径(调试用)file_txt.write(path_1+' '+str(dirs.index(now_dir[-1]))+'\n') # 写入文件路径和对应标签# 示例:八宝粥目录的文件会被标记为0,哈密瓜为1等file_txt.close() # 关闭文件流root = r'.\食物分类\food_dataset' # 图片存储根目录(相对路径)
train_dir = 'train' # 训练集目录名
test_dir = 'test' # 测试集目录名
train_test_file(root, train_dir) # 生成训练集标签文件(train.txt)
train_test_file(root, test_dir) # 生成测试集标签文件(test.txt)
关键点说明:
路径处理
os.path.join
自动适配不同操作系统的路径分隔符(Windows用\
,Linux用/
)roots.split('\\')
将路径转换为层级列表,便于获取当前目录名称(now_dir[-1]
)
标签生成逻辑
- 当遇到叶子节点(无子目录)时,通过
dirs.index(now_dir[-1])
确定标签 dirs
是父级目录的子目录列表,索引值对应分类编号(如第一个子目录为0)
- 当遇到叶子节点(无子目录)时,通过
数据结构
- 生成的
.txt
文件每行格式:<文件路径> <标签>
(如八宝粥/image1.jpg 0
) - 标签体系基于目录层级顺序自动分配,无需手动维护映射关系
- 生成的
适用场景
- 适合图像分类任务的数据预处理,尤其适用于多类别、多子目录存储的图片数据集