torchvision
torchvision介绍
torchvision
是一个与Pytorch深度学习框架紧密集成的计算机视觉库。它提供了许多用于图像处理、数据加载、模型预训练以及常见视觉任务(如图像分类、目标检测等)的工具和函数
torchvision模块
torchvision.datasets
用于加载特定数据集
这个模块提供了一组常用的视觉数据集,例如 CIFAR、MNIST、ImageNet
等。每个数据集都是一个 Dataset
对象,可以很容易地与 PyTorch
的数据加载器(DataLoader
)一起使用。
torchvison.datasets
提供了多种数据集,以下是一些常用的数据集:
CIFAR
:CIFAR-10
和CIFAR-100
数据集,用于图像分类任务MNIST
:手写数据集,用于图像分类任务ImageNet
:大规模视觉数据库,用于图像分类任务COCO
:用于目标检测、分割和标注的数据集VOC
:PASCAL Visual Object Classes 数据集,用于目标检测和分割任务FasionMNIST
:与MNIST
类似但更复杂
比如:
1 |
|
参数解释:
root
:数据集的根目录,即数据集存储在本地文件系统中的位置,用于存储下载的数据集train
:布尔值,指定是加载训练集还是测试集,如果是True
,则加载训练集download
:布尔值,如果为True
,则自动下载数据集transform
:一个或多个图像变换操作,用于预处理图像
其他数据集的使用方式与 CIFAR-10 类似,只是参数和变换可能有所不同。例如,加载 MNIST 数据集时,由于图像是灰度的,可能不需要归一化操作,或者需要将单通道图像扩展为三通道。
如果datasets
中的数据集下载速度很慢,可以使用如下方式:
1 |
|
然后再使用datasets
下载:
1 |
|
用于加载自定义数据集
可以使用torchvision.datasets.ImageFolder
方法,适用于以下场景:
- 图像分类任务,其中每个文件夹代表一个类别
ImageFolder
假设数据集的文件夹结构是以类别命名的子文件夹,每个子文件夹中包含属于该类别的图像文件。ImageFolder
自动将文件夹名称作为类别标签,并加载图像数据。
数据集结构:
1 |
|
在这里,class1
、class2
等是类别的名称,也是文件夹的名称。每个文件夹内部包含了属于该类别的所有图像。
在使用 ImageFolder
加载这个数据集时,class_1
、class_2
和
class_3
将分别被自动标注为 0、1 和
2。这些整数索引就是模型训练时使用的类别标签。
主要参数:
root
:数据集的根目录路径。transform
:一个函数,用于对图像进行预处理和增强。target_transform
:一个函数,用于对标签进行转换。loader
:用于加载图像的函数,默认是default_loader
,它使用PIL
来加载图像。is_valid_file
:一个函数,用于判断文件是否有效(例如,根据文件扩展名)。
示例:
1 |
|
输出:{'class_1': 0, 'class_2': 1, 'class_3': 2}
1 |
|
输出:['class_1', 'class_2', 'class_3']
torchvision.transforms
torchvision.transforms
是一个提供了一系列图像变换(transform)操作的模块,这些操作可以在加载图像数据时对其进行预处理和增强。
常见变换:
ToTensor
:将PIL图像或NumPy ndarray转换为Tensor,并自动将像素值从[0, 255]范围归一化到[0, 1],将颜色通道从HWC
(高度、宽度、通道)格式转换为CHW
(通道、高度、宽度)格式。参数可以为PIL
图片或者Ndarray
数组
PIL图像或NumPy数组到Tensor:
- 对于PIL图像,
ToTensor
会将其转换为NumPy数组。 - 对于NumPy数组,
ToTensor
会直接使用该数组。
调整颜色通道顺序:
- 输入图像的形状通常是
(H, W, C)
,其中H
是高度,W
是宽度,C
是通道数(例如,RGB图像的C
为3)。 ToTensor
会将形状转换为(C, H, W)
,这是PyTorch张量表示图像的默认格式。
归一化像素值:
- 像素值通常在
[0, 255]
范围内。 ToTensor
会将像素值除以255,将其归一化到[0, 1)
范围。
比如:
1 |
|
Normalize
:用均值(mean)和标准差(std)对图像的每个通道进行归一化,使得每个通道的平均值和标准差为mean[i]
和std[i]
。这种处理可以消除图像数据中的量纲差异,使得模型训练更加稳定,参数为mean
和std
:
mean
(sequence):一个序列,表示每个通道的均值。序列的长度应该与图像的通道数相匹配std
(sequence):一个序列,表示每个通道的标准差。序列的长度也应该与图像的通道数相匹配
Normalize
对象期望输入是一个Tensor,且形状为
[C, H, W]
,其中 C
是通道数,H
是高度,W
是宽度。通常在应用 Normalize
之前,会先使用 ToTensor
变换将PIL图像或NumPy数组转换为Tensor。
在应用 Normalize
之前,确保图像数据的像素值已经转换为合适的范围,通常是通过
ToTensor
变换将像素值从 [0, 255]
转换到
[0, 1)
均值和标准差的来源:均值和标准差通常是通过对大量训练图像进行统计得到的。在许多预训练模型中,这些值是预先计算好的,并且作为模型的一部分提供。
比如:
1 |
|
Resize
:调整图像的大小到指定的尺寸,尺寸可以是单个整数,表示图像的短边将被调整到该值,长边将按比例缩放;也可以是一个元组,表示图像将被调整到指定的宽度和高度。参数:size
(int or sequence): 指定调整后的图像尺寸。如果是一个整数,那么图像的短边将被调整到这个值,长边将按比例缩放。如果是一个元组,那么图像将被调整到指定的宽度和高度。interpolation
(int, optional): 指定插值方法。默认是PIL.Image.BILINEAR
。其他可选的插值方法包括PIL.Image.NEAREST
、PIL.Image.BICUBIC
等。NEAREST
: 最近邻插值,速度最快,但质量最差BILINEAR
: 双线性插值,平衡了速度和质量BICUBIC
: 双三次插值,质量更好,但速度较慢LANCZOS
: Lanczos插值,高质量,适用于放大图像
Resize
对象输入的为PIL
图像或Ndarray
数组
比如:
1 |
|
CenterCrop
:从图像中心裁剪出指定大小的区域。参数:size
:一个表示裁剪尺寸的元组(height, width)
,或者一个表示正方形裁剪尺寸的整数。如果是一个整数,那么裁剪区域的高度和宽度将相等
CenterCrop
对象的输入为PIL
图像或Ndarray
数组,如果输入是NumPy数组,它应该是一个形状为
(H, W, C)
的数组。
比如:
1 |
|
RandomCrop
:随机裁剪出指定大小的区域。参数:size
:一个表示裁剪尺寸的元组(height, width)
,或者一个表示正方形裁剪尺寸的整数。如果是一个整数,那么裁剪区域的高度和宽度将相等padding
(可选):一个表示填充大小的元组(padding_left, padding_top, padding_right, padding_bottom)
,或者一个表示等边填充的整数。填充用于在裁剪前增加图像的边界,以便于在边界附近进行裁剪pad_if_needed
(可选):布尔值,表示是否只在需要时进行填充(即当原始图像尺寸小于裁剪尺寸时)fill
(可选):填充颜色,默认为0。用于指定填充区域的像素值padding_mode
(可选):填充模式,可以是constant
、edge
、reflect
或symmetric
RandomCrop
对象输入的为PIL
图像或Ndarray
数组,如果输入是NumPy数组,它应该是一个形状为
(H, W, C)
的数组。
比如:
1 |
|
RandomHorizontalFlip
:以一定的概率随机水平翻转图像。参数:p
:一个介于0和1之间的浮点数,表示图像被水平翻转的概率。默认值为0.5,即图像有50%的概率被翻转
RandomHorizontalFlip
对象可以处理PIL
图像和NumPy数组。如果输入是NumPy数组,它应该是一个形状为
(H, W, C)
的数组
比如:
1 |
|
RandomVerticalFlip
:以一定的概率随机垂直翻转图像。参数:p
:一个介于0和1之间的浮点数,表示图像被垂直翻转的概率。默认值为0.5,即图像有50%的概率被翻转
RandomVerticalFlip
可以处理PIL图像和NumPy数组。如果输入是NumPy数组,它应该是一个形状为
(H, W, C)
的数组
比如:
1 |
|
RandomRotation
: 随机旋转图像一定的角度。参数:degrees
:旋转的角度范围,可以是一个单一的数值(表示在-degrees
到degrees
之间随机选择),也可以是一个元组(min, max)
(表示在min
到max
之间随机选择)resample
:用于指定旋转时使用的重采样滤波器,默认为PIL.Image.NEAREST
。其他选项包括PIL.Image.BILINEAR
、PIL.Image.BICUBIC
等expand
:布尔值,表示是否扩大图像的边界以适应旋转后的图像。如果为True
,则输出图像的尺寸可能会比原始图像大center
:旋转的中心点,默认为图像的中心。可以指定为(x, y)
形式的元组fill
:用于填充旋转后图像边缘的颜色,可以是一个整数或一个元组。默认为0,表示黑色
RandomRotation
可以处理PIL图像和NumPy数组。如果输入是NumPy数组,它应该是一个形状为
(H, W, C)
的数组
比如:
1 |
|
组合变换:
Compose
:将多个变换操作组合在一起,按顺序应用。参数transforms
:一个变换列表,列表中的每个元素都是一个图像变换对象
Compose
中的变换需要兼容输入图像的类型。例如,ToTensor
变换将PIL图像或NumPy数组转换为Tensor,之后的变换需要能够处理Tensor类型
比如:
1 |
|
其他变换:
Pad
: 对图像进行填充。填充是指在图像的边界添加额外的像素,通常用于调整图像尺寸、保持图像的宽高比(在将图像缩放到特定尺寸时,通过填充可以保持原始图像的宽高比)或为后续的图像处理步骤(如卷积神经网络中的卷积操作)做准备。某些神经网络架构要求输入图像具有特定的尺寸,通过填充可以满足这些要求。参数:padding
:整数或元组,表示要添加的像素数。如果是一个整数,则所有边都添加相同数量的像素。如果是元组,则格式应为(left, top, right, bottom)
,分别表示左、上、右、下边要添加的像素数fill
:填充像素的值,默认为0。可以是整数或元组,如果是元组,则应与图像的通道数相匹配padding_mode
:填充模式,默认为constant
。其他可选模式包括edge
、reflect
和symmetric
填充模式:
'constant'
:用常量值填充,默认为0。'edge'
:用边缘像素值填充。'reflect'
:以边缘为轴进行反射填充。'symmetric'
:以边缘为轴进行对称填充。
比如:
1 |
|
Grayscale
: 将图像转换为灰度图。灰度图像只包含亮度信息,没有颜色信息,每个像素值表示灰度级别。参数:num_output_channels
:输出图像的通道数,默认为1,可以选1或3。如果设置为3,则输出图像将为3通道,但所有通道的值相同,相当于将灰度图扩展为伪彩色图
彩色图像到灰度图像的转换通常使用以下公式:
\[ \text{Grayscale} = 0.2989 \times R + 0.5870 \times G + 0.1140 \times B \] 其中 \(R, G, B\) 分别是红色、绿色和蓝色通道的像素值。这个公式是基于人眼对不同颜色敏感度的加权平均。
比如:
1 |
|
RandomAffine
: 随机应用仿射变换。RandomPerspective
: 随机应用透视变换。RandomErasing
: 随机擦除图像中的部分区域。ColorJitter
: 随机改变图像的亮度、对比度、饱和度和色调。brightness
:一个浮点数或元组,表示亮度调整的范围。如果是一个浮点数,则表示亮度调整的最大幅度(相对于原始亮度)。如果是元组(min, max)
,则表示亮度调整的最小和最大幅度。值为0表示不调整亮度。contrast
:一个浮点数或元组,表示对比度调整的范围。解释与brightness
类似。saturation
:一个浮点数或元组,表示饱和度调整的范围。解释与brightness
类似。hue
:一个浮点数或元组,表示色相调整的范围。解释与brightness
类似,但通常这个值较小,因为色相的调整对图像外观影响较大。
比如:
1
transform = transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.1)
brightness=0.5
:亮度可以在原始亮度的 50% 到 150% 之间随机调整。contrast=0.5
:对比度可以在原始对比度的 50% 到 150% 之间随机调整。saturation=0.5
:饱和度可以在原始饱和度的 50% 到 150% 之间随机调整。hue=0.1
:色相可以在原始色相的 ±10% 之间随机调整。
RandomResizedCrop(size, scale, ratio)
:用于随机裁剪图像的一部分,并将其缩放到指定的大小。size
:一个整数或元组,表示输出图像的大小。如果是一个整数,则输出图像是正方形;如果是元组(height, width)
,则输出图像是矩形。scale
:一个元组(min_area, max_area)
,表示裁剪区域面积相对于原始图像面积的比例范围。例如,(0.8, 1.0)
表示裁剪区域的面积将在原始图像面积的 80% 到 100% 之间。ratio
:一个元组(min_ratio, max_ratio)
,表示裁剪区域的宽高比范围。例如,(0.9, 1.1)
表示裁剪区域的宽高比将在 0.9 到 1.1 之间。
torchvision.model
torchvision.model
是PyTorch的torchvision
库中的一个模块,它提供了许多预训练的深度学习模型,这些模型主要用于图像分类、目标检测、语义分割等计算机视觉任务。这些模型都是基于PyTorch构建的,因此可以很容易地集成到PyTorch项目中。
常用模型:
- 图像分类:(ImageNet数据集,\(224\times224\)尺寸图像)
resnet18
,resnet34
,resnet50
,resnet101
,resnet152
:ResNet 系列。alexnet
:AlexNet。vgg11
,vgg13
,vgg16
,vgg19
:VGG 系列。squeezenet1_0
,squeezenet1_1
:SqueezeNet。densenet121
,densenet169
,densenet201
,densenet161
:DenseNet 系列。inception_v3
:Inception v3。googlenet
:GoogLeNet。shufflenet_1x1
,shufflenet_2x2
:ShuffleNet 系列。mobilenet_v2
:MobileNet v2。resnext50_32x4d
,resnext101_32x8d
:ResNeXt 系列。wide_resnet50_2
,wide_resnet101_2
:Wide ResNet 系列。mnasnet0_5
,mnasnet1_0
:MNASNet 系列。
- 目标检测:
fasterrcnn_resnet50_fpn
:Faster R-CNN with ResNet-50 FPN。maskrcnn_resnet50_fpn
:Mask R-CNN with ResNet-50 FPN。keypointrcnn_resnet50_fpn
:Keypoint R-CNN with ResNet-50 FPN。
- 语义分割:
fcn_resnet101
:FCN with ResNet-101。deeplabv3_resnet101
:DeepLabV3 with ResNet-101。
比如:
1 |
|
参数说明:
pretrained
(布尔值,默认为False):- 如果设置为True,则下载并加载预训练的权重。
- 如果设置为False,则不加载预训练权重,模型将以随机初始化的权重开始。
progress
(布尔值,默认为True):- 如果设置为True,则在下载预训练权重时显示进度条。
- 如果设置为False,则不显示进度条。
**kwargs
:- 这是一个可变长度参数列表,允许我们传递额外的关键字参数给模型的构造函数。
- 例如,我们可以通过
kwargs
传递num_classes
来指定输出层的类别数。
使用示例:
1 |
|