官网地址:https://pytorch.org/vision/stable/index.html
Torchvision 是 PyTorch 的一个视觉处理工具包,独立于PyTorch,需要另外安装
它包括4个类,各类的主要功能如下:

举例,通过torchvision下载 MNIST (mnist 全称:mixed national institute of standards and technology database)
train_dataset = torchvision.datasets.MNIST(root,
train=True,
transform=transform,
download=True)
root :需要下载至地址的根目录位置
train:如果是True, 下载训练集 trainin.pt; 如果是False,下载测试集 test.pt; 默认是True
transform:一系列作用在PIL图片上的转换操作,返回一个转换后的版本
download:是否下载到 root指定的位置,如果指定的root位置已经存在该数据集,则不再下载
torchvision.datasets.ImageFolder(root, transform, target_transform, loader)
另外,该 API 有以下成员变量:
举例:数据存储结构如下

import torchvision
from torchvision import transforms, utils
trans = transforms.Compose([transforms.RandomCrop(400), transforms.ToTensor()])
dataset = torchvision.datasets.ImageFolder('/Users/manmi/Desktop/data/data', transform=trans)
print(dataset.classes) # ['bird', 'cat', 'dog']
print(dataset.class_to_idx) # {'bird': 0, 'cat': 1, 'dog': 2}
print(dataset.imgs) # [('/Users/manmi/Desktop/data/data/bird/bird1.jpeg', 0), ('/Users/manmi/Desktop/data/data/bird/bird2.jpeg', 0), ...]
print(len(dataset)) # 11
print(dataset[0][0].size()) # torch.Size([3, 400, 400])
print(dataset[0][1]) # 0
后补…
ToTensor() 做了三件事:
torchvision.transforms.CenterCrop(size) # 所需裁剪的图片尺寸
from PIL import Image
import matplotlib.pyplot as plt
import torchvision.transforms as transforms
img_src = Image.open('./bird.jpg')
img_1 = transforms.CenterCrop(200)(img_src)
img_2 = transforms.CenterCrop((200, 200))(img_src)
img_3 = transforms.CenterCrop((300, 200))(img_src)
img_4 = transforms.CenterCrop((500, 500))(img_src)
plt.subplot(231)
plt.imshow(img_src)
plt.subplot(232)
plt.imshow(img_1)
plt.subplot(233)
plt.imshow(img_2)
plt.subplot(234)
plt.imshow(img_3)
plt.subplot(235)
plt.imshow(img_4)
plt.show()

以上例子我们可知:
(1)如果切正方形,transforms.CenterCrop(100) 和 transforms.CenterCrop((100, 100)),两种写size的方法,效果一样
(2)如果设置的输出的图片尺寸大于原尺寸,会在边上补黑色
# 依据给定的size随机裁剪
torchvision.transforms.RandomCrop(size,
padding = None,
pad_if_needed = False,
fill=0,
padding_mode ='constant')
功能:
从图片中随机裁剪出尺寸为 size 的图片,如果有 padding,那么先进行 padding,再随机裁剪 size 大小的图片。
参数:
size :所需裁剪的图片尺寸padding: 设置填充大小
pad_if_needed:当图片小于设置的 size,是否填padding_mode:
fill:当 padding_mode 为 constant 时,设置填充的像素值 (默认为0)其他更多的图像变换操作,看这里吧
作用: 用均值和标准差对张量图像进行归一化,
公式:
i
m
a
g
e
=
(
i
m
a
g
e
−
m
e
a
n
)
/
s
t
d
image = (image-mean) / std
image=(image−mean)/std
比如,原像素值的取值区间为 [0, 1],在使用 transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5]) 进行归一化后,原像素值被分布到了 [-1, 1] 区间:
其中 mean 和 std 的3个值分表表示图像的3个通道
如果是单通道的灰度图,可以写成 transforms.Normalize(mean=[0.5], std=[0.5])
我们可能会看到很多代码里面是这样的:
torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
这一组值是怎么来的呢?答案就是通过数据集,提前抽样计算出来的
将 Tensor类型数据转换为图片数据 PILImage, torchvision.transforms.ToPILImage() 函数的作用是把Tensor数据变为完整原始的图片数据(保存后可以直接双击打开的那种)
其内部处理过程为:
一行最多展示8张图片
import torch
import torchvision
from torchvision import transforms, utils
from torch.utils import data
import matplotlib.pyplot as plt
trans = transforms.Compose([transforms.RandomCrop(400), transforms.ToTensor()])
dataset = torchvision.datasets.ImageFolder('./data', transform=trans)
train_loader = data.DataLoader(dataset, batch_size=2, shuffle=True)
for (img, label) in train_loader:
grid = utils.make_grid(img)
plt.imshow(grid.numpy().transpose((1, 2, 0)))
plt.show()
break

torchvision.utils.save_img(img, path)
image 的数据类型是tensor