Pytorch深入浅出(二)之数据预处理Transforms(中)

Transforms V1的各种操作

Transforms V1文档
与前面笔记同样的,以树叶分类竞赛数据集为例,下面代码写了一个函数,并可视化变换操作后的结果

import torch
import numpy as np
import pandas as pd
import math
import os
from torch.utils.data import Dataset
from matplotlib import pyplot as plt
from sklearn.preprocessing import LabelEncoder
from PIL import Image
from torchvision import transforms
# 定义设备(优先使用GPU,如果没有则使用CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")

class CustomDataset(Dataset):
    def __init__(self, data_dir, data_transform=None):
        self.data = pd.read_csv(data_dir)
        self.transform = data_transform
        self.data['label'] = LabelEncoder().fit_transform(self.data['label'])
    def __len__(self):
        return len(self.data)
    def __getitem__(self, index):
        image_path = 'D:/tmp/A-TMP/models/classify-leaves/'+self.data.iloc[index]['image']
        label = self.data.iloc[index]['label']
        image = Image.open(image_path).convert('RGB')
        if self.transform:
            image = self.transforms(image)
        return image, label
        
train_csv_file = 'D:/tmp\A-tmp\models\classify-leaves/train.csv'
eg_dataset = CustomDataset(train_csv_file, data_transform=None)

def show_transforms(trans_operation, seed=None):
    if seed is not None:
        np.random.seed(seed)
    # 随机挑一张
    idx = np.random.randint(0, len(eg_dataset))
  
    image_raw, _ = eg_dataset[idx]
    image_trans = trans_operation(image_raw)
  
    # 画图对比
    plt.figure(figsize=(6,2))
    plt.subplot(1,2,1)
    plt.imshow(image_raw)
    plt.title("image_raw")
    plt.axis('off')
  
    plt.subplot(1,2,2)
    plt.imshow(image_trans)
    plt.title(f"{trans_operation.__class__.__name__}{getattr(trans_operation, 'degrees', '')}")
    plt.axis('off')
    plt.tight_layout()
    plt.show()
    
# 可以是下面任何一种变换
show_transforms(transforms.RandomCrop(100), seed=42)
几何变换
Resize(size[, interpolation, max_size, …])将输入图像调整为给定大小。
RandomCrop(size[, padding, pad_if_needed, …])从随机位置裁剪给定图像。
RandomResizedCrop(size[, scale, ratio, …])随机裁剪图像的一部分并将其调整为给定大小。
CenterCrop(size)从中心裁剪给定图像。
FiveCrop(size)将给定图像裁剪为四个角和中心裁剪。
TenCrop(size[, vertical_flip])将给定图像裁剪为四个角和中心裁剪,外加这些的翻转版本(默认使用水平翻转)。
Pad(padding[, fill, padding_mode])在所有边上用给定的“填充”值填充给定图像。
RandomRotation(degrees[, interpolation, …])按角度旋转图像。
RandomAffine(degrees[, translate, scale, …])保持中心不变的图像随机仿射变换。
RandomPerspective([distortion_scale, p, …])以给定的概率对给定图像执行随机透视变换。
ElasticTransform([alpha, sigma, …])使用弹性变换转换张量图像。
RandomHorizontalFlip([p])以给定的概率随机水平翻转给定图像。
RandomVerticalFlip([p])以给定的概率随机垂直翻转给定图像。
颜色变换
ColorJitter([brightness, contrast, …])随机改变图像的亮度、对比度、饱和度和色调。
Grayscale([num_output_channels])将图像转换为灰度。
RandomGrayscale([p])以给定的概率(默认为 0.1)随机将图像转换为灰度。
GaussianBlur(kernel_size[, sigma])使用随机选择的高斯模糊模糊图像。
RandomInvert([p])以给定的概率随机反转给定图像的颜色。
RandomPosterize(bits[, p])通过在给定概率下随机地减少每个颜色通道的比特数来实现图像的色调分离。
RandomSolarize(threshold[, p])通过在给定概率下随机地反转高于阈值的所有像素值来对图像进行曝光处理。
RandomAdjustSharpness(sharpness_factor[, p])通过在给定概率下随机地调整图像的锐度。
RandomAutocontrast([p])通过在给定概率下随机地自动调整给定图像的像素对比度。
RandomEqualize([p])通过在给定概率下随机地均衡给定图像的直方图。
转换
ToPILImage([mode])将张量或 ndarray 转换为 PIL 图像
ToTensor()将 PIL 图像或 ndarray 转换为张量并相应地缩放值。
PILToTensor()将 PIL Image 转换为相同类型的张量 - 此操作不缩放值。
ConvertImageDtype(dtype)将张量图像转换为指定的dtype并相应地缩放值。
杂项
LinearTransformation(transformation_matrix, …)使用离线计算的方阵变换矩阵和均值向量转换张量图像。
Normalize(mean, std[, inplace])使用均值和标准差对张量图像进行归一化。
RandomErasing([p, scale, ratio, value, inplace])随机选择torch.Tensor图像中的一个矩形区域并擦除其像素。
Lambda(lambd)将用户定义的lambda函数作为变换应用。
组合变换
Compose(transforms)将多个转换组合在一起。
RandomApply(transforms[, p])以给定的概率随机应用一系列变换。
RandomChoice(transforms[, p])随机从列表中选择一个转换并应用。
RandomOrder(transforms)以随机顺序应用一系列转换。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值