记录一下transforms的一些日常操作
在模型的训练中,可能会看到对图像做了许多的操作,如下
为了搞清楚他们的作用,我搜索了一些transforms相关的操作,并整理了此文章
transforms.Compose([
transforms.Resize(300),
transforms.RandomResizedCrop(300),
transforms.RandomHorizontalFlip(),
transforms.CenterCrop(256),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
]),
利用 Pycharm观察一下transforms
中包含的类有哪些
看起来操作非常多,但实际上用起来并不难,只要搞懂要求的输入与输出是什么即可,下面就对其中几个举例
"Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor
要求输入的是PIL Image
或 numpy.ndarray
格式
from torchvision import transforms
from PIL import Image
# ToTensor
trans_toTensor = transforms.ToTensor()
img_tensor = trans_toTensor(img)
这是一个常用的函数, 起到正则化的作用
如源码中的叙述, 它要求的输入是两个列表,分别 包含均值和方差
它的目的是为一个 tensor对象 正则化
output[channel] = (input[channel] - mean[channel]) / std[channel]
看一段代码解释一下它的作用
# Normalize
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([1, 7, 8], [1, 5, 5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image('Normalize', img_norm)
打印出的结果如下
也就是 0.3529 − 1 1 = − 0.6471 \frac{0.3529 - 1} { 1 } = -0.6471 10.3529−1=−0.6471
tensor(0.3529)
tensor(-0.6471)
Resize the input image to the given size. The image can be a PIL Image or a torch Tensor
因此其输入应该是个PIL Image
格式或者 tensor
的格式
这里看名字就知道是更改图片的尺寸,只不过需要注意一点
# Resize
trans_resize = transforms.Resize(300)
img_resize = trans_resize(img)
img_resize = trans_toTensor(img_resize)
随机裁剪
给定一个 int
值, 裁剪返回一个 正方形的图 边长为 int
trans_random = transforms.RandomCrop(512)
trans_compose = transforms.Compose([
trans_random,
trans_toTensor,
])
img_crop = trans_compose(img)
这里compose可以把两个操作拼接起来,但是要注意顺序不能错
即上一个操作的输出要符合下一个操作的输入格式
这里用tensorboard把图片的过程可视化保存了
可以去这篇文章中查看如何使用
Pytorc技巧 TensorBoard可视化的使用
# -*- coding: utf-8 -*-
# @Time : 2021/1/31 19:30
# @Author : JokerTong
# @File : demo1.py
from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
import matplotlib.pyplot as plt
import numpy as np
writer = SummaryWriter('logs')
img = Image.open('../图像读取/img1.jpg')
# ToTensor
trans_toTensor = transforms.ToTensor()
img_tensor = trans_toTensor(img)
# writer.add_image('ToTensor', img_tensor)
# Normalize
print(img_tensor[0][0][0])
trans_norm = transforms.Normalize([1, 7, 8], [1, 5, 5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image('Normalize', img_norm)
# Resize
trans_resize = transforms.Resize(300)
img_resize = trans_resize(img)
img_resize = trans_toTensor(img_resize)
writer.add_image('Resize', img_resize)
# RandomCrop
trans_random = transforms.RandomCrop(512)
trans_compose = transforms.Compose([
trans_random,
trans_toTensor,
])
for i in range(10):
img_crop = trans_compose(img)
writer.add_image('RandomCrop', img_crop, i)
writer.close()