torchvision.transforms
常用的图像预处理方法
# ============================ step 1/5 数据 ============================
split_dir = os.path.join(BASE_DIR, "..", "..", "data", "rmb_split")
if not os.path.exists(split_dir):
raise Exception(r"数据 {} 不存在, 回到lesson-06\1_split_dataset.py生成数据".format(split_dir))
train_dir = os.path.join(split_dir, "train")
valid_dir = os.path.join(split_dir, "valid")
norm_mean = [0.485, 0.456, 0.406]
norm_std = [0.229, 0.224, 0.225]
train_transform = transforms.Compose([
transforms.Resize((32, 32)),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
transforms.Normalize(norm_mean, norm_std),
])
valid_transform = transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor(),
transforms.Normalize(norm_mean, norm_std),
])
# 构建MyDataset实例
train_data = RMBDataset(data_dir=train_dir, transform=train_transform)
valid_data = RMBDataset(data_dir=valid_dir, transform=valid_transform)
# 构建DataLoder
train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)
valid_loader = DataLoader(dataset=valid_data, batch_size=BATCH_SIZE)
transforms.Compose():将一系列的transforms的方法进行有序的组合。在验证过程中的transforms不需要对数据进行增强。
1、在96行设置断点进行Debug.
2、采用C按钮,跳转到dataloader.py中DataLoader类的__iter__(self)函数中。
3、以单进程为例,点击B按钮然后点击C按钮,进入单进程的类当中。将光标放在346行并点击F按钮,运行到该行。
4、点击C按钮进入fetch函数,在fetch函数中,第44行调用了dataset函数,我们将光标放到第44行点击F按钮运行到该行,并点击C按钮进入该函数(C按钮点击两次)。
5、此时我们进入到我们创建的数据集类RMBDataset中,在__getitem__()中调用了transforms。
6、我们将光标放在45行点击F按钮运行到该行,并点击C按钮进入该函数。我们可以发现我们进入了transforms.py文件中Compose类的__call__()函数中,该函数通过一个for循环依次有序的从Compose中调用预处理方法。
7、点击B按钮运行到第61行,我们可以发现第一个预处理方法t为Resize,正好对应我们设置的transforms的第一个方法。我们可以继续点击B按钮,t函数按照我们设置的transforms预处理顺序来调用函数。
8、运行到62行,我们的transforms运行完毕,点击E按钮返回我们的图片。从这里我们知道transforms在__getitem__()中调用,并实现数据预处理。
通过以上步骤我们可以清楚的了解transforms的运行机制。