torchvision transform库学习总结

本文介绍了torchvision库中的图像变换方法,包括组合变换、数据类型转换、张量归一化等。通过实例展示了如何使用这些变换来预处理图像数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

torchvision transform库学习总结

参考了https://www.pytorchtutorial.com/docs/torchvision/torchvision-transform/

首先,在torchvision transform库中,大致有以下几类方法

1.一个类似数组的操作

class torchvision.transforms.Compose(transforms)

2.各种数据类型的转换

class torchvision.transforms.ToTensor
class torchvision.transforms.ToPILImage

3.对Tensor进行变换

class torchvision.transforms.Normalize(mean, std)

4.对PIL.Image进行变换

class torchvision.transforms.CenterCrop(size)
class torchvision.transforms.RandomCrop(size, padding=0)
class torchvision.transforms.RandomHorizontalFlip()
class torchvision.transforms.RandomResizedCrop(size, interpolation=2)
class torchvision.transforms.Pad(padding, fill=0)

在运行本教程之前,请先导入包:

import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
----------------------------------------------------------------------------------------------------------

同时我在项目的目录下面的data文件夹放了一个image.jpg图片
原图是
在这里插入图片描述

----------------------------------------------------------------------------------------------------------

下面将按顺序介绍:

class torchvision.transforms.Compose(transforms)

将多个transform组合起来使用。

from torchvision import transforms as transforms
transform = transforms.Compose([
    transforms.RandomCrop(32, padding=4),  #先四周填充0,在吧图像随机裁剪成32*32
    transforms.RandomHorizontalFlip(),  #图像一半的概率翻转,一半的概率不翻转
    transforms.RandomRotation((-45,45)), #随机旋转
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)), #R,G,B每层的归一化用到的均值和方差
])

这里在执行的时候会按照顺序执行,先执行transforms.RandomCrop(32, padding=4),最后执行transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)),所以这里一定要注意类型的问题,这些方法有的使用的是Tensor类型,有些是PIL.Image的类型。具体的可以看后面的使用

class torchvision.transforms.ToTensor

把一个取值范围是[0,255]的PIL.Image或者shape为(H,W,C)的numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]的torch.FloadTensor

输入代码
data = np.random.randint(0, 255, size=300)
img = data.reshape(10,10,3)
print(img.shape)
img_tensor = transforms.ToTensor()(img) # 转换成tensor
print(img_tensor.shape)
输出结果
(10, 10, 3)
torch.Size([3, 10, 10])

class torchvision.transforms.ToPILImage

将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变。但是要注意是这个方法好像只支持uint8的数据类型

输入代码
data = np.random.randint(0, 255, size=300, dtype='uint8')
img = data.reshape(10,10,3)
print(img.shape)
img_PIL = transforms.ToPILImage()(img)
print(img_PIL.size)
print(img_PIL.mode)
输出结果
(10, 10, 3)
(10, 10)
RGB

class torchvision.transforms.Normalize(mean, std)

给定均值:(R,G,B) 方差:(R,G,B),将会把Tensor正则化。即:Normalized_image=(image-mean)/std。
这个就不解释了,输入mean和std,直接执行公式Normalized_image=(image-mean)/std,但是要注意的是这个处理的数据要求是Tensor类型的。所以在使用class torchvision.transforms.Compose(transforms)的时候要注意将这个类放在class torchvision.transforms.ToTensor后面

class torchvision.transforms.CenterCrop(size)

将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,(target_height, target_width)。size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。

输入代码
transform = transforms.Compose([transforms.CenterCrop(500), transforms.ToTensor()])

image = Image.open('./data/image.jpg')

print(np.array(image).shape)

img1 = transform(image)
print(img1.shape)

plt.imshow(np.transpose(img1, (1, 2, 0)))
plt.show()
输出
(606, 910, 3)
torch.Size([3, 500, 500])

在这里插入图片描述

class torchvision.transforms.RandomCrop(size, padding=0)

切割中心点的位置随机选取。size可以是tuple也可以是Integer。这个和上面的那个方法比较类似,但是这个切的比较随机了,切好的图片的中心点是从原图中随机选择的,当然选择的中心点肯定是可以保证切出来的图片满足size的要求的

