深度学习处理图像的方式和传统图像处理有着本质的不同。传统图像是直观的,可解释的,而深度学习并未做到那么的可解释性。哈工大的倪院士说过,深度学习最大的挑战在于其难以用一个数学公式进行描述,而正因为其中的特性导致了其黑匣子特性。
本篇将分为三部分进行解说即:数据处理部分、模型部分、优化部分。同时本篇将使用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):
def __init__(self, root_dir, transform=None):
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):
image_index = self.images[index]
img_path = os.path.join(self.root_dir, image_index)
img = cv2.imread(img_path)
label = img_path.split('\\')[-1].split('.')[
0]
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)
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):
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(),
]))
dataloader = DataLoader(train_dataset, batch_size=128, shuffle=True,pin_memory=True)
有何不同? 除了方便,不容易出错没啥不同的 ~== ~
函数名 | 作用 |
---|
Resize | 把给定的图片resize到given size | Normalize | 用均值和标准差归一化张量图像 | ToTensor | convert 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图像裁剪成任意大小和纵横比 | ToPILImage | convert a tensor to PIL image | RandomHorizontalFlip | 以0.5的概率水平翻转给定的PIL图像 | RandomVerticalFlip | 以0.5的概率竖直翻转给定的PIL图像 | Grayscale | 将图像转换为灰度图像 | RandomGrayscale | 将图像以一定的概率转换为灰度图像 | ColorJitter | 随机改变图像的亮度对比度和饱和度 |
|