【深度学习记录5关于数据集的一些操作】


在pytorch中,涉及到数据读取的一共是两个类

  • dataset
  • dataloader

原视频链接

https://www.bilibili.com/video/BV1hE411t7RN/?p=7&spm_id_from=pageDriver&vd_source=6ac3bbb51b128afc32872c13025c1b3d

dataset

dataset类是提供一种方法去获取数据并且获取lable。

因为神经网络可能要对数据进行多次迭代,只有知道了总共有多少的数据才能知道训练的时候训练多少次才能吧整个数据集迭代完。

dataloader

为后面的网络提供不同的数据形式

实操前的准备——数据集

首先先下载一个蜜蜂的数据集
https://download.pytorch.org/tutorial/hymenoptera_data.zip

这个数据集的结构是:
hymenoptera_data → train 文件夹 →ants 文件夹
→bees 文件夹
→ val 文件夹 →ants 文件夹
→bees 文件夹
在这个数据集中,ants和bees就相当于labels

还有其他的组织形式,比如单独文件夹存放图片,单独文件夹存放标签.txt文件
还有其他的组织形式,比如以labels标签来命名图片。

①关于数据的操作

Dataset 在torch.utils.data里
help(Dataset)或者Dataset?? 来在系统中找到对Dataset的解释。

不懂一个函数作用时查询操作

from torch.utils.data import Dataset
help(Dataset)
Dataset??

在这里插入图片描述

下面我们要写一个类,命名为MyData,令它继承Dataset
首先初始化,初始化的意思是,在根据这个类进行实例的时候需要运行的一个函数。这个函数一般为这个新建的Class提供一个全局变量

将数据集的数据和标签读取存储到变量中,以供后续操作

在此过程中我们需要使用到一个类——Python图像库PIL的类Image

from torch.utils.data import Dataset
from PIL import Image
import cv2
class MyData(Dataset):#创建一个新的类名为MyData,继承Dataset类
    def __init__(self): #我们每创建一次对象,系统会自动为我们调用一次 __init__ 构造方法。;
    #Python 的 __init__ 函数,第一个参数是固定的 self,其他参数可以有 0 个或者任意多个,如果,我们在 __init__ 方法里设置了参数,那么我们在实例化类对象的时候,必须要传入相对应的参数。
    #简单介绍构造函数的网址如下:https://haicoder.net/python/python-init.html

    def __getitem__(self, index):

上传数据集到我们的项目文件夹里
下面让我们一起在pycharm console中运行程序


from PIL import Image  

img_path="F:\\Python folders\\learn pytorch\\dataset\\train\\ants\\5650366_e22b7e1065.jpg"   #复制过来是这样的:F:\Python folders\learn pytorch\dataset\train\ants\5650366_e22b7e1065.jpg,但是在Windows中复制完路径要把一个\改成两个\\,以此来表示转义

img=Image.open(img_path)#读取一个图片
img.show()#显示一个图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/1685b19379b04144a17d41ad1f7ff7f1.png
在这里插入图片描述

获取所有图片的地址列表(文件名其实就是)–init–

这里需要用到库os

import os
dir_path="dataset/train/ants" #定义文件的地址
img_path_list=os.listdir(dir_path) #listdir将路径为dir_path变量所指向的dir文件夹下的所有东西变成一个list列表
img_path_list[0]#检验一下第一个图片的名称

在这里插入图片描述
如果我们想要通过idx来获得相对应的图片的话,我们首先需要创建包含这个图片地址的列表。

 def __init__(self,root_dir,label_dir):
pycharm console操作台上:
import os
root_dir="dataset/train"
 	label_dir="ants"
 	path=os.path.join(root_dir,label_dir)
 #root_dir:需要将其设置为你想要的结果文件夹的父文件夹路径。根据我们下载的数据集,标签lable就是我们图片对应上一级的名称
#path =os.path.join(root_dir,label_dir)是用os的这个函数把两个地址拼接起来,因为是Windows系统,所以可以看到后面是两个\\
 def __init__(self,root_dir,label_dir):
 	self.root_dir=root_dir
 	self.label_dir=label_dir
 	self.path=os.path.join(self.root_dir,self.label_dir)
 	self.img_path=os.listdir(self.path)
 	#listdir将路径为括号内参数变量所指向的dir文件夹下的所有东西变成一个list列表,也就是说括号内应该是一个地址
 	#这样我们就获得了该ants文件夹中所有图片文件的名字