输入代码
transform = transforms.Compose([transforms.RandomCrop(500, padding=100), transforms.ToTensor()])

image = Image.open('./data/image.jpg')

print(np.array(image).shape)

img1 = transform(image)
print(img1.shape)

plt.imshow(np.transpose(img1, (1, 2, 0)))
plt.show()
输出结果
(606, 910, 3)
torch.Size([3, 500, 500])

多切几次,结果不同
在这里插入图片描述在这里插入图片描述

class torchvision.transforms.RandomHorizontalFlip()

随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。

输入代码,这个可以多运行几次,你会发现不一样的
transform = transforms.Compose([transforms.RandomHorizontalFlip(), transforms.ToTensor()])

image = Image.open('./data/image.jpg')

print(np.array(image).shape)

img1 = transform(image)
print(img1.shape)

plt.imshow(np.transpose(img1, (1, 2, 0)))
plt.show()
输出
(606, 910, 3)
torch.Size([3, 606, 910])

在这里插入图片描述
你可以看到这个图片和原图进行了镜像反转

class torchvision.transforms.RandomResizedCrop(size, interpolation=2)

先将给定的PIL.Image随机切,然后再resize成给定的size大小。这个函数已经改成了RandomResizedCrop,以前的RandomSizedCrop已经被弃用了,这里是使用插值的方式将随机切的图片填充成你需要的大小,但是size只能是一个整数,也就是说只能切出来一个正方形的

输入代码
transform = transforms.Compose([transforms.RandomResizedCrop(500, interpolation=1), transforms.ToTensor()])

image = Image.open('./data/image.jpg')

print(np.array(image).shape)

img1 = transform(image)
print(img1.shape)

plt.imshow(np.transpose(img1, (1, 2, 0)))
plt.show()
输出结果
(606, 910, 3)
torch.Size([3, 500, 500])

在这里插入图片描述在这里插入图片描述

class torchvision.transforms.Pad(padding, fill=0)

将给定的PIL.Image的所有边用给定的pad value填充。 padding:要填充多少像素 fill:就是一个很简单的填充函数,这里就不演示了

