P12.常见的Transforms(一)
1.
输入
输出
作用
PIL Image.open()
tensor ToTensor()
narrays cv.imread()
2.在项目文件夹中存储一张图片
from PIL import Image
img = Image.open("images/e56420e50cbfef3191ed95d0920b0a9e.jpeg")
print(img)
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=900x506 at 0x7FC1526E1630>
Python中_call_的用法
class Person:
def __call__(self, name):
print("__call__"+" Hello " + name)
def hello(self, name):
print("hello" + name)
person = Person()
person("zhangsan") #调用__call__
person.hello("lisi") #调用hello()方法
__call__ Hello zhangsan
hellolisi
3.ToTensor()的使用
class ToTensor(object): """Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/e56420e50cbfef3191ed95d0920b0a9e.jpeg")
print(img)
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor", img_tensor)
writer.close()
tensorboard --logdir=logs
4.Normalize()的使用
class Normalize(object): """Normalize a tensor image with mean and standard deviation. Given mean: ``(M1,...,Mn)`` and std: ``(S1,..,Sn)`` for ``n`` channels, this transform will normalize each channel of the input ``torch.*Tensor`` i.e. ``input[channel] = (input[channel] - mean[channel]) / std[channel]``
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/e56420e50cbfef3191ed95d0920b0a9e.jpeg")
print(img)
# 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([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)
writer.close()
# 0.0039*2-1=-0.6662
tensor(0.0039)
tensor(-0.6662)
P13.常见的Transforms(二)
1.Resize()的使用
class Resize(object): """Resize the input PIL Image to the given size. #输入是PILImage Args: size (sequence or int): Desired output size. If size is a sequence like (h, w), output size will be matched to this. If size is an int,smaller edge of the image will be matched to this number.
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/e56420e50cbfef3191ed95d0920b0a9e.jpeg")
print(img)
# 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([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)
# Resize
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize)
writer.close()
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=900x506 at 0x7F1E8BFBF7F0>
tensor(0.0039)
tensor(-0.9922)
(900, 506)
tensor([[[0.0039, 0.0039, 0.0039, ..., 0.0784, 0.1569, 0.1843],
[0.0039, 0.0039, 0.0039, ..., 0.1804, 0.2118, 0.2353],
[0.0039, 0.0039, 0.0039, ..., 0.2471, 0.2863, 0.3098],
...,
[0.0078, 0.0078, 0.0078, ..., 0.0078, 0.0078, 0.0078],
[0.0078, 0.0078, 0.0078, ..., 0.0078, 0.0078, 0.0078],
[0.0078, 0.0078, 0.0078, ..., 0.0078, 0.0078, 0.0078]],[[0.0078, 0.0078, 0.0039, ..., 0.3098, 0.6157, 0.6431],
[0.0078, 0.0078, 0.0039, ..., 0.4196, 0.6353, 0.6588],
[0.0078, 0.0078, 0.0039, ..., 0.5098, 0.6588, 0.6824],
...,
[0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000]],[[0.0000, 0.0000, 0.0000, ..., 0.2902, 0.5098, 0.5373],
[0.0000, 0.0000, 0.0000, ..., 0.3961, 0.5412, 0.5647],
[0.0000, 0.0000, 0.0000, ..., 0.4784, 0.5882, 0.6118],
...,
[0.0118, 0.0118, 0.0118, ..., 0.0118, 0.0118, 0.0118],
[0.0118, 0.0118, 0.0118, ..., 0.0118, 0.0118, 0.0118],
[0.0118, 0.0118, 0.0118, ..., 0.0118, 0.0118, 0.0118]]])
tensorboard --logdir=logs
2.Compose()的使用
class Compose(object): """Composes several transforms together. #将几个transforms结合在一起 Args: transforms (list of ``Transform`` objects): list of transforms to compose. Example: >>> transforms.Compose([ >>> transforms.CenterCrop(10), #中心裁剪 >>> transforms.ToTensor(), #转换为tensor数据类型 >>> ]) """
Compose()中的参数需要的是一个列表
Python中,列表的表示形式为[数据1, 数据2, ...]。在Compose中,数据需要是transforms类型,所以得到Compose([transforms参数1, transforms参数2])
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/e56420e50cbfef3191ed95d0920b0a9e.jpeg")
print(img)
# 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([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)
# Resize
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize)
# Compose -resize - 2
trans_resize_2 = transforms.Resize(512)
# PIL -> PIL -> tensor
trans_compose = transforms.Compose([trans_resize_2, trans_totensor]) #trans_resize_2 output = trans_totensor input
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)
writer.close()
tensorboard --logdir=logs
3.RandomCrop()的使用
class RandomCrop(object): """Crop the given PIL Image at a random location. Args: size (sequence or int): Desired output size of the crop. If size is an int instead of sequence like (h, w), a square crop (size, size) is made.
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
writer = SummaryWriter("logs")
img = Image.open("images/e56420e50cbfef3191ed95d0920b0a9e.jpeg")
print(img)
# 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([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize", img_norm)
# Resize
print(img.size)
trans_resize = transforms.Resize((512, 512))
# img PIL -> resize -> img_resize PIL
img_resize = trans_resize(img)
# img_resize PIL -> totensor -> img_resize tensor
img_resize = trans_totensor(img_resize)
writer.add_image("Resize", img_resize, 0)
print(img_resize)
# Compose -resize - 2
trans_resize_2 = transforms.Resize(512)
# PIL -> PIL -> tensor
trans_compose = transforms.Compose([trans_resize_2, trans_totensor]) #trans_resize_2 output = trans_totensor input
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)
# RandomCrop
trans_random = transforms.RandomCrop(256)
trans_compose_2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RandomCrop", img_crop, i)
writer.close()
tensorboard --logdir=logs
总结使用方法
1)关注输入和输出类型
若输出类型未知,可使用print(),print(type())直接查看,也可以设置断点debug
2)多看官方文档
3)关注方法需要什么参数
在init初始化中查看需要设置的参数,在Args查看具体的数据类型