在
Dataloader
数据读取之前,需要对图片进行处理,这里展示了两种在Dataset
中对图片随机裁减的方法
首先我们有一批数据,我们需要对数据进行预处理,假设图片的大小是随机的,对于大于(3, 256, 256)
的图片,我们对他进行随机的裁减,变为(3, 256, 256)
,对于小于(3, 256, 256)
的图片,我们将其进行填充,最后我们将图片进行保存(注意在模型训练过程中是没有这一步的,这里只是为了方便演示结果)
预处理的过程一般在Dataset
的__getitem__()
函数中进行修改
第一种
用PIL的Image库
进行裁减
from PIL import Image
import random
im = Image.open("12300.jpg")
# 图片的宽度和高度
ww, hh = im.size
print("图片宽度和高度分别是", ww, hh)
# 元组里的元素分别是:
# 距离图片左边界距离x, 距离图片上边界距离y
# 距离图片左边界距离+裁剪框宽度x+w,距离图片上边界距离+裁剪框高度y+h
# 截取图片中一块宽是256和高是256的
patch_size = 256
www = random.randint(0, ww-patch_size)
hhh = random.randint(0, hh-patch_size)
# crop
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)
类型
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: 保存的文件名
"""
# assert (len(input_tensor.shape) == 4 and input_tensor.shape[0] == 1)
# 复制一份
input_tensor = input_tensor.clone().detach()
# 到cpu
input_tensor = input_tensor.to(torch.device('cpu'))
# 反归一化
# input_tensor = unnormalize(input_tensor)
vutils.save_image(input_tensor, filename)
im = Image.open("12300.jpg")
# 图片的宽度和高度
ww, hh = im.size
print("图片宽度和高度分别是", ww, hh)
# 转化为tensor形式
patch_size = 256
im = TF.to_tensor(im)
# 随机crop
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")