文章转自:微信公众号【机器学习炼丹术】。
有需要的话,可以添加作者微信交流:cyx645016617。朋友圈经常抽奖送书送红包哈哈。
参考目录:
torchvision.transforms
的介绍:
这个Transforms是常见的图像的转换(包含图像增强等), 然后不同的transforms可以通过Compose
函数连接起来(类似于mermaid sequenceDiagram
把网络层连接起来一样的感觉)。后面的是关于图像分割任务了的介绍,因为入门PyTorch主要是图像分类,所以后面先不提了。
【代码】
torchvision.transforms.Compose(transforms)
【介绍】
将不同的transform压缩在一起,这是非常重要的函数
【代码举例】
transforms.Compose([
transforms.CenterCrop(10),
transforms.ToTensor(),
])
【代码】
torchvision.transforms.RandomChoice(transforms)
【介绍】
用法和Compose相同,是在transform的list中随机选择1个transform进行执行。
【代码】
torchvision.transforms.RandomOrder(transforms)
【介绍】
用法和Compose相同,是乱序list中的transform。
之前的课程提到了,在torchvision官方的数据集中,提供的数据是PIL格式的数据,然后我们需要转成FloatTensor形式的数据。因此这里图像增强的处理也分成在PIL图片上操作的和在FloatTensor张量上操作的两种。
【代码】
torchvision.transforms.CenterCrop(size)
【介绍】
以PIL图片中心为中心,进行图片切割。比较常用
【参数】
size (sequence or int) – 想要切割出多大的图片。如果size是一个整数,那么就切割一个正方形;如果是一个(height,width)的tuple,那么就切割一个长方形。
【代码举例】
transforms.Compose([
transforms.CenterCrop(10),
transforms.ToTensor(),
])
【代码】
torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
【介绍】
和CenterCrop类似,但是是随机选取中心进行切割的
【参数】
【代码】
torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333), interpolation=2)
【介绍】
这个比较有意思,随机大小切割图片,然后再resize到设置的size大小。
参数中scale控制切割图片的大小是原图的比例,然后ratio控制切割图片的高宽比(纵横比),默认是从3/4 到 4/3。切割完成后再resize到设置的size大小。这个方法一般用在训练inception网络。
【代码】
torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
【介绍】
随机修改亮度brightness,对比度contrast, 饱和度saturation,色相hue
【参数】
brightness (float or tuple (min, max)) – 如果输入是一个float,那么建议在选取一个小于1的浮点数。亮度系数会从区间 [ m a x ( 0 , 1 − b r i g h t n e s s ) , 1 + b r i g h t n e s s ] [max(0, 1 - brightness), 1 + brightness] [max(0,1−brightness),1+brightness]均匀选取,如果我使用这个,我设置brightness是0.1的话,那么这个系数就是 [ 0.9 , 1.1 ] [0.9,1.1] [0.9,1.1]之间随机选取。如果输入时一个tuple的话,那么就是在 [ m i n , m a x ] [min,max] [min,max] 中选取。
contrast (float or tuple (min, max)) – 和上面一样,也是一个系数的选取。
saturation (float or tuple (min, max)) – 和上面一样,也是一个系数的选取。
hue (float or tuple (min, max)) – hue是色相。这里色相的取值应该小于0.5。如果输入时一个float,那么取值应该 0 < = h u e < = 0.5 0<= hue <= 0.5 0<=hue<=0.5,系数在 [ − h u e , h u e ] [-hue, hue] [−hue,hue] 选取;如果是tuple,那么就是 [ m i n , m a x ] [min, max] [min,max]
【代码】
torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)
【介绍】
就是随机的按照角度宣传图片
【参数】
degrees (int or tuple (min,max)) – 老规矩了,整数旋转角度就是[-int,int],tuple就是[min,max]
expand (bool, optional) – True就是让扩大图片,让图片可以包括所有内容(图片旋转的话,四个角的信息其实是旋转到了图片的外面,这个是扩大图片的像素尺寸,如果True在后面还要接一个resize的transforms); 默认是False,旋转后的图片和输入图片是同样的尺寸。
center (2-tuple, optional) – 可以设置成非图片中心的旋转
fill (n-tuple or int or float) – 设置填充像素值的,默认是0,一般也会选取0.
【代码】
torchvision.transforms.Grayscale(num_output_channels=1)
【介绍】
这个函数虽然不重要,但是会用的话可以提高变成速度哈哈。就是把图片转换成灰度的。
【参数】
【代码】
torchvision.transforms.Resize(size, interpolation=2)
【介绍】
把PIL图片resize成指定大小
【参数】
图像增强有:变成灰度,镜像,翻转,平移,旋转等。
【代码】
# 变成灰度,输入输出通道数默认相同
torchvision.transforms.RandomGrayscale(p=0.1)
# 随机水平翻转
torchvision.transforms.RandomHorizontalFlip(p=0.5)
# 随机竖直翻转
torchvision.transforms.RandomVerticalFlip(p=0.5)
【参数】
【代码】
torchvision.transforms.Normalize(mean, std, inplace=False)
【参数】
o u t p u t [ c h a n n e l ] = ( i n p u t [ c h a n n e l ] − m e a n [ c h a n n e l ] ) s t d [ c h a n n e l ] output[channel] = \frac{(input[channel] - mean[channel]) } {std[channel]} output[channel]=std[channel](input[channel]−mean[channel])
torchvision.transforms.ToPILImage(mode=None)
【介绍】
把一个tensor或者np的array转换成PIL。值得注意的是,如果输入时Tensor,那么维度应该是 C x H x W ,如果是numpy的话,是 H x W x C。 (这是一个一般不会出现,但是一旦出现很难想到的问题。)
torchvision.transforms.ToTensor
【介绍】
把PIL或者numpy转换成Tensor。PIL和Numpy (格式H x W x C,范围[0,255]),转换成Tensor(格式C x H x W,范围[0,1])
from PIL import Image
from torchvision import transforms
def loadImage():
# 读取图片
im = Image.open("brunch.jpg")
im = im.convert("RGB")
im.show()
return im
im = loadImage()
图片是我在英国留学的时候,有一道菜叫无花果土司,虽然不好吃但是好看,原图:
#从中心裁剪一个600*600的图像
output = transforms.CenterCrop(600)(im)
output.show()
# 从中心裁一个长为600,宽为800的图像
output = transforms.CenterCrop((600,800))(im)
output.show()
#随机裁剪一个600*600的图像
output = transforms.RandomCrop(600)(im)
output.show()
#随机裁剪一个600*800的图像
output = transforms.RandomCrop((600,800))(im)
output.show()
#从上、下、左、右、中心各裁一个300*300的图像
outputs = transforms.FiveCrop(300)(im)
outputs[4].show()
类似的图片,就不占用painful了
#p默认为0.5,这里设成1,那么就肯定会水平翻转
output = transforms.RandomHorizontalFlip(p=1.0)(im)
output.show()
output = transforms.RandomVerticalFlip(p=1)(im)
output.show()
#在(-30,30)之间选择一个角度进行旋转
output = transforms.RandomRotation(30)(im)
output.show()
#在60-90之间选择一个角度进行旋转
output = transforms.RandomRotation((60,90))(im)
output.show()
output = transforms.Resize((400,500))(im)
output.show()
这个图像一样就尺寸变小了,就不放图了。
trans = transforms.Compose([transforms.CenterCrop(300),
transforms.RandomRotation(30),
])
output = trans(im)
output.show()