首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Python】数据集随机划分为训练集、测试集、验证集(图像和标签)

  • 25-04-25 01:21
  • 4235
  • 6030
blog.csdn.net

如下图红框处为源数据集的图片和标签样本文件夹路径,替换为你的即可

红框下面的两个路径替换为你的即可会自动生成文件夹,并在这俩个文件夹里自动生成多个文件夹为随机划分为训练集、测试集、验证集的图像和标签

如下完整程序:

  1. import random
  2. import shutil
  3. import os
  4. import logging
  5. # 配置日志
  6. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  7. def list_files_in_directory(directory):
  8. """
  9. 获取指定目录下的所有文件列表
  10. """
  11. return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
  12. def create_directory(directory):
  13. """
  14. 创建目录,如果目录已存在则不进行任何操作
  15. """
  16. if not os.path.exists(directory):
  17. os.makedirs(directory)
  18. def copy_files(file_list, source_label_path, source_img_path, target_label_path, target_img_path, sub_dir):
  19. """
  20. 复制文件到目标目录
  21. """
  22. target_label_dir = os.path.join(target_label_path, sub_dir)
  23. target_img_dir = os.path.join(target_img_path, sub_dir)
  24. create_directory(target_label_dir)
  25. create_directory(target_img_dir)
  26. for label_name in file_list:
  27. label_file_pre = label_name.split('.')[0]
  28. img_file_name = f'{label_file_pre}.jpg'
  29. try:
  30. shutil.copyfile(os.path.join(source_label_path, label_name), os.path.join(target_label_dir, label_name))
  31. shutil.copyfile(os.path.join(source_img_path, img_file_name), os.path.join(target_img_dir, img_file_name))
  32. except FileNotFoundError as e:
  33. logging.error(f'文件未找到: {e}')
  34. except PermissionError as e:
  35. logging.error(f'权限不足: {e}')
  36. except Exception as e:
  37. logging.error(f'复制文件时出现错误: {e}')
  38. def split_dataset(labels_file_path, img_file_path, target_labels_file_path, target_img_path, train_ratio, val_ratio,
  39. test_ratio):
  40. """
  41. 划分数据集并复制文件
  42. """
  43. if train_ratio + val_ratio + test_ratio!= 1:
  44. raise ValueError('训练集、验证集和测试集比例之和必须为1')
  45. label_file_list = list_files_in_directory(labels_file_path)
  46. random.shuffle(label_file_list)
  47. train_data_size = int(len(label_file_list) * train_ratio)
  48. val_data_size = int(len(label_file_list) * val_ratio)
  49. test_data_size = len(label_file_list) - train_data_size - val_data_size
  50. train_list = label_file_list[:train_data_size]
  51. val_list = label_file_list[train_data_size: train_data_size + val_data_size]
  52. test_list = label_file_list[train_data_size + val_data_size:]
  53. copy_files(train_list, labels_file_path, img_file_path, target_labels_file_path, target_img_path, 'train')
  54. copy_files(val_list, labels_file_path, img_file_path, target_labels_file_path, target_img_path, 'val')
  55. copy_files(test_list, labels_file_path, img_file_path, target_labels_file_path, target_img_path, 'test')
  56. logging.info('数据集划分和文件复制完成')
  57. if __name__ == "__main__":
  58. labels_file_path = r'D:\lenovo\Archie\datasets\labels'
  59. img_file_path = r'D:\lenovo\Archie\datasets\images'
  60. target_labels_file_path = r'D:\lenovo\Archie\data\labels'
  61. target_img_path = r'D:\lenovo\Archie\data\imgs'
  62. train_ratio = 0.8
  63. val_ratio = 0.1
  64. test_ratio = 0.1
  65. split_dataset(labels_file_path, img_file_path, target_labels_file_path, target_img_path, train_ratio, val_ratio,
  66. test_ratio)

这是一个用 Python 编写的程序,主要功能是将一个数据集按照指定的比例划分为训练集、验证集和测试集,并将相应的文件复制到目标目录中。以下是对该程序的详细解读:

导入必要的库:

  1. import random
  2. import shutil
  3. import os
  4. import logging
  • random:用于生成随机数,在打乱文件列表时会用到。
  • shutil:提供了高级的文件操作功能,如复制文件和目录。
  • os:提供了与操作系统交互的功能,如文件和目录操作。
  • logging:用于记录程序运行过程中的日志信息。

配置日志:

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

  • logging.basicConfig:配置日志的基本设置。
  • level=logging.INFO:设置日志级别为 INFO,这意味着程序会记录 INFO 及以上级别的日志信息(如 INFO、WARNING、ERROR 等)。
  • format='%(asctime)s - %(levelname)s - %(message)s':设置日志的格式,包括时间、日志级别和日志信息。

定义函数list_files_in_directory:

  1. def list_files_in_directory(directory):
  2. """
  3. 获取指定目录下的所有文件列表
  4. """
  5. return [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]

  • 该函数接受一个目录路径作为参数。
  • 使用列表推导式遍历目录中的所有条目,通过os.path.isfile判断是否为文件,将所有文件添加到列表中并返回。

