python - 如何随机排序图像及其掩码?
问题描述
在拆分数据集之前,我需要随机加载数据,然后进行拆分。这是用于拆分非随机数据集的片段。我想知道如何为文件夹掩码中的图像和相应掩码执行此操作?
folder_data = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\imagesResized\\*.png")
folder_mask = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\labelsResized\\*.png")
# split these path using a certain percentage
len_data = len(folder_data)
print("count of dataset: ", len_data)
# count of dataset: 992
split_1 = int(0.6 * len(folder_data))
split_2 = int(0.8 * len(folder_data))
#folder_data.sort()
train_image_paths = folder_data[:split_1]
print("count of train images is: ", len(train_image_paths))
valid_image_paths = folder_data[split_1:split_2]
print("count of validation image is: ", len(valid_image_paths))
test_image_paths = folder_data[split_2:]
print("count of test images is: ", len(test_image_paths))
train_mask_paths = folder_mask[:split_1]
valid_mask_paths = folder_mask[split_1:split_2]
test_mask_paths = folder_mask[split_2:]
train_dataset = CustomDataset(train_image_paths, train_mask_paths)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=1,
shuffle=True, num_workers=2)
valid_dataset = CustomDataset(valid_image_paths, valid_mask_paths)
valid_loader = torch.utils.data.DataLoader(valid_dataset, batch_size=1,
shuffle=True, num_workers=2)
test_dataset = CustomDataset(test_image_paths, test_mask_paths)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1,
shuffle=False, num_workers=2)
dataLoaders = {
'train': train_loader,
'valid': valid_loader,
'test': test_loader,
}
解决方案
据我了解,您希望随机化图片的顺序,以便每次重新运行时火车和测试集中都有不同的照片。假设您想在或多或少的普通 Python 中执行此操作,您可以执行以下操作。
在 python 中使用 shuffle 元素列表的最简单方法是:
import random
random.shuffle(list) // shuffles in place
因此,您必须列出并希望仍然保持数据和掩码之间的链接。因此,如果您可以接受一个相当快速的破解,我会提出这样的建议。
import random
folder_data = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\imagesResized\\*.png")
folder_mask = glob.glob("D:\\Neda\\Pytorch\\U-net\\my_data\\labelsResized\\*.png")
assert len(folder_data) == len(folder_mask) // everything else would be bad
indices = list(range(len(folder_data)))
random.shuffle(indices)
现在您有一个可以拆分的索引列表,然后使用拆分列表中的索引访问其他列表。
split_1 = int(0.6 * len(folder_data))
split_2 = int(0.8 * len(folder_data))
train_image_paths = [folder_data[i] for i in indices]
// and so on...
这将是普通的 Python 方式。但是在 sklearn 之类的包中有执行此操作的功能。所以你可以考虑使用这些。他们会让你免于做很多工作。(通常重用代码比自己实现要好得多。)
推荐阅读
- anaconda - 康达创建和康达安装
- javascript - 通过对象而不是 url 路由器更改 Vue 视图
- java - 不可变(纯函数)上下文中的 UnsupportedOperationException 与 IllegalStateException
- amazon-web-services - 客户端无法使用 Symmetric DS 在 AWS 上托管的服务器上注册
- python - matplotlib 坏了吗?
- filter - 如何获得边缘以及我在 Cytoscape.js 中过滤的节点?
- javascript - 像 placeit.net 这样的网站如何在图像上添加图像和文本
- amazon-web-services - 如何使用经过训练的 AWS 模型执行实时对象检测
- ubuntu - tk.h 在 /usr/include 中查找 tcl.h,但 tcl.h 在 /usr/include/tcl 中。我没有编写 tk.h 权限来修复代码
- mysql - Mysql 终端实例很好,但 MySQL Workbench 没有连接到数据库