Torchvision
from torchvision import models
from torchvision import datasets
from torchvision import ops
from torchvision import transforms
from torchvision import utils
from torchvision import io
Torchvision.datasets
支持下载/加载的数据集有几十种。每一个数据对应一个py文件,并且有相似的下载和载方法。
下载/载入CIFAR10数据集
# root 下载或载入路径
# train=True 载入训练集,False是验证集
# download=True 是否下载
# transform=transform对数据做处理
# target_transform=transform多标签进行处理,一般是分割和检测使用
train_set = torchvision.datasets.CIFAR10(
root='./data', train=True, download=True, transform=transform)
Torchvision.models
提供各种模型定义,包括图像分类如AlexNet、VGG等;对象检测如Faster R-CNN、Mask R-CNN等;分割、关键点检测等。
from .alexnet import *
from .resnet import *
from .vgg import *
from .squeezenet import *
from .inception import *
from .densenet import *
from .googlenet import *
from .mobilenet import *
from .mnasnet import *
from .shufflenetv2 import *
from . import segmentation
from . import detection
from . import video
from . import quantization
使用模型
from torchvision import models
net = models.alexnet(pretrained=True)
Torchvision.ops
实现特定于计算机视觉的操作,如RoI(Region of Interest) Align、RoI(Region of Interest) Pool等。
Torchvision.transforms
实现图像变换。大多数转换同时接受PIL图像和tensor图像,尽管有些转换仅适用于PIL,有些则仅适用于tensor。接受tensor图像的转换也接受批量的tensor图像。tensor图像是具有(C, H, W)形状的tensor。 包含数据变换和数据增强
from .transforms import *
from .autoaugment import *
transforms
transforms | 作用 |
---|
ToTensor | Convert a PIL Image or numpy.ndarray to tensor. This transform does not support torchscript. ==并且像素范围从[0, 255] 变换到[0, 1] == | ConvertImageDtype | 将张量图像转换为给定的 dtype 并相应地缩放值。一个参数dtype | ToPILImage | Convert a tensor or an ndarray to PIL Image. This transform does not support torchscript. 一个参数mode 模式,具体再查询 | Normalize | 用均值和标准差对张量图像进行归一化。不支持 PIL Image。 Args:mean (sequence): Sequence of means for each channel. std (sequence): Sequence of standard deviations for each channel. inplace(bool,optional): Bool to make this operation in-place. | Resize | Resize the input image to the given size. 参数:size:缩放的图像尺度(,);interpolation:插值方法;max_size 调整后图像的较长边缘允许的最大值;antialias:很少用到 | CenterCrop | 在中心裁剪给定的图像 ,参数:size (sequence or int) | Pad | 用给定的“pad”值填充给定图像的所有侧面。padding (int or sequence) | Lambda | 应用用户定义的 lambda 作为转换。此转换不支持 torchscript。 | RandomTransforms | 具有随机性的变换列表的基类 | RandomApply | 以给定的概率随机应用一系列变换。 | RandomOrder | 以随机顺序应用转换列表。此转换不支持 torchscript。 | RandomChoice | 应用从列表中随机选择的单个转换。此转换不支持 torchscript | RandomCrop | 在随机位置裁剪给定图像。 | RandomHorizontalFlip | 以给定的概率随机水平翻转给定的图像。 | RandomVerticalFlip | 以给定的概率随机垂直翻转给定的图像。 | RandomPerspective | 以给定的概率对给定图像执行随机透视变换。 | RandomResizedCrop | 裁剪图像的随机部分并将其调整为给定大小。 | FiveCrop | 将给定的图像裁剪成四个角和中央裁剪。 | TenCrop | 将给定的图像裁剪成四个角,中央裁剪加上这些的翻转版本(默认使用水平翻转) | LinearTransformation | 使用平方变换矩阵和离线计算的 mean_vector 变换张量图像。 | ColorJitter | 随机改变图像的亮度、对比度、饱和度和色调 | RandomRotation | 按角度旋转图像。 | RandomAffine | 图像保持中心不变的随机仿射变换。 | Grayscale | 将图像转换为灰度 | RandomGrayscale | 以 p 的概率(默认 0.1)随机将图像转换为灰度。 | RandomErasing | 在torch张量图像中随机选择一个矩形区域并擦除其像素。 | GaussianBlur | 使用随机选择的高斯模糊来模糊图像。 | RandomInvert | 以给定的概率随机反转给定图像的颜色 | RandomPosterize | 通过减少每个颜色通道的位数,以给定的概率随机对图像进行后处理。 | RandomSolarize | 通过反转高于阈值的所有像素值,以给定概率随机曝光图像 | RandomAdjustSharpness | 以给定的概率随机调整图像的清晰度。如果图像是 Torch Tensor,它应该具有 […, 1 or 3, H, W] 形状,其中 … 表示任意数量的前导维度。 | RandomAutocontrast | 以给定的概率随机自动对比给定图像的像素。 | RandomEqualize | 以给定的概率随机均衡给定图像的直方图。 |
from torchvision import transforms
from PIL import Image
# 如何使用transforms
# 为什么需要tensor数据
img = Image.open("data/test.png")
# 转换为tnesor
img_tensor = transforms.ToTensor()(img)
# 因为ToTensor类中构造了__call__(self, pic)方法,可以将类的实例当作方法,座椅ToTensor()是类实例,然后调用__call__(img)
# normalize 归一化,
img_normalize = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])(img_tensor) # (mean, std)因为图片三个通道,对每一个通道归一化
# 因为 Normalize函数的forward函数的return F.normalize(),返回的是一个函数,所以后面有(img_tensor)
# output[channel] = (input[channel] - mean[channel]) / std[channel]
# resize更改尺寸 输入PIL类型,返回的也是PIL类型, 输入的是tensor类型返回的也是tensor类型
img_resize = transforms.Resize((512, 512))(img)
# 随机裁剪
img_random_crop = transforms.RandomCrop(512, 512)(img)
# 组合处理, 注意[]列表里的方法输入输出的类型要对应.
trans_compose = transforms.Compose([
transforms.Resize(512), # 正方形
transforms.ToTensor()
])(img)
# 不知道返回类型的时候可以print(type())
import os
import torch
from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
import torchvision
'''
torchvision.transforms是pytorch中的图像预处理包(图像变换),
一般用Compose把多个步骤整合到一起signal_trans
signal_trans: signal_trans
'''
def signal_trans():
# 实例化transforms对象,用Compose整合多个操作
data_transform = transforms.Compose(
[transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])
# load image
img_path = "../data/1.png"
assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path)
img = Image.open(img_path)
print("图片的size:{}".format(img.size))
plt.imshow(img)
plt.title("tulip")
plt.show()
# [C, H, W]
img = data_transform(img)
print("转换后的图片size:{}".format(img.size()))
print("转换后的图片类型:{}".format(img.type()))
img = torch.unsqueeze(img, dim=0)# expand batch dimension [N, C, H, W]
print("增加图片维度后的size:{}".format(img.size()))
def multi_trans():
data_transform = {
"train": transforms.Compose([transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])]),
"val": transforms.Compose([transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])}
# 实例化官方训练数据集 ,第一次使用时要将download设置为True才会自动去下载数据集
train_set = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=data_transform["train"])
val_set = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=data_transform["val"])
# # 实例化自己的训练数据集
# train_dataset = MyDataSet(images_path=train_images_path,
# images_class=train_images_label,
# transform=data_transform["train"])
#
# # 实例化验证数据集
# val_dataset = MyDataSet(images_path=val_images_path,
# images_class=val_images_label,
# transform=data_transform["val"])
if __name__ == '__main__':
signal_trans()
multi_trans()
谷歌在2018年提出通过AutoML来自动搜索数据增强策略,称之为AutoAugment(算是自动数据增强开山之作)。搜索方法采用强化学习,和NAS类似,只不过搜索空间是数据增强策略,而不是网络架构。在搜索空间里,一个policy包含5个sub-policies,每个sub-policy包含两个串行的图像增强操作,每个增强操作有两个超参数:进行该操作的概率和图像增强的幅度(magnitude,这个表示数据增强的强度,比如对于旋转,旋转的角度就是增强幅度,旋转角度越大,增强越大)。每个policy在执行时,首先随机从5个策略中随机选择一个sub-policy,然后序列执行两个图像操作。
from torchvision.transforms import autoaugment, transforms
train_transform = transforms.Compose([
transforms.RandomResizedCrop(crop_size, interpolation=interpolation),
transforms.RandomHorizontalFlip(hflip_prob),
# 这里policy属于torchvision.transforms.autoaugment.AutoAugmentPolicy,
# 对于ImageNet就是 AutoAugmentPolicy.IMAGENET
# 此时aa_policy = autoaugment.AutoAugmentPolicy('imagenet')
autoaugment.AutoAugment(policy=aa_policy, interpolation=interpolation),
transforms.PILToTensor(),
transforms.ConvertImageDtype(torch.float),
transforms.Normalize(mean=mean, std=std)
])
Torchvision.utils
Torchvision.io
提供执行IO操作函数,用于读写视频和图像,输出的是tensor格式。不常用,
# 读写图像: torchvision.io包
img = io.read_image("./data/image/1.png")
print("img shape:", img.shape)
io.write_png(img, "./data/image/result.png")
参考网站
1
https://blog.csdn.net/qq_42244418/article/details/124210655#:~:text=torchvis,%E6%AD%A5%E9%AA%A4%E6%95%B4%E5%90%88%E5%88%B0%E4%B8%80%E8%B5%B7%E3%80%82
|