深度学习之数据集创建
- 1. 原始文件相关文件路径
- 2. 数据集创建
- 2.1 数据格式一
- 2.2 数据格式二
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 数据格式一
- 相关算法数据格式
- https://github.com/justchenhao/BIT_CD
- https://github.com/justchenhao/BIT_CD
- 与原始数据对比,多出
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 数据格式二
-
相关算法数据格式
- paddle框架 Bitemporal image transformer(BIT)
- paddle框架 Bitemporal image transformer(BIT)
-
将不同的数据集放在不同的文件夹里,不需要
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)