0


使用Pytorch框架自己制作做数据集进行图像分类(一)

第一章:Pytorch制作自己的数据集实现图像分类

第一章: Pytorch框架制作自己的数据集实现图像分类
第二章: Pytorch框架构建残差神经网络(ResNet)
第三章: Pytorch框架构建DenseNet神经网络


  1. 提示:本文代码,含有部分测试性输出语句,更改数据文件夹路径后可以直接跑通,文章末尾附全部代码

文章目录


前言

网上有很多直接利用已有数据集(如MNIST, CIFAR-10等),直接进行机器学习,图像分类的教程。但如何自己制作数据集,为图像制作相应标签等的教程较少。故写本文,分享一下自己利用Pytorch框架制作数据集的方法技巧。

开发环境:
Pycharm + Python 3.7.9
torch 1.10.2+cu102
torchvision 0.11.3+cu102


  1. 提示:以下是本篇文章正文内容

一、上网搜取相关照片作为数据

在这里插入图片描述
制作了三个文件夹,每个文件夹里面有十张图片,分别是关于云、雨、太阳,所有图片均来自百度图片。
在这里插入图片描述
这是cloud文件夹里面的内容,请注意图片命名格式
在这里插入图片描述
这是rain文件夹里面的内容,请注意图片命名格式
在这里插入图片描述
这是sun文件夹里面的内容,请注意图片命名格式

二、定义自己的数据类并读入图片数据

1.引入相关库

代码如下:

  1. import glob
  2. import torch
  3. from torch.utils import data
  4. from PIL import Image
  5. import numpy as np
  6. from torchvision import transforms
  7. import matplotlib.pyplot as plt

2.继承Dataset实现Mydataset子类

代码如下:

  1. #通过创建data.Dataset子类Mydataset来创建输入classMydataset(data.Dataset):# 类初始化def__init__(self, root):
  2. self.imgs_path = root
  3. # 进行切片def__getitem__(self, index):
  4. img_path = self.imgs_path[index]return img_path
  5. # 返回长度def__len__(self):returnlen(self.imgs_path)

init() 初始化方法,传入数据文件夹路径。
getitem() 切片方法,根据索引下标,获得相应的图片。
len() 计算长度方法,返回整个数据文件夹下所有文件的个数。


3.使用glob方法获取文件夹中所有图片路径

代码如下:

  1. #使用glob方法来获取数据图片的所有路径
  2. all_imgs_path = glob.glob(r'F:\weather\*\*.jpg')#数据文件夹路径,根据实际情况更改!#循环遍历输出列表中的每个元素,显示出每个图片的路径for var in all_imgs_path:print(var)


上图为运行结果部分显示


三、为图片制作标签,并划分训练集与测试集

1.利用自定义类Mydataset创建对象weather_dataset

代码如下:

  1. #利用自定义类Mydataset创建对象weather_dataset
  2. weather_dataset = Mydataset(all_imgs_path)print(len(weather_dataset))#返回文件夹中图片总个数print(weather_dataset[12:15])#切片,显示第12至第十五张图片的路径
  3. wheather_datalodaer = torch.utils.data.DataLoader(weather_dataset, batch_size=5)#每次迭代时返回五个数据print(next(iter(wheather_datalodaer)))


上图为运行结果

2.为每张图片制作相应的标签

代码如下:

  1. species =['cloud','sun','rain']
  2. species_to_id =dict((c, i)for i, c inenumerate(species))print(species_to_id)
  3. id_to_species =dict((v, k)for k, v in species_to_id.items())print(id_to_species)
  4. all_labels =[]#对所有图片路径进行迭代for img in all_imgs_path:# 区分出每个img,应该属于什么类别for i, c inenumerate(species):if c in img:
  5. all_labels.append(i)print(all_labels)#得到所有标签

在这里插入图片描述
上图为运行结果

3.完善Mydataset类,将图片数据转换成Tensor,并展示部分图片与标签对应关系

