Compose类
Compose中的参数需要的是一个列表,数据类型需要是transforms类型。
Compose([transforms参数1, transforms参数2, ...])
比如我们可以先裁剪再调用ToTensor方法
Example:
>>> transforms.Compose([
>>> transforms.CenterCrop(10),
>>> transforms.PILToTensor(),
>>> transforms.ConvertImageDtype(torch.float),
>>> ])
实例化对象后,compose对象需要输入Image。
ToTensor类
将np或者PIL数据类型的图片转换为tensor数据类型。
ToPILImage类
将tensor或者np数据类型的图片转换为PIL数据类型
Normalize类
进行归一化
Normalize a tensor image with mean and standard deviation //用平均值和标准差来归一化一张图像
output[channel] = (input[channel] - mean[channel]) / std[channel] //计算公式
writer = SummaryWriter("logs")
img = Image.open("images/6240338_93729615ec.jpg")
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
img_norm = trans_norm(img_tensor)
writer.add_image("Normalize", img_norm, 1)
writer.close()
由于我们传入的是三通道图片,因此均值和方差均需传入长度为3的数组,我们设置的值均为0.5,它的作用是将[0,1]之间的数据转换为[-1,1]之间的数据。
输入前和输入后的图片
Resize类
Resize the input image to the given size.
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.
i.e, if height > width, then image will be rescaled to
(size * height / width, size).
//如果大小是这样的序列(h,w),输出大小将与此匹配。如果大小是int,图像的较小边缘将与该数字相匹配。
即,如果高度 > 宽度,则图像将被重新缩放为
(尺寸 * 高度 / 宽度,尺寸)。
我们可以先将PIL图片用resize方法进行放缩,再转为tensor类型的图片,完成一系列流水线操作
# Resize
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)
或者可以用compose方法,进行放缩变换
# Compose - resize - 2
trans_resize_2 = transforms.Resize(512)
trans_compose = transforms.Compose([trans_resize_2, trans_totensor])
img_resize_2 = trans_compose(img)
writer.add_image("Resize", img_resize_2, 1)
注意:老版的resize类不支持tensor数据类型,但新版的resize已经支持了,不需要进行这么麻烦的操作。
RandomCrop类
随机裁剪,对这个类我们只简单看一下size的作用
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.
If provided a sequence of length 1, it will be interpreted as (size[0], size[0]).
//size(sequence或int):作物所需的输出大小。
如果size是int而不是像(h,w)那样的序列,则会生成方形裁剪(size,size)。
如果提供长度为1的序列,它将被解释为(size[0],size[0])。
#RandomCrop
trans_random = transforms.RandomCrop(128)
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)
RandomCrop会对给定的裁剪大小对图片进行随机裁剪,结果如下
这里只列出其中两张图片。
注意:给定的裁剪大小必须要小于图片的大小,不然会报错。
总结
- 关注输入和输出类型,多看官方文档,比网上、CSDN搜索要准确的多
- 关注方法需要什么参数,比如初始化时需要的参数。
- 不知道返回值类型时,用print或者print(type())或debug来查看。