首页 > 其他分享 >【DL基础】torchvision数据集操作

【DL基础】torchvision数据集操作

时间:2024-09-24 14:48:40浏览次数:12  
标签:DL torchvision img 0.5 transforms 操作 剪裁 orig

 示例来源:PyTorch 深度学习实战 (geekbang.org)

1、图像裁剪

torchvision.transforms提供了多种剪裁方法,例如中心剪裁、随机剪裁、四角和中心剪裁等。我们依次来看下它们的定义。

  • 先说中心剪裁,顾名思义,在中心裁剪指定的 PIL Image 或 Tensor,其定义如下:
torchvision.transforms.CenterCrop(size)

其中,size表示期望输出的剪裁尺寸。如果 size 是一个像 (h, w) 这样的元组,则剪裁后的图像尺寸将与之匹配。如果 size 是 int 类型的整数,剪裁出来的图像是 (size, size) 的正方形。

  • 然后是随机剪裁,就是在一个随机位置剪裁指定的 PIL Image 或 Tensor,定义如下:
torchvision.transforms.RandomCrop(size, padding=None)

其中,size代表期望输出的剪裁尺寸,用法同上。而padding表示图像的每个边框上的可选填充。默认值是 None,即没有填充。通常来说,不会用padding这个参数,至少对于我来说至今没用过。

  • 最后要说的是FiveCrop,我们将给定的 PIL Image 或 Tensor ,分别从四角和中心进行剪裁,共剪裁成五块,定义如下:
torchvision.transforms.FiveCrop(size)

size可以是int或tuple,用法同上。

掌握了各种剪裁的定义和参数用法以后,我们来看一下这些剪裁操作具体如何调用,代码如下。

from PIL import Image
from torchvision import transforms 

# 定义剪裁操作
center_crop_oper = transforms.CenterCrop((60,70))
random_crop_oper = transforms.RandomCrop((80,80))
five_crop_oper = transforms.FiveCrop((60,70))

# 原图
orig_img = Image.open('jike.png') 
orig_img.show()

# 中心剪裁
img1 = center_crop_oper(orig_img)
img1.show()
# 随机剪裁
img2 = random_crop_oper(orig_img)
img2.show()
# 四角和中心剪裁
imgs = five_crop_oper(orig_img)
for img in imgs:
    img.show()

流程和Resize类似,都是先定义剪裁操作,然后使用裁剪操作对象对图像进行操作,将返回对应裁剪操作后的图像,具体剪裁效果如下表所示

2、图像翻转

torchvision.transforms提供了两种翻转操作,分别是:以某一概率随机水平翻转图像和以某一概率随机垂直翻转图像。我们分别来看它们的定义。

  • 以概率p随机水平翻转图像,定义如下:
torchvision.transforms.RandomHorizontalFlip(p=0.5)
  • 以概率p随机垂直翻转图像,定义如下:
torchvision.transforms.RandomVerticalFlip(p=0.5)

其中,p表示随机翻转的概率值,默认为0.5

这里的随机翻转,是为数据增强提供方便。如果想要必须执行翻转操作的话,将p设置为1即可

以极客时间的LOGO图片为例,图片翻转的代码如下

from PIL import Image
from torchvision import transforms 

# 定义翻转操作
h_flip_oper = transforms.RandomHorizontalFlip(p=1)
v_flip_oper = transforms.RandomVerticalFlip(p=1)

# 原图
orig_img = Image.open('jike.png') 
display(orig_img)

# 水平翻转
img1 = h_flip_oper(orig_img)
display(img1)
# 垂直翻转
img2 = v_flip_oper(orig_img)
display(img2)

流程与裁剪一致,都是先定义操作,然后使用操作对象对图像进行操作(此处为翻转操作对象),将返回对应操作后的结果,翻转效果如下表所示

3、图像标准化(只能对Tensor操作,不可对PIL Image对象操作)

标准化是指每一个数据点减去所在通道的平均值,再除以所在通道的标准差,数学的计算公式如下:

而对图像进行标准化,就是对图像的每个通道利用均值和标准差进行正则化。这样做的目的,是为了保证数据集中所有的图像分布都相似,这样在训练的时候更容易收敛,既加快了训练速度,也提高了训练效果

torchvision.transforms.Normalize(mean, std, inplace=False)
# 每个参数的含义为:
# mean:表示各通道的均值;
# std:表示各通道的标准差;
# inplace:表示是否原地操作,默认为否。

以极客时间的LOGO图片为例,以(R, G, B)均值和标准差均为(0.5, 0.5, 0.5)来标准化图片后的代码实现为:

from PIL import Image
from torchvision import transforms 

# 定义标准化操作
norm_oper = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))

# 原图
orig_img = Image.open('jk.jpg') 
orig_img.show()

# 图像转化为Tensor
img_tensor = transforms.ToTensor()(orig_img)

# 标准化
tensor_norm = norm_oper(img_tensor)

# Tensor转化为图像
img_norm = transforms.ToPILImage()(tensor_norm)
img_norm.show()

上面代码的过程是,首先定义了均值和标准差均为(0.5, 0.5, 0.5)的标准化操作,然后将原图转化为Tensor,接着对Tensor进行标准化,最后再将Tensor转化为图像输出,图像输出结果为:

4、组合变换

  • 上述对图像的变换操作都可以用 Compose 类组合起来,进行连续操作,Compose类是将多个变换组合到一起,它的定义如下
