深度学习图像处理(一)
深度学习处理图像的方式和传统图像处理有着本质的不同。传统图像是直观的,可解释的,而深度学习并未做到那么的可解释性。哈工大的倪院士说过,深度学习最大的挑战在于其难以用一个数学公式进行描述,而正因为其中的特性导致了其黑匣子特性。本篇将分为三部分进行解说即:数据处理部分、模型部分、优化部分。同时本篇将使用pytorch1.10.1及python3.9在windos上进行开发。数据处理部分a、依赖的模块:
·
深度学习处理图像的方式和传统图像处理有着本质的不同。传统图像是直观的,可解释的,而深度学习并未做到那么的可解释性。哈工大的倪院士说过,深度学习最大的挑战在于其难以用一个数学公式进行描述,而正因为其中的特性导致了其黑匣子特性。
本篇将分为三部分进行解说即:数据处理部分、模型部分、优化部分。同时本篇将使用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 | 用均值和标准差归一化张量图像 |
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 | 随机改变图像的亮度对比度和饱和度 |
更多推荐
已为社区贡献2条内容
所有评论(0)