<think>好的,用户现在想了解torchvision的作用以及解决相关的警告问题。首先,我需要先回顾之前的对话,确保回答的一致性。用户之前遇到了两个主要问题:加载图像扩展失败和JIT装饰器的源码警告。现在用户明确提问,想知道torchvision的功能及其在PyTorch中的作用,同时解决环境依赖的问题。 首先,我应该详细解释torchvision的功能。这包括它提供的标准数据集、模型架构、图像转换工具和IO功能。需要分点说明,让用户清楚每个部分的作用。比如,提到ImageNet数据集、预训练模型、Compose工具和read_image函数等。 接下来,针对用户提到的警告问题,需要分析原因。之前的回答已经指出缺少libjpeg/libpng或安装问题,现在需要再次强调这一点。用户引用中提到了Windows下的错误,可能用户使用的是Windows系统,所以需要给出适用于不同系统的解决方案,包括Ubuntu、CentOS、MacOS和Windows。 用户引用的部分提到了通过源代码安装torchvision时出现的错误,这可能是由于依赖项未正确安装或者CUDA版本不兼容。因此,在解决方案中需要分步骤指导用户安装系统依赖、重新安装torchvision,并验证安装。需要特别指出Windows用户可能需要安装第三方,比如通过conda安装libpng和jpeg,或者使用预编译的包。 此外,用户可能对如何验证问题是否解决感兴趣,所以需要提供验证步骤,比如检查HAS_JPEG和HAS_PNG是否为True,以及测试读取图像的功能。 还需要注意用户之前提到的JIT警告,但当前问题主要集中在image扩展的问题,所以可能需要简要提到如何处理,但主要焦点应放在环境依赖上。如果用户的问题中没有提到JIT警告,可以暂时不深入,但之前的回答已经涵盖过,可能需要简要提及。 最后,生成相关问题时要围绕torchvision的功能和应用,以及环境配置的常见问题,帮助用户进一步学习。例如,数据集加载、预训练模型使用、性能优化等。 需要确保回答结构清晰,分点明确,步骤详细,并且语言简洁易懂。同时,引用之前提供的引用标记,比如[^1][^2][^3],但根据用户提供的引用内容,可能需要调整引用编号。用户提供的引用中,引用[1]是Windows下的问题,引用[2]是Ubuntu下的安装错误,引用[3]是安装Pytorch的步骤。在回答中需要适当引用这些内容,但根据用户当前的问题,可能主要参考引用[1]和[2]的解决方案。 总结回答结构:先介绍torchvision的功能和作用,然后详细说明解决环境问题的步骤,包括不同操作系统的安装方法,最后验证解决效果,并附上相关问题。</think>--- ### Torchvision 核心功能解析 **核心作用**:PyTorch的官方图像处理扩展,提供三组关键能力: 1. **标准数据集接口**: - 预置$ImageNet$、$CIFAR10$等数据集加载器 - 支持自动下载与预处理 ```python from torchvision.datasets import CIFAR10 dataset = CIFAR10(root='./data', download=True) ``` 2. **模型架构与预训练权重**: - 提供$ResNet$、$VGG$等经典模型的预训练版本 - 支持迁移学习快速实现 ```python from torchvision.models import resnet50 model = resnet50(weights='IMAGENET1K_V2') ``` 3. **图像变换工具链**: - 包含$Compose$、$RandomCrop$等200+图像增强操作 - 支持张量与PIL图像互转 ```python from torchvision.transforms import Compose, RandomHorizontalFlip transform = Compose([RandomHorizontalFlip(p=0.5)]) ``` 4. **跨平台IO支持**: - 实现$read_image$/$write_jpeg$等硬件加速操作 - 支持视频解码(依赖FFmpeg)[^1] --- ### 图像扩展加载失败问题修复指南 **根本原因**:系统缺少`libjpeg`/`libpng`动态链接或`torchvision`编译时未正确链接这些[^2] #### 分系统解决方案 **Linux (Ubuntu/Debian)** ```bash # 安装编译依赖 sudo apt-get install libjpeg-dev libpng-dev zlib1g-dev # 强制重建torchvision pip uninstall torchvision -y pip install --no-cache-dir torchvision ``` **Windows (Anaconda)** ```bash # 通过conda安装二进制依赖 conda install -c conda-forge libjpeg-turbo libpng # 重装匹配CUDA版本的torchvision conda install pytorch torchvision cudatoolkit=11.8 -c pytorch -c nvidia ``` **MacOS** ```bash # 安装Homebrew依赖 brew install jpeg libpng # 重建Python包 pip uninstall torchvision CFLAGS="-I/opt/homebrew/include" LDFLAGS="-L/opt/homebrew/lib" pip install torchvision ``` --- ### 验证修复效果 ```python import torchvision # 检查编解码器支持状态 print(torchvision._C.HAS_JPEG) # 应输出True[^3] print(torchvision._C.HAS_PNG) # 应输出True # 测试实际图像加载 from torchvision.io import read_image img = read_image("test.jpg") # 无警告即成功 ``` --- ### 进阶配置技巧 **加速图像处理** ```python # 启用GPU加速解码(需CUDA版torchvision) from torchvision.io import ImageReadMode img = read_image("image.jpg", mode=ImageReadMode.RGB_ALIGNED) ``` **多格式支持扩展** ```bash # 安装WebP支持(Linux) sudo apt-get install libwebp-dev pip install --force-reinstall torchvision ``` --- ### 常见问题排查 **Q1:已安装依赖但依然报错?** - 确认动态路径已加入环境变量: ```bash # Linux/Mac export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH # Windows 添加C:\Program Files\libjpeg-turbo\bin到PATH ``` **Q2:conda与pip混合安装导致冲突?** - 使用虚拟环境隔离: ```bash conda create -n torch_env python=3.9 conda activate torch_env conda install pytorch torchvision -c pytorch ``` --- ### 扩展学习 1. **图像预处理流水线设计** ```python from torchvision.transforms import v2 transform = v2.Compose([ v2.RandomResizedCrop(224), v2.RandomRotation(30), v2.ToDtype(torch.float32, scale=True) ]) ``` 2. **自定义数据集构建** ```python class CustomDataset(torchvision.datasets.VisionDataset): def __init__(self, root, transform=None): super().__init__(root, transform=transform) # 实现__getitem__和__len__ ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值