transforms主要是图像transform, 它们可以通过使用Compose来链接起来。
1 | transforms.Compose([ |
Transforms on PIL Image
torchvision.transforms.CenterCrop
(size):
对给定的PIL image在中心处裁剪。
参数为:size, int or sequence. 如果是一个sequence,比如(h,w)会裁剪一个h*w大小的图片。
如果是int,那么会裁剪大小为(size,size)的图像
torchvision.transforms.FiveCrop
(size)
对给定的PIL image的四个角和中心进行裁剪
其他同上。
1 | transform = Compose([ |
torchvision.transforms.Pad
(padding, fill=0, padding_mode=’constant’)
用给定的pad值对图像的4个sides进行填充
参数:padding: 用于确定每个border填充的数量.
如果只有一个int,对所有的边进行一样的填充数量
如果为长度为2的tuple,那么是对左右,上下分别指定
如果长度为4的tuple,那么是对左、上,右、下的边分别指定
fill: 当mode为constfill时的填充值。默认为0,如果是一个长度为3的tuple是,分别为RGB值
padding_mode:padding的类型
constant,常数填充
edge:用edge上的值进行填充
reflect:pads with reflection of image without repeating the last value on the edge
symmeic:pads with reflection of image repeating the last value on the edge
torchvision.transforms.Grayscale
(num_output_channels=1)
将image转为灰度图
参数:num_output_channels ,默认为1,也可以为3, 是想要输出图像的channel的个数。
输出:输入的灰度版本。如果nums为1,那么返回的image是单channel,如果是3,返回的image的三个r、g、b三个通道相等。
输出的type:PIL image
torchvision.transforms.Resize
(size, interpolation=2)
将输入的PILimage的大小resize到给定的大小
参数:size (sequence or int)期望的输出。如果size是int,那么短的边会匹配到这个数字。ie,如果height>height, 那么image会被缩放为(size*height/width, size). 如果size为sequence,那么大小会被匹配到给定的(h,w)。
interpolation: 插值的方法,默认为PIL.Image.BILINEAR
Transforms on torch.*Tensor
torchvision.transforms.
Normalize(mean, std, inplace=False)
归一化给定的mean,std来归一化一张tensor image。对于每一个channel进行
参数:mean:每个channel的均值
std: 每个channel的std值
返回:normalized Tensor image
返回类型:Tensor
Note:不是就地改变输入Tensor
Conversion Transforms
torchvision.transforms.ToPILImage
(mode=None)
将Tensor或者ndarray转换为PILimage
参数:mode:
如果mode没给定:
如果输入为4channel,那么默认为RGBA
如果输入为3channel,那么默认为RGB
如果输入为2channel,那么默认为LA
如果输入为1 channel,那么由mode参数确定
torchvision.transforms.ToTensor
将PIL image 或者ndarray转换为Tensor
将值范围为【0,255】的PIL image或者ndarray(H/W/C)转换为FloatTensor(C,H,W)并且值范围为【0.0,1.0】,如果the PIL Image属于 one of the modes (L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1) 或者 the numpy.ndarray has dtype = np.uint8
其他的,tensors不会进行缩放
FiveCrop和TenCrop
这两种操作之后,一张图变成五张,一张图变成十张,那么在训练或者测试的时候怎么避免和标签混淆呢
思路是,这多个图拥有相同的标签,假如是分类任务,就可以使用交叉熵进行,然后求10张图的平均
1 | transform = Compose([ |