代码如下:

  1. # 对数据进行转换处理
  2. transform = transforms.Compose([
  3. transforms.Resize((96,96)),#做的第一步转换
  4. transforms.ToTensor()#第二步转换,作用:第一转换成Tensor,第二将图片取值范围转换成0-1之间,第三会将channel置前])classMydatasetpro(data.Dataset):# 类初始化def__init__(self, img_paths, labels, transform):
  5. self.imgs = img_paths
  6. self.labels = labels
  7. self.transforms = transform
  8. # 进行切片def__getitem__(self, index):#根据给出的索引进行切片,并对其进行数据处理转换成Tensor,返回成Tensor
  9. img = self.imgs[index]
  10. label = self.labels[index]
  11. pil_img = Image.open(img)#pip install pillow
  12. data = self.transforms(pil_img)return data, label
  13. # 返回长度def__len__(self):returnlen(self.imgs)
  14. BATCH_SIZE =10
  15. weather_dataset = Mydatasetpro(all_imgs_path, all_labels, transform)
  16. wheather_datalodaer = data.DataLoader(
  17. weather_dataset,
  18. batch_size=BATCH_SIZE,
  19. shuffle=True)
  20. imgs_batch, labels_batch =next(iter(wheather_datalodaer))print(imgs_batch.shape)
  21. plt.figure(figsize=(12,8))for i,(img, label)inenumerate(zip(imgs_batch[:6], labels_batch[:6])):
  22. img = img.permute(1,2,0).numpy()
  23. plt.subplot(2,3, i+1)
  24. plt.title(id_to_species.get(label.item()))
  25. plt.imshow(img)
  26. plt.show()#展示图片

在这里插入图片描述
上图为运行结果


4.划分数据集和测试集

代码如下:

  1. #划分测试集和训练集
  2. index = np.random.permutation(len(all_imgs_path))
  3. all_imgs_path = np.array(all_imgs_path)[index]
  4. all_labels = np.array(all_labels)[index]#80% as train
  5. s =int(len(all_imgs_path)*0.8)print(s)
  6. train_imgs = all_imgs_path[:s]
  7. train_labels = all_labels[:s]
  8. test_imgs = all_imgs_path[s:]
  9. test_labels = all_imgs_path[s:]
  10. train_ds = Mydatasetpro(train_imgs, train_labels, transform)#TrainSet TensorData
  11. test_ds = Mydatasetpro(test_imgs, test_labels, transform)#TestSet TensorData
  12. train_dl = data.DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True)#TrainSet Labels
  13. test_dl = data.DataLoader(test_ds, batch_size=BATCH_SIZE, shuffle=True)#TestSet Labels

至此我们把原数据集的80%作为训练集得到了:
train_ds 训练集数据
test_ds 测试集数据
train_dl 训练集标签
test_dl 测试集标签


总结

整体思路
1.将自己所找图片按照一定的规则命名后,放到文件夹中。
2.使用glob方法获取所有数据文件路径
3.创建DataSet类的子类Mydataset,用于后续通过路径读入数据,并易于后续相应处理操作
4.通过Transforms.Compose()方法,对图片数据进行统一处理,并转换成Tensor格式
5.创建Mydatasetpro类,调用相关方法,获得{‘图片名’:标签}和{标签:‘图片名’}字典
6.统计索引数量,按照百分比,划分出训练集和测试集
最后得到:训练集数据、测试集数据、训练集标签、测试集标签

本文代码

  1. import glob
  2. import torch
  3. from torch.utils import data
  4. from PIL import Image
  5. import numpy as np
  6. from torchvision import transforms
  7. import matplotlib.pyplot as plt
  8. #通过创建data.Dataset子类Mydataset来创建输入classMydataset(data.Dataset):# 类初始化def__init__(self, root):
  9. self.imgs_path = root
  10. # 进行切片def__getitem__(self, index):
  11. img_path = self.imgs_path[index]return img_path
  12. # 返回长度def__len__(self):returnlen(self.imgs_path)#使用glob方法来获取数据图片的所有路径
  13. all_imgs_path = glob.glob(r'F:\weather\*\*.jpg')#循环遍历输出列表中的每个元素,显示出每个图片的路径for var in all_imgs_path:print(var)#利用自定义类Mydataset创建对象weather_dataset
  14. weather_dataset = Mydataset(all_imgs_path)print(len(weather_dataset))#返回文件夹中图片总个数print(weather_dataset[12:14])#切片,显示第12张、第十三张图片,python左闭右开
  15. wheather_datalodaer = torch.utils.data.DataLoader(weather_dataset, batch_size=3)#每次迭代时返回五个数据print(next(iter(wheather_datalodaer)))
  16. species =['cloud','sun','rain']
  17. species_to_id =dict((c, i)for i, c inenumerate(species))print(species_to_id)
  18. id_to_species =dict((v, k)for k, v in species_to_id.items())print(id_to_species)
  19. all_labels =[]#对所有图片路径进行迭代for img in all_imgs_path:# 区分出每个img,应该属于什么类别for i, c inenumerate(species):if c in img:
  20. all_labels.append(i)print(all_labels)#得到所有标签# 对数据进行转换处理
  21. transform = transforms.Compose([
  22. transforms.Resize((96,96)),#做的第一步转换
  23. transforms.ToTensor()#第二步转换,作用:第一转换成Tensor,第二将图片取值范围转换成0-1之间,第三会将channel置前])classMydatasetpro(data.Dataset):# 类初始化def__init__(self, img_paths, labels, transform):
  24. self.imgs = img_paths
  25. self.labels = labels
  26. self.transforms = transform
  27. # 进行切片def__getitem__(self, index):#根据给出的索引进行切片,并对其进行数据处理转换成Tensor,返回成Tensor
  28. img = self.imgs[index]
  29. label = self.labels[index]
  30. pil_img = Image.open(img)#pip install pillow
  31. data = self.transforms(pil_img)return data, label
  32. # 返回长度def__len__(self):returnlen(self.imgs)
  33. BATCH_SIZE =10
  34. weather_dataset = Mydatasetpro(all_imgs_path, all_labels, transform)
  35. wheather_datalodaer = data.DataLoader(
  36. weather_dataset,
  37. batch_size=BATCH_SIZE,
  38. shuffle=True)
  39. imgs_batch, labels_batch =next(iter(wheather_datalodaer))print(imgs_batch.shape)
  40. plt.figure(figsize=(12,8))for i,(img, label)inenumerate(zip(imgs_batch[:6], labels_batch[:6])):
  41. img = img.permute(1,2,0).numpy()
  42. plt.subplot(2,3, i+1)
  43. plt.title(id_to_species.get(label.item()))
  44. plt.imshow(img)
  45. plt.show()#划分测试集和训练集
  46. index = np.random.permutation(len(all_imgs_path))
  47. all_imgs_path = np.array(all_imgs_path)[index]
  48. all_labels = np.array(all_labels)[index]#80% as train
  49. s =int(len(all_imgs_path)*0.8)print(s)
  50. train_imgs = all_imgs_path[:s]
  51. train_labels = all_labels[:s]
  52. test_imgs = all_imgs_path[s:]
  53. test_labels = all_labels[s:]
  54. train_ds = Mydatasetpro(train_imgs, train_labels, transform)#TrainSet TensorData
  55. test_ds = Mydatasetpro(test_imgs, test_labels, transform)#TestSet TensorData
  56. train_dl = data.DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True)#TrainSet Labels
  57. test_dl = data.DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True)#TestSet Labels

本文转载自: https://blog.csdn.net/zwy_697198/article/details/123561769
版权归原作者 张_哈哈 所有, 如有侵权,请联系我们删除。

“使用Pytorch框架自己制作做数据集进行图像分类(一)”的评论:

还没有评论