深度学习处理图像的方式和传统图像处理有着本质的不同。传统图像是直观的,可解释的,而深度学习并未做到那么的可解释性。哈工大的倪院士说过,深度学习最大的挑战在于其难以用一个数学公式进行描述,而正因为其中的特性导致了其黑匣子特性。

本篇将分为三部分进行解说即:数据处理部分、模型部分、优化部分。同时本篇将使用pytorch1.10.1及python3.9在windos上进行开发。

数据处理部分

a、依赖模块:

from torch.utils.data import DataLoader, Dataset
import matplotlib.pyplot as plt
import os
import cv2
import torch
from torchvision import transforms
import numpy as np

b、获取数据集的每张图片的标签及数据

class GetDataPath(Dataset):  # 继承Dataset
    def __init__(self, root_dir, transform=None):  # __init__是初始化该类的一些基础参数
        self.root_dir = root_dir  # 文件目录
        self.transform = transform  # 变换
        self.images = os.listdir(self.root_dir)  # 目录里的所有文件

    def __len__(self):  # 返回整个数据集的大小
        return len(self.images)

    def __getitem__(self, index):  # 根据索引index返回dataset[index]
        image_index = self.images[index]  # 根据索引index获取该图片
        img_path = os.path.join(self.root_dir, image_index)  # 获取索引为index的图片的路径名
        #img = io.imread(img_path)  # 读取该图片
        img = cv2.imread(img_path)
        label = img_path.split('\\')[-1].split('.')[
            0]  # 根据该图片的路径名获取该图片的label,具体根据路径名进行分割。我这里是"E:\\Python Project\\Pytorch\\dogs-vs-cats\\train\\cat.0.jpg",所以先用"\\"分割,选取最后一个为['cat.0.jpg'],然后使用"."分割,选取[cat]作为该图片的标签
        sample = [img,label]
        if self.transform:
            sample = self.transform(sample)  # 对样本进行变换
        return sample  # 返回该样本

c、测试上述类

data = GetDataPath('D:/DataSet/smallChip',transform=None)#初始化类,设置数据集所在路径以及变换
dataloader = DataLoader(data,batch_size=128,shuffle=True)#使用DataLoader加载数据
for batch_index, (images, labels) in enumerate(training_data):
    print(batch_index)
    print(images.size())
    print(labels)

注意:如果处理数据的时候没注意,采用了英文命名的方式的话要将label映射成int型的数据,然后将其由list转换为tensor

d、数据加载

data = GetDataPath('D:/DataSet/smallChip', transform= None)  # 初始化类,设置数据集所在路径以及变换
training_data = DataLoader(data,shuffle=True, num_workers=2, batch_size=1)

这里可能需要将图像数据由byte转换为float

    for batch_index, (images, labels) in enumerate(training_data):
        #print(images.size())
        images = images.permute(0,3,1,2)
        images = images.float()

是不是觉得自己写类很麻烦,而且容易出错?

pytorch自带方法:

import torchvision.datasets as datasets
train_dataset = datasets.ImageFolder(
        'D:/DataSet/PythonTrainingData/SmaillChip',
        transforms.Compose([
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            #transforms.RandomSizedCrop(1024),
        ]))
dataloader = DataLoader(train_dataset, batch_size=128, shuffle=True,pin_memory=True)  # 使用DataLoader加载数据

有何不同?
除了方便,不容易出错没啥不同的 ~== ~

函数名作用
Resize把给定的图片resize到given size
Normalize用均值和标准差归一化张量图像
ToTensorconvert a PIL image to tensor (HWC) in range [0,255] to a torch.Tensor(CHW) in the range [0.0,1.0]
CenterCrop在图片的中间区域进行裁剪
RandomCrop在一个随机的位置进行裁剪
FiceCrop把图像裁剪为四个角和一个中心
RandomResizedCrop将PIL图像裁剪成任意大小和纵横比
ToPILImageconvert a tensor to PIL image
RandomHorizontalFlip以0.5的概率水平翻转给定的PIL图像
RandomVerticalFlip以0.5的概率竖直翻转给定的PIL图像
Grayscale将图像转换为灰度图像
RandomGrayscale将图像以一定的概率转换为灰度图像
ColorJitter随机改变图像的亮度对比度和饱和度
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