图像数据处理

首先先os.walk()方法读取图像集标签与路径到列表,参考:https://blog.csdn.net/qq_42891453/article/details/120064862?spm=1001.2014.3001.5501

然后用LabelEncoder()对特征进行硬编码,参考:https://blog.csdn.net/qq_42891453/article/details/120064685?spm=1001.2014.3001.5501

图像数据初始为RGB三个通道,每个通道的数值都是[0,255]的灰度值

首先transforms.ToTensor()方法可将数据处理成[0,1]之间

在用transforms.Normalize()方法可将数据处理成[-1,1]之间的标准化数据(之所以要处理成标准化数据是为了防止某些数据过大而其余数据都很小时这个过大的数据会对模型带来很大的影响,但其实每个数据都需要对模型产生影响,所以要先标准化)

在使用imagenet数据集时会看到transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])//其中[0.485, 0.456, 0.406]代表的是三个通道的mean也就是均值, [0.229, 0.224, 0.225]为三个通道的方差,这六个数值是提前算出来的。

例:

data_transforms = {
    'train': transforms.Compose([
        transforms.ToPILImage(),
        transforms.Resize(256),
        transforms.RandomCrop(224),
        transforms.RandomHorizontalFlip(),  # 水平镜像
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],  # 用平均值和标准偏差归一化张量图像
                             [0.229, 0.224, 0.225])  # input = (input - mean) / std
    ]),
    'val': transforms.Compose([
        transforms.ToPILImage(),
        transforms.Resize(256),
        transforms.CenterCrop(224),  # 测试只需要从中间裁剪
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],  # mean
                             [0.229, 0.224, 0.225])  # std
    ]),
}

前面为数据增强,然后处理成标准化数据。其中,训练要做数据增强和数据标准化。而验证数据只需要裁剪成训练数据的尺寸而无需增强,因为这样才能保证评估的准确性。

定义好预处理操作之后,接下来,首先将数据按照 4:1 的比例分成训练集和验证集,直接使用大家熟悉的 train_test_split 函数。

from sklearn.model_selection import train_test_split

train_path, val_path, train_label, val_label = train_test_split(
    data_path, data_label, test_size=0.2)

重写torch.utils.data.Dataset抽象类使其在 __getitem__ 则用于读取图片,并返回图片数据和标签,__len__: 返回数据集的大小:

from torch.utils.data import Dataset

class DogcatDataset(Dataset):

    def __init__(self, data_path, data_label, transform=None):
        """
        - data_path (string): 图片路径
        - data_label (string): 图片标签
        - transform (callable, optional): 作用在每个样本上的预处理函数
        """
        self.data_path = data_path
        self.data_label = data_label
        self.transform = transform

    def __len__(self):
        return len(self.data_path)

    def __getitem__(self, idx):
        img_path = self.data_path[idx]
        image = io.imread(img_path)
        label = self.data_label[idx]

        # 如果有,则对数据预处理
        if self.transform:
            image = self.transform(image)

        return image, label

初始化我么需要的dataset:

# 初始化训练数据集
train_dataset = DogcatDataset(train_path, train_label,
                              data_transforms['train'])
# 初始化测试数据集
val_dataset = DogcatDataset(val_path, val_label,
                            data_transforms['val'])

 torch.utils.data.DataLoader构建数据加载器:

import torch

# 训练数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset,
                                           batch_size=64, shuffle=True)
# 验证数据加载器
val_loader = torch.utils.data.DataLoader(val_dataset,
                                         batch_size=64, shuffle=False)

train_loader, val_loader

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值