在Dataloader数据读取之前,需要对图片进行处理,这里展示了两种在Dataset中对图片随机裁减的方法
首先我们有一批数据,我们需要对数据进行预处理,假设图片的大小是随机的,对于大于(3, 256, 256)的图片,我们对他进行随机的裁减,变为(3, 256, 256),对于小于(3, 256, 256)的图片,我们将其进行填充,最后我们将图片进行保存(注意在模型训练过程中是没有这一步的,这里只是为了方便演示结果)
预处理的过程一般在Dataset的__getitem__()函数中进行修改
第一种
用PIL的Image库进行裁减
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from PIL import Image import random
im = Image.open("12300.jpg")
ww, hh = im.size print("图片宽度和高度分别是", ww, hh)
patch_size = 256 www = random.randint(0, ww-patch_size) hhh = random.randint(0, hh-patch_size)
x = www y = hhh w = 256 h = 256 region = im.crop((x, y, x+w, y+h)) region.save("./12300restore.jpg")
|
第二种
读取为tensor后进行裁减
Image.open得到的图像经过torchvision.transforms.functional.to_tensor后为(c, h, w)类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import torch import random from PIL import Image import torchvision.transforms.functional as TF from torchvision import utils as vutils
def save_image_tensor(input_tensor: torch.Tensor, filename): """ 将tensor保存为图片 :param input_tensor: 要保存的tensor :param filename: 保存的文件名 """ input_tensor = input_tensor.clone().detach() input_tensor = input_tensor.to(torch.device('cpu')) vutils.save_image(input_tensor, filename)
im = Image.open("12300.jpg")
ww, hh = im.size print("图片宽度和高度分别是", ww, hh)
patch_size = 256 im = TF.to_tensor(im)
hhh = random.randint(0, hh-patch_size) www = random.randint(0, ww-patch_size) im = im[:, hhh:hhh+patch_size, www:www+patch_size]
save_image_tensor(im, "./aaaaa.jpg")
|