验证:

pycharm console操作台上继续刚才的写:
img_path=os.listdir(path)

在这里插入图片描述

获取某一个图片的地址名称(文件名其实就是)–getitem–

def __getitem__(self, idx):
	img_name=self.img_path[idx]	
	img_item_path=os.path.join(self.root_dir,self.label_dir,img_name)
	img=Image.open(img_item_path)
	label=self.label_dir
     return img,label

#关于getitem方法
#使用场景:在定义类时,如果希望能按照键取类的值,则需要定义__getitem__方法
#目的:如果给类定义了__getitem__方法,则当按照键取值时,可以直接返回__getitem__方法执行的结果。

在console里验证:

idx=0
img_name=img_path[idx]

在这里插入图片描述

在这里插入图片描述

获取一个数据集有多长–len–

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

创建一个蜜蜂实例

bees_label_dir="bees"
bees_dataset=MyData(root_dir,bees_label_dir)

在这里插入图片描述

train_dataset=ants_dataset+bees_dataset#两个数据的集合,此操作用于当我们数据集很小的时候 
len(ants_dataset)
len(bees_dataset)
len(train_dataset)

img,label=train_dataset[123]
img.show()

在这里插入图片描述

①中的全部代码

from torch.utils.data import Dataset
from PIL import Image
import os
import cv2
class MyData(Dataset):#创建一个新的类名为MyData,继承Dataset类
    def __init__(self,root_dir,label_dir):
        self.root_dir = root_dir
        self.label_dir = label_dir
        self.path = os.path.join(self.root_dir, self.label_dir)
        self.img_path = os.listdir(self.path)

    def __getitem__(self, idx):
        img_name = self.img_path[idx]
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        img = Image.open(img_item_path)
        label=self.label_dir
        return img,label
    def __len__(self):
        return len(self.img_path)


root_dir="dataset/train"
ants_label_dir="ants"
bees_label_dir="bees"
ants_dataset=MyData(root_dir,ants_label_dir)
bees_dataset=MyData(root_dir,bees_label_dir)
train_dataset=ants_dataset+bees_dataset
len(ants_dataset)
len(bees_dataset)
len(train_dataset)

②生成数据集对应的标签文件(TXT文件内是对应照片的分类label)

import os
root_dir="dataset/train"
target_dir="ants_image"
img_path=os.listdir(os.path.join(root_dir,target_dir))
label=target_dir.split('_')[0]
out_dir="ants_label"
for i in img_path:
	file_name=i.split('.jpg')[0]
	with open(os.path.join(root_dir,out_dir,"{}.txt".format(file_name)),'w') as f:
		f.write(label)

在这里插入图片描述

作用是生成这个数据集对应的label文件,文件是由n个TXT文件构成的(n等于数据集的照片数量),每个TXT文件对应一张照片,TXT文件的内容是这个照片对应的label分类,TXT的名称是照片的名称。
运行过程是这样的

运行结果是在对应的label文件中生成的每个照片对应的TXT文件。
在这里插入图片描述

Pip安装包过程中遇到的问题以及解决方法:

解决方法链接:https://blog.csdn.net/qq_43665602/article/details/126249631

①在用pycharm下载CV2包的时候发现terminal没有办法识别PIP

在这里插入图片描述
解决方法是打开setting,找到terminal选项,讲路径替换为cmd.exe
重启pycharm
在terminal中cd 环境所在的Scripts文件夹地址
在这里插入图片描述
在这里插入图片描述

②终端出现’conda/activate’ 不是内部或外部命令,也不是可运行的程序 或批处理文件

将Anaconda的conda.bat路径添加到环境变量Path中
在这里插入图片描述
在这里插入图片描述
然后打开pycharm terminal,激活环境就可以使用了,可以看到前面有虚拟环境的名字。
在这里插入图片描述

解决问题链接:
https://blog.csdn.net/qq_43665602/article/details/126249631

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值