1. pytorch数据加载Dataset

Dataset类简介

         PyTorch提供了两个数据预处理API: torch.utils.data.DataLoader 和 torch.utils.data。Dataset允许自己使用预加载的数据集和你自己的数据。Dataset 存储了样本及其相应的标签, DataLoader 将 Dataset 的数据包装成 batch, 以便于访问样本。
         我们自己的 Dataset 类必须自己实现这三个函数: __init__, __len__和__getitem__。

import torch
from torch.utils.data import Dataset
import os 
import pandas as pd
from torchvision.io import read_image

class My_dataset(Dataset):
    def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
        super().__init__()
        # 图片存储的文件夹
        self.img_dir = img_dir
        # 图片相关的一些信息, 比如:图片名、目标位置、类别等。
        self.img_lables = pd.read_csv(annotations_file)
        # 图片进行的一些预处理
        self.transform = transform
        # 图片变化后图片的标签同时进行相应的修改
        self.target_transform = target_transform
        
    # 获取样本的数量,读取图片的时候会用到
    def __len__(self):
        return len(self.img_lables)
    
    def __getitem__(self, index):
        # 获取每张图片的路径
        img_path = os.path.join(self.img_dir, self.img_lables[index, 0])
        # 读取图片
        image = read_image(img_path)
        # 图片相应标签的截取
        lable = self.img_lables[index, 1]
        # 是否进行图片的预处理
        if self.transform:
            image = self.transform(image)
        # 是否进行标签的预处理
        if self.target_transform:
            lable = self.target_transform(lable)
        return image, lable

         Dataset 进行简单的数据数据读取, 数据读取完成以后, 使用 transform 对数据进行处理(例如: 数据增强、pad、归一化等), 使其更适合训练。所以 transform 需要重点关注。
         torchvision.transforms 可以经行单个张量图像的变换也接受批量的张量图像。张量图像是一个(C, H, W)形状的张量, 其中C是通道数, H和W是图像的高度和宽度。一批张量图像是一个(B, C, H, W)形状的张量, 其中B是批中图像的个数。pytorch内置的 transforms 可以参考 Transforming and augmenting images
        一般情况我们根据自己的需要实现的数据处理(transform)可以对转换进行更加精细的控制。与 torchvision.transforms 相反, 自己实现的数据处理(transform)的参数不是随机生成的。这意味着必须自己指定或生成所有参数, 所以生成的结果可以再现。

import torchvision.transforms.functional as TF
import random
# 第一种方式
def my_segmentation_transforms(image, segmentation):
    if random.random() > 0.5:
        angle = random.randint(-30, 30)
        image = TF.rotate(image, angle)
        segmentation = TF.rotate(segmentation, angle)
    # more transforms ...
    return image, segmentation
# 第二种方式
class MyRotationTransform:
    """Rotate by one of the given angles."""

    def __init__(self, angles):
        self.angles = angles

    def __call__(self, x):
        angle = random.choice(self.angles)
        return TF.rotate(x, angle)

rotation_transform = MyRotationTransform(angles=[-30, -15, 0, 15, 30])

自定义数据处理常用的函数

         下面的一些函数都是torchvision.transforms.functional下已经实现好的,我们可以根据自己的需求进行编写自己需要的函数。(对标签进行处理和图像一样,不在赘述)

# 调整图像的亮度, 0表示黑色图像,1表示原始图像,而2将亮度增加2倍。
TF.adjust_brightness(img, brightness_factor)
# 调整图像的对比度。0表示纯灰色图像,1表示原始图像,而2将对比度提高2倍。
TF.adjust_contrast (img, contrast_factor)
# 对图像执行gamma校正。大于1的gamma值使阴影变暗,而小于1的gamma使阴影变亮。
# I_out = 255 * gain * (I_in/255)**gamma
TF.adjust_gamma(img, gamma, gain)
# 调整图像的色调。0.5-0.5分别表示HSV空间中色相通道正向和负向完全反转。0表示没有移位。因此,-0.50.5都将给出具有互补色的图像,而0给出原始图像。
TF.adjust_hue(img, hue_factor)
# 调整图像的色彩饱和度。0表示黑白图像,1表示原始图像,2表示将饱和度提高2倍。
TF.adjust_saturation(img, saturation_factor)
# 调整图像的清晰度。0表示模糊图像,1表示原始图像,而2将清晰度提高2倍。
TF.adjust_sharpness(img, sharpness_factor)
# 对图像进行仿射变换,保持图像中心不变。
# angle-旋转角度,在-180180度之间,顺时针方向。
# translate-水平和垂直位移
# scale-总体尺寸
# shear-剪切角值在-180180度之间,顺时针方向。如果指定了序列,第一个值对应于平行于x轴的剪切,第二个值对应于平行于y轴的剪切。
TF.affine(img, angle, translate, scale, shear)
# 通过重新映射每个通道的像素来最大化图像的对比度,以便最低的像素变为黑色,最亮的像素变为白色。
TF.autocontrast(img)
# 在中心裁剪给定的图像。
TF.center_crop(img, output_size)
# 将张量图像转换为给定的dtype并相应地缩放值。此函数不支持PIL图像。
TF.convert_image_dtype(image, dtype)
# 在指定的位置和输出大小裁剪给定的图像
TF.crop(img, top, left, height, width)
# 通过将非线性映射应用于输入来平衡图像的直方图,以便在输出中创建灰度值的均匀分布。
TF.equalize(img)
# 擦除给定值的输入张量图像。(i,j)即左上角坐标
TF.erase(img, i, j, h, w, v, inplace)
# 在原图片的四个角和中心各截取一幅大小为 size 的图片
TF.five_crop(img, size)
# 对图像执行高斯模糊。
TF.gaussian_blur(img, kernel_size, sigma)
# 水平翻转给定的图像。
TF.hflip(img)
# 反转RGB/灰度图像的颜色。
TF.invert(img)
# 用均值和标准差归一化浮点张量图像。
TF.normalize(tensor, mean, std, inplace)
# 用给定的“Pad”值填充给定图像的所有边。
TF.pad(img, padding[, fill, padding_mode])
# 执行给定图像的透视变换。
TF.perspective(img, startpoints, endpoints[, ...])
# 将输入图像的大小调整为给定的大小。
TF.resize(img, size[, interpolation, max_size, ...])
# 裁剪给定的图像并将其调整为所需的大小。
TF.resized_crop(img, top, left, height, width, size)
# 将RGB图像转换为图像的灰度版本。
TF.rgb_to_grayscale(img[, num_output_channels])
# 按角度旋转图像。
TF.rotate(img, angle[, interpolation, expand, ...])
# 垂直翻转给定的图像。
TF.vflip(img)
# 反转高于阈值的所有像素值
TF.solarize(img, threshold)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值