定义函数create_directory:

  1. def create_directory(directory):
  2. """
  3. 创建目录,如果目录已存在则不进行任何操作
  4. """
  5. if not os.path.exists(directory):
  6. os.makedirs(directory)

  • 该函数接受一个目录路径作为参数。
  • 使用os.path.exists检查目录是否存在,如果不存在,则使用os.makedirs创建目录。

定义函数copy_files:

  1. def copy_files(file_list, source_label_path, source_img_path, target_label_path, target_img_path, sub_dir):
  2. """
  3. 复制文件到目标目录
  4. """
  5. target_label_dir = os.path.join(target_label_path, sub_dir)
  6. target_img_dir = os.path.join(target_img_path, sub_dir)
  7. create_directory(target_label_dir)
  8. create_directory(target_img_dir)
  9. for label_name in file_list:
  10. label_file_pre = label_name.split('.')[0]
  11. img_file_name = f'{label_file_pre}.jpg'
  12. try:
  13. shutil.copyfile(os.path.join(source_label_path, label_name), os.path.join(target_label_dir, label_name))
  14. shutil.copyfile(os.path.join(source_img_path, img_file_name), os.path.join(target_img_dir, img_file_name))
  15. except FileNotFoundError as e:
  16. logging.error(f'文件未找到: {e}')
  17. except PermissionError as e:
  18. logging.error(f'权限不足: {e}')
  19. except Exception as e:
  20. logging.error(f'复制文件时出现错误: {e}')

  • 该函数接受文件列表、源标签路径、源图像路径、目标标签路径、目标图像路径和子目录名称作为参数。
  • 首先,使用os.path.join构建目标标签目录和目标图像目录的路径。
  • 调用create_directory函数创建目标目录(如果不存在)。
  • 遍历文件列表,提取标签文件的前缀,构建对应的图像文件名。
  • 使用shutil.copyfile将标签文件和图像文件从源路径复制到目标路径。
  • 使用try - except块捕获可能的异常,如文件未找到、权限不足等,并记录相应的错误日志。

定义函数split_dataset:

  1. def split_dataset(labels_file_path, img_file_path, target_labels_file_path, target_img_path, train_ratio, val_ratio,
  2. test_ratio):
  3. """
  4. 划分数据集并复制文件
  5. """
  6. if train_ratio + val_ratio + test_ratio!= 1:
  7. raise ValueError('训练集、验证集和测试集比例之和必须为1')
  8. label_file_list = list_files_in_directory(labels_file_path)
  9. random.shuffle(label_file_list)
  10. train_data_size = int(len(label_file_list) * train_ratio)
  11. val_data_size = int(len(label_file_list) * val_ratio)
  12. test_data_size = len(label_file_list) - train_data_size - val_data_size
  13. train_list = label_file_list[:train_data_size]
  14. val_list = label_file_list[train_data_size: train_data_size + val_data_size]
  15. test_list = label_file_list[train_data_size + val_data_size:]
  16. copy_files(train_list, labels_file_path, img_file_path, target_labels_file_path, target_img_path, 'train')
  17. copy_files(val_list, labels_file_path, img_file_path, target_labels_file_path, target_img_path, 'val')
  18. copy_files(test_list, labels_file_path, img_file_path, target_labels_file_path, target_img_path, 'test')
  19. logging.info('数据集划分和文件复制完成')

  • 该函数接受源标签文件路径、源图像文件路径、目标标签文件路径、目标图像文件路径、训练集比例、验证集比例和测试集比例作为参数。
  • 首先检查训练集、验证集和测试集比例之和是否为 1,如果不是,则抛出ValueError异常。
  • 使用list_files_in_directory获取源标签文件路径下的所有标签文件列表。
  • 使用random.shuffle打乱文件列表的顺序。
  • 根据比例计算训练集、验证集和测试集的文件数量。
  • 分割文件列表为训练集、验证集和测试集的子列表。
  • 调用copy_files函数将三个子列表中的文件分别复制到对应的目标目录中(train、val、test)。
  • 记录 INFO 级别的日志信息,表示数据集划分和文件复制完成。

主程序部分:

  1. if __name__ == "__main__":
  2. labels_file_path = r'D:\lenovo\Archie\datasets\labels'
  3. img_file_path = r'D:\lenovo\Archie\datasets\images'
  4. target_labels_file_path = r'D:\lenovo\Archie\data\labels'
  5. target_img_path = r'D:\lenovo\Archie\data\imgs'
  6. train_ratio = 0.8
  7. val_ratio = 0.1
  8. test_ratio = 0.1
  9. split_dataset(labels_file_path, img_file_path, target_labels_file_path, target_img_path, train_ratio, val_ratio,
  10. test_ratio)

  • 设置源标签文件路径、源图像文件路径、目标标签文件路径、目标图像文件路径、训练集比例、验证集比例和测试集比例。
  • 调用split_dataset函数进行数据集划分和文件复制。

这个程序的主要目的是将一个数据集按照指定的比例划分为训练集、验证集和测试集,并将相应的文件复制到目标目录中,同时记录操作过程中的日志信息。

阿齐Archie
微信公众号
技术支持 | 项目定做 | 与我联系
注:本文转载自blog.csdn.net的阿齐Archie的文章"https://blog.csdn.net/m0_61712829/article/details/144803222"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

108
Python
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top