【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解
文章来自:微信公众号【机器学习炼丹术】。欢迎关注支持原创
也欢迎添加作者微信:cyx645016617.
参考目录:
老样子,先看官方对torchvision.transforms的介绍:
这个Transforms是常见的图像的转换(包含图像增强等), 然后不同的transforms可以通过Compose函数连接起来(类似于Sequence把网络层连接起来一样的感觉)。后面的是关于图像分割任务了的介绍,因为入门PyTorch主要是图像分类,所以后面先不提了。
1 基本函数
1.1 Compose
【代码】
torchvision.transforms.Compose(transforms)
【介绍】
将不同的transform压缩在一起,这是非常重要的函数
【代码举例】
transforms.Compose([
transforms.CenterCrop(10),
transforms.ToTensor(),
])
1.2 RandomChoice
【代码】
torchvision.transforms.RandomChoice(transforms)
【介绍】
用法和Compose相同,是在transform的list中随机选择1个transform进行执行。
1.3 RandomOrder
【代码】
torchvision.transforms.RandomOrder(transforms)
【介绍】
用法和Compose相同,是乱序list中的transform。
之前的课程提到了,在torchvision官方的数据集中,提供的数据是PIL格式的数据,然后我们需要转成FloatTensor形式的数据。因此这里图像增强的处理也分成在PIL图片上操作的和在FloatTensor张量上操作的两种。
2 PIL上的操作
2.1 中心切割CenterCrop
【代码】
torchvision.transforms.CenterCrop(size)
【介绍】
以PIL图片中心为中心,进行图片切割。比较常用
【参数】
size (sequence or int) – 想要切割出多大的图片。如果size是一个整数,那么就切割一个正方形;如果是一个(height,width)的tuple,那么就切割一个长方形。
【代码举例】
transforms.Compose([
transforms.CenterCrop(10),
transforms.ToTensor(),
])
2.2 随机切割RandomCrop
【代码】
torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
【介绍】
和CenterCrop类似,但是是随机选取中心进行切割的
【参数】
- size也是可以是int可以是tuple(height,width)
- padding就是是否对图片进行填充,你可以输入2元组,表示左右填充和上下填充,也可以输入四元组,表示左上右下的填充;
- pad_if_needed是boolean,一般是True。随机选取如果选取的比较边缘,超出了边界,那么是否进行填充
- fill (int),你选择填充的是0(黑色),还是255(白色)呢?这个尽在padding_mode='constant'时有效
- padding_mode表示填充的方法。有四种:'constant', 'edge', 'reflect' or 'symmetric' . 默认是constant常数填充。edge是填充边缘的那个像素值,一般效果比constant强一些,自己做的项目中;reflect和symmetric都是表示以边界为轴进行镜像的填充,区别在于:
- reflect:[1,2,3,4,5]进行padding=2的时候,那么就是[3,2,1,2,3,4,5,4,3]
- symmetric:[1,2,3,4,5]进行padding=2的时候,那么就是[2,1,1,2,3,4,5,5,4]
- 区别是否重复边界的哪一个元素。两种方法差别不大。
2.3 随机比例切割
【代码】
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网络。
2.4 颜色震颤ColorJitter
【代码】
torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
【介绍】
随机修改亮度brightness,对比度contrast, 饱和度saturation,色相hue
【参数】
brightness (float or tuple (min, max)) – 如果输入是一个float,那么建议在选取一个小于1的浮点数。亮度系数会从区间\([max(0, 1 - brightness), 1 + brightness]\)均匀选取,如果我使用这个,我设置brightness是0.1的话,那么这个系数就是\([0.9,1.1]\)之间随机选取。如果输入时一个tuple的话,那么就是在 \([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<= hue <= 0.5\),系数在\([-hue, hue]\) 选取;如果是tuple,那么就是\([min, max]\)
2.5 随机旋转RandomRotation
【代码】
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.
2.6 灰度化Grayscale
【代码】
torchvision.transforms.Grayscale(num_output_channels=1)
【介绍】
这个函数虽然不重要,但是会用的话可以提高变成速度哈哈。就是把图片转换成灰度的。
【参数】
- num_output_channels (int) – 正常情况下灰度图片是单通道的,但是这里你可以设置成3,这样的话,会输出3个通道的灰度图片(三个通道的特征值相同),这样的话,你就不用修改torchvision的预训练模型中的输入接口了。(因为之前提到的,预训练模型使用ImageNet训练的,输入都是三通道彩色图)
2.7 size
【代码】
torchvision.transforms.Resize(size, interpolation=2)
【介绍】
把PIL图片resize成指定大小
【参数】
- size (tuple(height,width) or int) – tuple的话就直接resize成指定大小;int的话,就按照比例,让图片的短边长度变成int大小。
- interpolation (int, optional) – 插值方法,一般都使用默认的PIL.Image.BILINEAR双重线性插值。
2.8 概率随机(常用)
图像增强有:变成灰度,镜像,翻转,平移,旋转等。
【代码】
# 变成灰度,输入输出通道数默认相同
torchvision.transforms.RandomGrayscale(p=0.1)
# 随机水平翻转
torchvision.transforms.RandomHorizontalFlip(p=0.5)
# 随机竖直翻转
torchvision.transforms.RandomVerticalFlip(p=0.5)
【参数】
- p:表示执行这个transform的概率
3 Tensor上的操作
3.1 标准化Normalize
【代码】
torchvision.transforms.Normalize(mean, std, inplace=False)
【参数】
- mean和std都是list,[mean_1,...,mean_n]和[std_1,...,std_n],n为通道数。每一个通道都应该有一个mean和std。计算的方法是,就是常用的那种:
\(output[channel] = \frac{(input[channel] - mean[channel]) } {std[channel]}\)
4 PIL,Tensor转换函数
4.1 ToPILImage
torchvision.transforms.ToPILImage(mode=None)
【介绍】
把一个tensor或者np的array转换成PIL。值得注意的是,如果输入时Tensor,那么维度应该是 C x H x W ,如果是numpy的话,是 H x W x C。 (这是一个一般不会出现,但是一旦出现很难想到的问题。)
4.2 ToTensor
torchvision.transforms.ToTensor
【介绍】
把PIL或者numpy转换成Tensor。PIL和Numpy (格式H x W x C,范围[0,255]),转换成Tensor(格式C x H x W,范围[0,1])
5 案例代码分析
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()
【小白学PyTorch】7 最新版本torchvision.transforms常用API翻译与讲解的更多相关文章
- 【小白学PyTorch】20 TF2的eager模式与求导
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...
- 【小白学PyTorch】5 torchvision预训练模型与数据集全览
文章来自:微信公众号[机器学习炼丹术].一个ai专业研究生的个人学习分享公众号 文章目录: 目录 torchvision 1 torchvision.datssets 2 torchvision.mo ...
- 【小白学PyTorch】8 实战之MNIST小试牛刀
文章来自微信公众号[机器学习炼丹术].有什么问题都可以咨询作者WX:cyx645016617.想交个朋友占一个好友位也是可以的~好友位快满了不过. 参考目录: 目录 1 探索性数据分析 1.1 数据集 ...
- 【小白学PyTorch】9 tensor数据结构与存储结构
文章来自微信公众号[机器学习炼丹术]. 上一节课,讲解了MNIST图像分类的一个小实战,现在我们继续深入学习一下pytorch的一些有的没的的小知识来作为只是储备. 参考目录: @ 目录 1 pyto ...
- 【小白学PyTorch】13 EfficientNet详解及PyTorch实现
参考目录: 目录 1 EfficientNet 1.1 概述 1.2 把扩展问题用数学来描述 1.3 实验内容 1.4 compound scaling method 1.5 EfficientNet ...
- 【小白学PyTorch】15 TF2实现一个简单的服装分类任务
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...
- 【小白学PyTorch】11 MobileNet详解及PyTorch实现
文章来自微信公众号[机器学习炼丹术].我是炼丹兄,欢迎加我微信好友交流学习:cyx645016617. @ 目录 1 背景 2 深度可分离卷积 2.2 一般卷积计算量 2.2 深度可分离卷积计算量 2 ...
- 【小白学PyTorch】18 TF2构建自定义模型
[机器学习炼丹术]的炼丹总群已经快满了,要加入的快联系炼丹兄WX:cyx645016617 参考目录: 目录 1 创建自定义网络层 2 创建一个完整的CNN 2.1 keras.Model vs ke ...
- 【小白学PyTorch】21 Keras的API详解(上)卷积、激活、初始化、正则
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑答疑解惑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx6450 ...
随机推荐
- 入门python有什么好的书籍推荐?纯干货推荐,你值得一看 python基础,爬虫,数据分析
Python入门书籍不用看太多,看一本就够.重要的是你要学习Python的哪个方向,或者说你对什么方向感兴趣,因为Python这门语言的应用领域比较广泛,比如说可以用来做数据分析.机器学习,也可以用来 ...
- 内网 Maven 编译
内网 Maven 编译 有个特殊的需求,在不联网的情况下编译 Java 项目. 想到两种方案: 搭建 Nexus 私有镜像仓库. 直接把依赖 jar包 放在编译机的 maven 本地库中. 步骤简述 ...
- IndexFlatL2、IndexIVFFlat、IndexIVFPQ三种索引方式示例
上文针对Faiss安装和一些原理做了简单说明,本文针对标题所列三种索引方式进行编码验证. 首先生成数据集,这里采用100万条数据,每条50维,生成数据做本地化保存,代码如下: import numpy ...
- 文件上传Upload 学习笔记
整理完自己还有点晕,看来还是得找点靶场自己练习练习Orz 1:客户端JavaScript校验 Burp改包即可 2:服务端对Content-Type进行校验 猜测后,修改对应Content-Type字 ...
- leetcode刷题笔记-1. 两数之和(java实现)
题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...
- Android 开发学习进程0.12 自定义view activity的属性
设置类似钉钉或tel的圆形用户名首字母头像 设置有两种方法,一是使用已有的库或自定义的view组件,但如果确定只是文字头像,也可使用textview的backgrou属性,调整资源文件使textvie ...
- try-catch-finally异常处理:
java中三种实现多态的方案: 一:父类:普通类,普通方法: 子类:普通类,普通方法: 二:父类:抽象类,抽象方法: 子类:普通类,重写父类的抽象方法: 三:父类:接口类,抽象方法: 子类:普通类,实 ...
- 二、JAVA 的了解与安装
1.java了解 1.1.java三大版本 javaSE:标准版(桌面程序,控制台开发...) javaME:嵌入式开发(手机.小家电...)[可以忽略] javaEE:企业版开发(web端,服务器开 ...
- Linux下mv命令高级用法
mv 也是 Linux 下一个使用频率非常高的命令,但除了一些基本用法,你还知道它的哪些高级用法呢? 1. 基本用法 移动一个/多个文件: 移动一个/多个目录: 重命名文件/目录. 这些都是很基本的用 ...
- centos7上借助于xargs快速查询并卸载rpm软件
在centos上卸载某些软件的时候,如果查询的软件包比较多,可以考虑使用xargs,边查询边卸载 如:下面在查询mysql包时候,将查询结果通过管道传送给xargs,然后使用rpm -e --node ...