1.Torchvision

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()

autoaugment

谷歌在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

你可能感兴趣的:(2,卷积神经网络图像分类,pytorch)