深度学习之CD数据集创建

1. 原始文件相关文件路径

  • 原始路径
    在这里插入图片描述
  • 对于label图片文件,通道需要为单通道,如果不是单通道,训练数据会报错
    • 报错信息例如:ValueError: Mask should be a 1-channel image, but recevied is a 4-channel image
  • 批量转换图片通道实现
    import os
    import PIL.Image as Image
    
    # 防止转换错误,备份,不覆盖原文件,后期再修改文件名称
    data_path = r'C:\data\label'  # 原始路径
    save_path = r'C:\data\label_copy'  # 转换保存路径
    data = os.walk(data_path)
    file_list = [file_list for path, folder_list, file_list in data][0]  # 所有图片名称文件夹
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    
    for i in file_list:
        file_name = os.path.join(data_path, i)  # 拼接绝对路径
        images_name = Image.open(file_name).convert('L')  # 转换为L,如果转换为1,训练数据时,预测不出来,图片全为黑色
        save_name = os.path.join(save_path, i)
        images_name.save(save_name)
    
    

2. 数据集创建

2.1 数据格式一

  • 相关算法数据格式
  • 与原始数据对比,多出list文件夹,list文件夹存放文文件为划分的不同类型的数据集
    在这里插入图片描述
  • 文件保存为图片名称 【注意只有名称,没有路径】
    在这里插入图片描述
  • 代码实现
    import os
    
    def create_list_dataset(start_size, end_size, types):
        """
        保存图片名称文件
    
        :param start_size:开始步长
        :param end_size: 结束步长
        :param types: 数据集文件类型
        :return:
        """
        save_path = os.path.join(save_list_path, types + '.txt')
        f = open(save_path, mode='w', encoding='utf-8')
        for i in file_list[start_size:end_size]:
            f.write(i + '\n')
        f.close()
    
    
    if __name__ == '__main__':
        root_path = r'C:\data'  # 文件根目录: A,B,label上一级目录
        label_path = os.path.join(root_path, 'label')  # 获取label路径
        save_list_path = os.path.join(root_path, 'list')  # 设置list路径
        types_dataset = ['train', 'val', 'test']
        if not os.path.exists(save_list_path):
            os.makedirs(save_list_path)
        label_path_name = os.walk(label_path)
        file_list = [file_list for path, folder_list, file_list in label_path_name][0]  # 读取图片所有文件名称
    
        # 数据集划分
        all_size, train_rate, val_rate = len(file_list), 0.7, 0.9  # 测试集,校验集比例
        train_size, val_size, test_size = int(all_size * train_rate), int(all_size * val_rate), all_size + 1
    
        # 函数调用
        create_list_dataset(0, train_size,types_dataset[0])
        create_list_dataset(train_size, val_size, types_dataset[1])
        create_list_dataset(val_size, test_size, types_dataset[2])
    
    

2.2 数据格式二

  • 相关算法数据格式

  • 将不同的数据集放在不同的文件夹里,不需要txt文件
    在这里插入图片描述

  • 代码实现

    import os
    import shutil
    
    
    def remove_images(start_size, end_size, type_A_path, type_B_path, type_label_path):
        """
            保存图片名称文件
    
            :param start_size:开始步长
            :param end_size: 结束步长
            :param type_A_path: A文件夹路径
            :param type_B_path: B文件夹路径
            :param type_label_path: label文件夹路径
    
            :return:
        """
        for i in file_list[start_size:end_size]:
            # 绝对路径拼接
            A_name, B_name, label_name = os.path.join(a_path, i), os.path.join(b_path, i), os.path.join(label_path, i)
            A_name_to, B_name_to, label_name_to = os.path.join(type_A_path, i), os.path.join(type_B_path, i), os.path.join(type_label_path, i)
            # 图片路径移动
            shutil.copy(A_name, A_name_to)
            shutil.copy(B_name, B_name_to)
            shutil.copy(label_name, label_name_to)
            print(i + '-------------------------->  over!!!')
    
    
    types_path = ['A', 'B', 'label']
    types_dataset = ['train', 'val', 'test']
    
    # 原始路径
    root_path = r'C:\data'
    a_path = os.path.join(root_path, types_path[0])
    b_path = os.path.join(root_path, types_path[1])
    label_path = os.path.join(root_path, types_path[2])
    label_path_name = os.walk(label_path)
    file_list = [file_list for path, folder_list, file_list in label_path_name][0]  # 获取所有图片文件名称
    
    # 保存创建数据集路径
    dataset = root_path + '_DATASET'
    dataset_train = os.path.join(dataset, types_dataset[0])
    dataset_val = os.path.join(dataset, types_dataset[1])
    dataset_test = os.path.join(dataset, types_dataset[2])
    
    # 创建相关文件夹
    for i in types_dataset:
        dataset_path = os.path.join(dataset, i)
        for j in types_path:
            types_dir = os.path.join(dataset_path, j)
            if not os.path.exists(types_dir):
                os.makedirs(types_dir)
    
    # 数据集划分
    all_size, train_rate, val_rate = len(file_list), 0.7, 0.9  # 测试集,校验集比例
    train_size, val_size, test_size = int(all_size * train_rate), int(all_size * val_rate), all_size + 1
    
    # 获取不同类型数据集路径
    for i, types in [(dataset_train, types_dataset[0]), (dataset_val, types_dataset[1]), (dataset_test, types_dataset[2])]:
        # types path
        types_a_path = os.path.join(i, types_path[0])
        types_b_path = os.path.join(i, types_path[1])
        types_label_path = os.path.join(i, types_path[2])
        # 调用函数
        if types == types_dataset[0]:
            # train remove images
            remove_images(0, train_size, types_a_path, types_b_path, types_label_path)
        elif types == types_dataset[1]:
            # val remove images
            remove_images(train_size, val_size, types_a_path, types_b_path, types_label_path)
        elif types == types_dataset[2]:
            # test remove images
            remove_images(val_size, test_size, types_a_path, types_b_path, types_label_path)
    
    
    

猜你喜欢

转载自blog.csdn.net/m0_46926492/article/details/130057996