torchvision.transforms.Compose(transforms)
# transforms是一个Transform对象的列表,表示要组合的变换列表

比如,如果我们想要将图片变为200*200像素大小,并且随机裁切成80像素的正方形。那么我们可以组合Resize和RandomCrop变换,具体代码如下所示

from PIL import Image
from torchvision import transforms 

# 原图
orig_img = Image.open('jike.png') 
display(orig_img)

# 定义组合操作
composed = transforms.Compose([transforms.Resize((200, 200)),
                               transforms.RandomCrop(80)])

# 组合操作后的图
img = composed(orig_img)

运行结果为:

  • Compose操作常常与数据集读取操作同时使用,使数据在读取的同时做类型转换,这样读取出的数据直接就是完成预处理、增强等操作之后的了

以读取MNIST数据集为例,看下如何在读取数据的同时,完成数据预处理等操作。具体代码如下:

from torchvision import transforms
from torchvision import datasets

# 定义一个transform
my_transform = transforms.Compose([transforms.ToTensor(),
                                   transforms.Normalize((0.5), (0.5))
                                  ])
# 读取MNIST数据集 同时做数据变换
mnist_dataset = datasets.MNIST(root='./data',
                               train=False,
                               transform=my_transform,
                               target_transform=None,
                               download=True)

可以看到,在读取数据集,即获取DataSet抽象类的派生类实例时,可以直接传入transforms.Compose类型的参数,表示读取数据的同时做对应的变换

标签:DL,torchvision,img,0.5,transforms,操作,剪裁,orig
From: https://blog.csdn.net/weixin_44351244/article/details/142488638

相关文章

  • 2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数
    2024-09-18:用go语言,给定一个从0开始的长度为n的正整数数组nums和一个二维操作数组queries,每个操作由一个下标值indexi和一个数值ki组成。开始时,数组中的所有元素都是未标记的。依次执行m次操作,每次操作的过程如下:1.如果下标indexi对应的元素还未标记,则标记这个元素......
  • git误操作带来的麻烦-merge
    git误操作带来的麻烦-merge我想将一个分支的内容完全覆盖远程另外一个分支的内容怎么做如果你想将一个本地分支(我们称之为source-branch)的内容完全覆盖远程的另一个分支(我们称之为target-branch),可以按照以下步骤操作。但请注意,这种方法会永久性地改变target-branch的提交历史,所......
  • 照片去水印怎么操作?3个高清壁纸无损去水印的教程分享
    上网真好啊!能够找到好多摄影大神分享的,超好看的自然景物照片,每一张都想拿来当电脑桌面壁纸、手机壁纸......但上网拿的照片有这点不好,就是大部分照片都带有防盗水印,虽说不影响照片的整体美观,但作为壁纸,咱总是有些奇奇怪怪的强迫症在,所以大家有用到好用的照片去水印的工具吗?......
  • 《深入解析 Java 中的 ThreadLocal》
    ThreadLocal1.概述ThreadLocal被称为线程局部变量,用于在线程中保存数据。由于在ThreadLocal中保存的数据仅属于当前线程,所以该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal用于在同一个线程间,在不同的类和方法之间共享数据的的场景,也可以......
  • 在 PowerShell 中,有多个命令与 IPv6 相关。以下是一些常用的命令和 cmdlet: 管理和配置
    在PowerShell中,有多个命令与IPv6相关。以下是一些常用的命令和cmdlet:获取网络适配器的IPv6地址:powershellCopyCodeGet-NetIPAddress-AddressFamilyIPv6查看所有网络适配器信息:powershellCopyCodeGet-NetAdapter查看特定网络适配器的IPv6地址:powershell......
  • JavaScript 对象的基本操作及相关知识点详解
    在JavaScript中,对象是一种基本的数据结构,以键值对形式保存数据且数据没有顺序,它可以包含多种数据类型的属性和方法。1.创建对象的方法字面量写法: let自定义对象名={}构造函数写法:let自定义对象名=newObject();//字面量写法letperson={};//构造函数......
  • 桌球计时计费系统计费方式有哪些 哪个好用 佳易王台球计时计费管理系统操作教程
    一、前言桌球计时计费系统计费方式有哪些哪个好用佳易王台球计时计费管理系统操作教程 1、佳易王桌球计时计费软件,可以多种单价计费方式,具体使用哪种计费方式可以根据自己的情况设置即可。2、软件已内置数据库不需再安装,解压即可。二、软件程序图文说明 1、默认计费......
  • Python知识点:如何使用Python与Java进行互操作(Jython)
    开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候!Jython是一种完全兼容Java的Python实现,它将Python代码编译成Java字节码,这样就可以在Java虚拟机(JVM)上运行。使用Jython,你可以无缝地调用Java类库和P......
  • CENTOS操作系统的安装
    目录1文档概要1.1目的1.2准备说明1.3基本配置标准(必须)2系统安装(以centos为例)2.1从引导介质引导后,选择InstallCentOS72.2设置时区为中国上海,添加中文支持2.3设置安装磁盘2.4开始安装2.5设置root密码3系统基本配置3.1开启SSH3.2关闭防火墙3.3关闭selin......
  • 【超强总结】Python100个核心操作
    今天分享的Python核心操作,是围绕数据科学的周边展开,涉及到Numpy、Pandas、以及机器学习库,sklearn、pytorch、TensorFlow等等。1.导入库并设置默认参数介绍:导入Python数据科学常用库并设定一些默认参数,例如显示所有列、禁止科学计数法等。示例:importnumpyasnpi......